JAVAWEB —— Solicitar, Solicitar obtener la línea de solicitud, el encabezado de la solicitud, el cuerpo de la solicitud, resolver la diferencia entre enviar un esquema de código confuso, solicitar dominio, reenvío y redirección

1. Descripción general de HttpServletRequest

Anularemos los service()métodos cuando creemos el Servlet , o doGet()/doPost()estos métodos tienen dos parámetros, uno es la solicitud que representa la solicitud y la respuesta que representa la respuesta.

El tipo de solicitud en el método de servicio es ServletRequest y el tipo de solicitud en el método doGet / doPost es HttpServletRequest, HttpServletRequest es una subinterfaz de ServletRequest con funciones y métodos más poderosos. Hoy estamos aprendiendo HttpServletRequest.

Dos, tome la solicitud Http a través de la herramienta de captura de paquetes

Inserte la descripción de la imagen aquí
Debido a que la solicitud representa una solicitud, podemos obtener la solicitud Http a través de este objetoLínea de solicitudEncabezado de solicitudconCuerpo de la solicitud

Tres, obtenga la línea de solicitud a través de solicitud

Obtenga el método de solicitud del cliente:String getMethod()

Obtenga el recurso solicitado:

  • String getRequestURL()
  • StringBuffer getRequestURL()
  • String getContextPath()---- El nombre de la aplicación web
  • String getQueryString()---- Obtenga la cadena de parámetro después de enviar la dirección URL username = zhangsan & password = 123

Caso:

				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);

El efecto es el siguiente:
Inserte la descripción de la imagen aquí
esta dirección es una dirección IPV6, si desea cambiar a 127.0.0.1, debe modificar la configuración de la computadora. Representa la IP local.

Cuatro, obtenga el encabezado de la solicitud a través de la solicitud

  • long getDateHeader(String name)
  • String getHeader(String name)——Obtener la cabeza especificada
  • Enumeration getHeaderNames()—— Obtener los nombres de todos los jefes
  • Enumeration getHeaders(String name)
  • int getIntHeader(String name)

Caso número uno:

Cree un nuevo HeaderServlet, escriba lo siguiente

//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);

El efecto es el siguiente:
Inserte la descripción de la imagen aquí
Caso 2:
Si agregamos una etiqueta a form.html, la dirección a visitar es HeadServlet escrita en el Caso 1.

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

En este punto, obtenemos la información de todos los encabezados de solicitud, que se pueden ver a través de la consola.

Inserte la descripción de la imagen aquí
La función de los TIPS: encabezado de referencia: la fuente de la visita. Función: el enlace anti-sanguijuela significa que se accede al enlace a través del html escrito por mí, lo que puede evitar que otros malversen mi página web vinculada

Caso tres:

Para dominar la cadena antirrobo, haz una pequeña demostración

El primer paso es crear un nuevo news.html y acceder al Servlet

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

El segundo paso es detectar la cadena de acceso

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("盗网站者,可耻");
      }
 }

Cinco, obtener el cuerpo de solicitud mediante solicitud

Si el contenido del cuerpo de la solicitud esEnviar por correoLos parámetros de solicitud, el formato es:

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

Tome los parámetros anteriores como ejemplo, obtenga los parámetros de solicitud a través de los siguientes métodos:

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

Caso número uno:

Paso 1: crea un formulario nuevo

<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>

Paso 2: obtenga un valor único y varios valores en el cuadro de texto respectivamente

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);
        }
    }
}

El efecto es el siguiente:
Inserte la descripción de la imagen aquí

  • Enumeration getParameterNames()(poco usado)
  • Map<String,String[]> getParameterMap()(Comúnmente utilizado)
    Nota: Los parámetros enviados por el cliente al servidor son todas cadenas
    Caso 2:

En este punto, continuamos escribiendo junto al Servlet anterior

//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("+++++++++++++++++++++++++++++++++++");
}

El efecto es el siguiente:
Inserte la descripción de la imagen aquí

Seis, la solución para enviar código confuso

  • resolverMétodo de envío posteriorEl confuso:
    request.setCharacterEncoding("UTF-8");
  • resolverobtener el método de envíoIlegible:
    parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

Siete, otras funciones de solicitud

  1. la solicitud es un objeto de dominio
  • setAttribute(String name, Object o)
  • getAttribute(String name)
  • removeAttribute(String name)

Nota: El alcance del campo de solicitud: en una solicitud

Caso número uno:

Finalidad: El dominio de la solicitud es competente, almacenamos información en el contenido de Servlet1 y la obtenemos en Servlet2.

El primer paso es crear un nuevo 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);
    }
}

Paso 2: escriba un 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);
    }
}

El efecto es el siguiente:
Inserte la descripción de la imagen aquí
Nota: Cuando ingresamos a Servlet1 en el sitio web en este momento, él lo reenviará y el contenido saltará al contenido de Servlet2, que es el siguiente contenido de Request, reenvío. En segundo lugar, preste atención para comprender la solicitud en el Servlet una vez, puede obtener todos los recursos

  1. solicitar reenvío de solicitud completo

Obtener el reenviador de solicitudes ---- la ruta es la dirección reenviada

  • RequestDispatcher getRequestDispatcher(String path)
    Adelante a través del objeto reenviador
  • requestDispathcer.forward(ServletRequest request, ServletResponse response)

Caso 2:

Propósito: Para dominar el contenido del reenvío de solicitudes, que es casi similar al caso 1, hacemos un Servlet1 y un Servlet2, y reenviamos el contenido de Servlet1 a Servlet2.

El primer paso: escribe un 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);
    }
}

Paso 2: escriba un servlet

@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");
    }
}

El efecto es el siguiente:
En este momento, cuando visitamos Servlet1, se muestra el contenido de Servlet2:
Inserte la descripción de la imagen aquí

Ocho, algunas precauciones para la solicitud

1. ¿Comparar el ciclo de vida del dominio ServletContext y el dominio de solicitud?

ServletContext:

  • Crear: inicio del servidor
  • Destruir: apagado del servidor
  • El alcance del dominio: toda la aplicación web

solicitud:

  • Crear: crear solicitud al visitar
  • Destruir: se destruye el final de la solicitud de respuesta
  • Alcance del dominio: en una solicitud

2. ¿Cómo escribir la dirección del cliente y la dirección del servidor?

  • Dirección del cliente:
  • Es la dirección donde el cliente accede al servidor, la dirección fuera del servidor,
  • Funciones: escriba el nombre de la aplicación web
  • Método de acceso: redireccionar
  • Dirección del servidor:
  • La dirección de salto de los recursos internos del servidor,
  • Funciones: no es necesario escribir el nombre de la aplicación web
  • Método de acceso: adelante

3. ¿La diferencia entre reenvío y redireccionamiento?

  • Redirigir la solicitud dos veces y reenviar la solicitud una vez
  • La dirección de la barra de direcciones de redireccionamiento cambia y la dirección de reenvío permanece sin cambios
  • La redirección puede acceder a sitios web externos La redirección solo puede acceder a recursos internos
  • El rendimiento del reenvío es mejor que la redirección

Supongo que te gusta

Origin blog.csdn.net/Mr_GYF/article/details/109153716
Recomendado
Clasificación