JAVAWEB—— 요청, 요청 라인, 요청 헤더, 요청 본문 가져 오기, 잘못된 코드 체계 제출, 요청 도메인, 전달 및 리디렉션 간의 차이점 해결

1. HttpServletRequest 개요

Servlet을 만들 때 service()메서드 를 재정의합니다 doGet()/doPost().이 메서드에는 두 개의 매개 변수가 있습니다. 하나는 요청을 나타내는 요청이고 다른 하나는 응답을 나타내는 응답입니다.

서비스 메소드의 요청 유형은 ServletRequest이고 doGet / doPost 메소드의 요청 유형은 HttpServletRequest입니다., HttpServletRequest는보다 강력한 기능과 메소드를 가진 ServletRequest의 하위 인터페이스로 오늘은 HttpServletRequest를 배우고 있습니다.

둘째, 패킷 캡처 도구를 통해 HTTP 요청 가져 오기

여기에 사진 설명 삽입
request는 요청을 나타내므로이 객체를 통해 Http 요청을 얻을 수 있습니다.요청 라인요청 헤더요청 본문

셋, 요청을 통해 요청 라인을 가져옵니다.

클라이언트의 요청 방법을 가져옵니다.String getMethod()

요청 된 리소스를 가져옵니다.

  • String getRequestURL()
  • StringBuffer getRequestURL()
  • String getContextPath()---- 웹 애플리케이션의 이름
  • String getQueryString()---- URL 주소를 제출 한 후 매개 변수 문자열을 가져옵니다. username = zhangsan & password = 123

케이스:

				String method = request.getMethod();
				System.out.println("method:"+method);
				//2、获得请求的资源相关的内容
				String requestURI = request.getRequestURI();
				StringBuffer requestURL = request.getRequestURL();
				System.out.println("uri:"+requestURI);
				System.out.println("url:"+requestURL);
				//获得web应用的名称
				String contextPath = request.getContextPath();
				System.out.println("web应用:"+contextPath);
				//地址后的参数的字符串
				String queryString = request.getQueryString();
				System.out.println(queryString);
				//3、获得客户机的信息---获得访问者IP地址
				String remoteAddr = request.getRemoteAddr();
				System.out.println("IP:"+remoteAddr);

결과는 다음과 같습니다.
여기에 사진 설명 삽입
이 주소는 IPV6 주소입니다. 127.0.0.1로 변경하려면 컴퓨터 구성을 수정해야합니다. 로컬 IP를 나타냅니다.

넷, 요청을 통해 요청 헤더 가져 오기

  • long getDateHeader(String name)
  • String getHeader(String name)—— 지정된 헤드 가져 오기
  • Enumeration getHeaderNames()—— 모든 머리의 이름을 얻으십시오
  • Enumeration getHeaders(String name)
  • int getIntHeader(String name)

사례 번호 1 :

새 HeaderServlet을 만들고 다음을 작성하십시오.

//1.获得指定的头,这里是获取USER-Agent也就是用户使用的浏览器
String header = request.getHeader("User-Agent");
System.out.println(header);
//2.获得所有的头的名称
Enumeration<String> headerNames =request.getHeaderNames();
while (headerNames.hasMoreElements()){
    
    
   String headerName =  headerNames.nextElement();
   String headerValue = request.getHeader(headerName);
   System.out.println(headerName+":"+headerValue);

효과는 다음과 같습니다.
여기에 사진 설명 삽입
Case 2 :
form.html에 태그를 추가하면 방문 할 주소는 Case 1에 쓰여진 HeadServlet입니다.

<a href="/HeaderServlet">访问HeaderServlet资源</a>

이 시점에서 우리는 콘솔을 통해 볼 수있는 모든 요청 헤더의 정보를 얻습니다.

여기에 사진 설명 삽입
TIPS의 기능 : 참조 헤더 : 방문 소스 기능 : 안티-리치 링크는 내가 작성한 html을 통해 링크에 액세스하여 다른 사람이 내 링크 된 웹 페이지를 횡령하는 것을 방지 할 수 있음을 의미합니다.

사례 3 :

도난 방지 체인을 마스터하려면 작은 데모를 만드십시오.

첫 번째 단계는 새 news.html을 만들고 Servlet에 액세스하는 것입니다.

body>
       <a href="/RefererServlet">纯手工山楂球</a>
</body>

두 번째 단계는 액세스 체인을 감지하는 것입니다.

public class RefererServlet extends HttpServlet {
    
    
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //对该新闻的来源进行判断
        String Header = request.getHeader("RefererServlet");
		if(Header !=null&&Header.startsWith("http://localhost")){
    
    
   		//从本人网站跳转过去,可以看新闻
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("纯手中山楂球安全可食用");
        }
		else{
    
    
		response.getWriter().write("盗网站者,可耻");
      }
 }

다섯, 요청을 통해 요청 본문을 얻습니다.

요청 본문의 내용이우편으로 제출요청 매개 변수, 형식은 다음과 같습니다.

username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username				[zhangsan]
password				[123]
hobby					[football,basketball]

위의 매개 변수를 예로 들어 다음 메소드를 통해 요청 매개 변수를 얻습니다.

  • String getParameter(String name)
  • String[] getParameterValues(String name)

사례 번호 1 :

1 단계 : 새 양식 만들기

<form action="/ContentServlet" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    爱好:<input type="checkbox" name="hobby" value="zq">足球
         <input type="checkbox" name="hobby" value="pq">排球
         <input type="checkbox" name="hobby" value="ppq">乒乒球
    <input type="submit" value="提交">
</form>

2 단계 : 텍스트 상자에서 각각 단일 값과 여러 값 가져 오기

public class ContentServlet extends HttpServlet {
    
    
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.获得单个表单值
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+"   "+password);
        //2.获得多个表单的值
        String[]hobbys = request.getParameterValues("hobby");
        for (String hobby:hobbys){
    
    
            System.out.println(hobby);
        }
    }
}

효과는 다음과 같습니다.
여기에 사진 설명 삽입

  • Enumeration getParameterNames()(흔하지 않음)
  • Map<String,String[]> getParameterMap()(일반적으로 사용되는)
    참고 : 클라이언트가 서버로 보낸 매개 변수는 모두 문자열입니다.
    사례 2 :

이 시점에서 위의 서블릿 옆에 계속해서 씁니다.

//3.获取所有的请求参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
    
    
    System.out.println(parameterNames.nextElement());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//4.获得所有的参数 参数封装到一个Map<String,String[]>
Map<String,String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String,String[]> entry:parameterMap.entrySet()){
    
    
    System.out.println(entry.getKey());
    for(String str:entry.getValue()){
    
    
        System.out.println(str);
    }
    System.out.println("+++++++++++++++++++++++++++++++++++");
}

효과는 다음과 같습니다.
여기에 사진 설명 삽입

Six, 잘못된 코드를 제출하는 솔루션

  • 풀다제출 후 방법왜곡 된 :
    request.setCharacterEncoding("UTF-8");
  • 풀다제출 방법 가져 오기왜곡됨 :
    parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

일곱, 요청의 다른 기능

  1. 요청은 도메인 개체입니다.
  • setAttribute(String name, Object o)
  • getAttribute(String name)
  • removeAttribute(String name)

참고 : 요청 필드의 범위 : 요청에서

사례 번호 1 :

목적은 요청의 도메인에 익숙하며 Servlet1의 내용에 정보를 저장하고 Servlet2에서 가져옵니다.

첫 번째 단계는 새 Servlet1을 만드는 것입니다.

@WebServlet(name = "Servlet1",urlPatterns
="/Servlet1")
public class Servlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //向request域中存储数据
        request.setAttribute("name","tom");
        RequestDispatcher dispatcher =  request.getRequestDispatcher("/Servlet2");
        //执行转发的方法
        dispatcher.forward(request,response);
    }
}

2 단계 : Servlet2 작성

@WebServlet(name = "Servlet2",urlPatterns
="/Servlet2")
public class Servlet2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
       //从request域中取出数据
        Object attribute =   request.getAttribute("name");
        response.getWriter().write("123w45"+attribute);
    }
}

효과는 다음과 같습니다.
여기에 사진 설명 삽입
참고 :이 시점에서 웹 사이트에 Servlet1을 입력하면 그는이를 전달하고 해당 내용은 Request의 다음 내용 인 Servlet2의 내용으로 이동하여 전달합니다. 둘째, Servlet에서 요청을 이해하도록주의를 기울이면 모든 리소스를 얻을 수 있습니다.

  1. 완전한 요청 전달 요청

요청 전달자 가져 오기 ---- 경로는 전달 된 주소입니다.

  • RequestDispatcher getRequestDispatcher(String path)
    전달자 개체를 통해 전달
  • requestDispathcer.forward(ServletRequest request, ServletResponse response)

사례 2 :

목적 : 요청의 요청 전달 내용에 능숙 해 지려고합니다. 이는 사례 1과 거의 유사합니다. Servlet1과 Servlet2를 만들고 Servlet1에서 Servlet2로 내용을 전달할 수 있습니다.

첫 번째 단계 : Servlet1 작성 :

@WebServlet(name = "Servlet1",urlPatterns ="/Servlet1")
public class Servlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //Servlet1将请求转发给Servlet2 此处新建一个转发器
        RequestDispatcher dispatcher =  request.getRequestDispatcher("/Servlet2");
        //执行转发的方法
        dispatcher.forward(request,response);
    }
}

2 단계 : 서블릿 작성

@WebServlet(name = "Servlet2",urlPatterns ="/Servlet2")
public class Servlet2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.getWriter().write("123w45");
    }
}

효과는 다음과 같습니다.
이때 Servlet1을 방문하면 Servlet2의 내용이 표시됩니다.
여기에 사진 설명 삽입

여덟, 요청에 대한 몇 가지주의 사항

1. ServletContext 도메인과 요청 도메인의 라이프 사이클을 비교합니까?

ServletContext :

  • 만들기 : 서버 시작
  • 파괴 : 서버 종료
  • 도메인의 범위 : 전체 웹 애플리케이션

의뢰:

  • 생성 : 방문시 요청 생성
  • 파괴 : 응답 요청의 끝이 파괴됩니다.
  • 도메인 범위 : 요청에서

2. 클라이언트 주소와 서버 주소는 어떻게 작성합니까?

  • 클라이언트 주소 :
  • 클라이언트가 서버에 액세스하는 주소, 서버 외부의 주소,
  • 기능 : 웹 애플리케이션 이름 쓰기
  • 액세스 방법 : 리디렉션
  • 서버 주소:
  • 서버 내부 리소스의 점프 주소
  • 기능 : 웹 애플리케이션의 이름을 쓸 필요가 없습니다.
  • 액세스 방법 : 앞으로

3. 전달과 리디렉션의 차이점은 무엇입니까?

  • 요청을 두 번 리디렉션하고 요청을 한 번 전달합니다.
  • 리디렉션 주소 표시 줄의 주소가 변경되고 전달 주소는 변경되지 않습니다.
  • 리디렉션은 외부 웹 사이트에 액세스 할 수 있습니다. 전달은 내부 리소스에만 액세스 할 수 있습니다.
  • 전달 성능이 리디렉션보다 낫습니다.

추천

출처blog.csdn.net/Mr_GYF/article/details/109153716