Seguimiento de sesiones y saltos de JavaWeb

Salto de servlet

     1.forward --- Interfaz RequestDispatcher

          forward (solicitud ServletRequest, respuesta ServletResponse) --- Este método se utiliza para transferir la solicitud de un Servlet a otro recurso web [programa Servlet / html / JSP]. [Solicitud de reenvío]

          forward pertenece a la interfaz RequestDispatcher

          La interfaz Http Servlet Request hereda un método RequestDispatcher getRequestDispatcher (ruta de cadena) para obtener el objeto RequestDispatcher de la interfaz Servlet Request.

          Parámetro Cadena ruta --- ruta de destino [debe comenzar con "/" para indicar el directorio raíz de la aplicación web actual]

          Cabe señalar que el contenido del directorio WEB-INF también es visible para el objeto RequestDispatcher. Por lo tanto, el recurso pasado al método getRequestDispatcher (ruta de cadena) puede ser un archivo en el directorio WEB-INF.

          RequestDispatcher interface object = Http Servlet Request interface object.getRequestDispatcher (ruta de cadena);

          RequestDispatcher 接口 对象 .forward (solicitud ServletRequest, respuesta ServletResponse).

          Pasar datos a través del objeto HttpServletRequest.

          Métodos del objeto HttpServletRequest

          void setAttribute (String name, Object o) se usa para asociar un objeto con un nombre y almacenarlo en el objeto ServletRequest

          El objeto getAttribute (nombre de cadena) se utiliza para devolver el objeto de atributo con el nombre especificado del objeto ServletRequest

          void removeAttribute (nombre de cadena) se utiliza para eliminar el atributo del nombre especificado del objeto ServletRequest

    

P.ej:

package com.wangxing.servlet;
import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OneServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("------------------");
		//forward(ServletRequest request,ServletResponse response);该方法用于将请求从一个servlet传递给另一个web资源【Servlet程序/html/JSP】
		//forward(ServletRequest req,ServletRresponse resp)方法是RequestDispatcher中的方法
		//HttpServletRequest中有获得RequestDispatcher对象的方法
		//getRequestDispatcher();
		/*
		RequestDispatcher requestDispatcher = req.getRequestDispatcher("/test.html");
		requestDispatcher.forward(req, resp);
		
		req.getRequestDispatcher("/onther").forward(req, resp);
		*/
		//void setAttribute(String name,Object o);用于将一个对象与另一对象关联后存储到ServletRequest对象中
		req.setAttribute("name", "zhangsan");
		
		req.getRequestDispatcher("/other").forward(req, resp);
	}
	
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//Object getAttribute(String name);用于从ServletRequest对象中返回指定名称的属性对象
		String name = (String) req.getAttribute("name");
		System.out.println("OtherServlet----name==" + name);
	}
	
}

      2.Redirect ---- HttpServletRespone.sendRedirect () [Redirect]

            La interfaz HttpServletResponse define un método sendRedirect (ruta de cadena). La solicitud se pasa de un servlet a otro recurso web [programa de servlet / html / JSP]

P.ej:

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OneServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("---------------");
		//sendRedirect(String path);方法请求从一个Servlet传递给另一个Web资源【Servlet程序/html/JSP】
		//resp.sendRedirect("test.html");
		//resp.sendRedirect("/test.html");错误
		
		req.setAttribute("name", "lisi");
		resp.sendRedirect("other");
	}
	
}
package com.wangxing.servlet;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//Object getAttribute(String name);用于从ServletRequest对象中返回指定名称的属性值
		String name = (String) req.getAttribute("name");
		//sendRedirect不能传递数据因为他是重定位
		System.out.println("OtherServlet--name=="+name);
		
	}
	
}

            La prueba anterior es para acceder a Html / otro Servlet mediante el programa Servlet

            ¿Podemos acceder al programa Servlet a través de html?

            Si, hay tres formas

            1. A través de elementos de formulario HTML

            2. Hipervínculo a través de html

            3. Envíe una solicitud asincrónica a través de javascript ajax

      P.ej:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<!-- 
	<center>
		<form action="login" method="post">
			<table border="1px">
				<tr align="center">
					<td colspan="2"><h1>用户登录</h1></td>
				</tr>
				<tr align="center">
					<td>账号:</td>
					<td><input type="text" name="username"/></td>
				</tr>
				<tr align="center">
					<td>密码:</td>
					<td><input type="password" name="password"/></td>
				</tr>
				<tr align="center">
					<td colspan="2"><input type="submit" value="登录"/></td>
				</tr>
			</table>
		</form>
	</center>
	 -->
	 <h1><a href="login?username=zhangsan&password=123">用户登录</a></h1>
</body>
</html>

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到账号和密码
		String  name=req.getParameter("username");
		String  pass=req.getParameter("password");
		System.out.println("name=="+name+" "+"pass=="+pass);
	}
}

la diferencia:

RequestDispatcher . adelante (req, resp)

HttpServletRespone . sendRedirect ()

Solicitud de reenvío

Redirigir

Se utiliza el mismo objeto de solicitud

Se utilizan diferentes objetos de solicitud

La URL en la barra de direcciones del navegador no cambiará

La URL en la barra de direcciones del navegador cambiará

Los datos se pueden pasar a través del objeto HttpServletRequest

No se pueden pasar datos a través del objeto HttpServletRequest

Al configurar la ruta de destino, "/" se puede escribir o no escribir

"/" no se debe escribir al configurar la ruta de destino

Confíe en la interfaz ServletRequest

Confíe en el objeto HttpServletRespone

Seguimiento de sesiones

     1. ¿Por qué necesita el seguimiento de sesiones?

          Use la solicitud http enviada por el navegador . La solicitud http usa el protocolo http, y el protocolo http es un protocolo sin estado . No registrará activamente quién es el usuario que usa el protocolo http. Una vez que la solicitud se envía correctamente, el servidor make Después de la respuesta, el vínculo entre el navegador y el servidor desaparecerá en este momento, y el servidor no sabrá de dónde viene la solicitud y quién la envió. Entonces, en este momento necesitamos registrar / guardar el estado de la solicitud / enlace. El proceso de realizar este registro / guardar solicitud / estado de enlace se llama seguimiento de sesión .

     2. ¿Qué es el seguimiento de sesiones?

          El proceso por el cual el administrador del servidor realiza el registro / guardado del estado de la solicitud / enlace se denomina seguimiento de sesión .

     3. ¿Cuáles son las cuatro tecnologías de seguimiento de sesiones y sus respectivas ventajas y desventajas?

          1. Reescritura de URL: vuelva a escribir la información de identificación de la sesión del usuario en la dirección URL para identificar a los diferentes usuarios en el lado del servidor.

               https://blog.csdn.net/qq_33098039/article/details/78184535?sessionid=123456

               La reescritura de URL aún puede funcionar cuando el cliente deshabilita las cookies o no las admite.

          2. Ocultar el campo del formulario: agregue la información de identificación de la sesión del usuario al elemento del formulario HTML <input type = "hidden" name = "" value = "" / > y envíelo al servidor. Este elemento del formulario no se muestra en el lado del cliente Cuando navego no puedo verlo, está en el código fuente.              

          3 galleta

               La cookie es una pequeña información enviada por el servidor web al cliente, el cliente puede leer la información y enviarla al servidor cuando el cliente lo solicite para identificar al usuario. El servidor se crea y guarda en el lado del navegador, no puede cruzar nombres de dominio y está limitado en tamaño y cantidad . El cliente puede guardar este objeto Cookie de dos formas: una es guardarlo en la memoria del cliente, denominada cookie temporal, que desaparecerá una vez que se cierre el navegador. Otra forma es guardarlo en el disco del cliente, llamado cookie permanente. En el futuro, mientras el cliente visite el sitio web, la cookie se enviará nuevamente al servidor, siempre que la cookie esté dentro del período de validez. De esta forma se realiza el seguimiento de los clientes. Las cookies se pueden prohibir.

          4.Sesión

               Cada usuario tiene una sesión diferente, que no se puede compartir entre usuarios, es exclusiva de cada usuario, la información se puede almacenar en la sesión. Guárdelo en el lado del servidor. Necesita resolver el problema de compartir entre varios servidores. Si el contenido de la sesión es demasiado complejo, puede provocar un desbordamiento de la memoria cuando una gran cantidad de clientes acceden al servidor. Por lo tanto, la información de la sesión debe ser lo más concisa posible.

               La sesión se basa en la cookie. Si la cookie está deshabilitada, la sesión también será inválida.

               Cuando un usuario primero transmite una petición HTTP al servidor, el servidor crea un objeto de sesión, para generar un Id.sesión para identificar el objeto de sesión, y se coloca en el Id.sesión Cookies envía al cliente, enviar la siguiente petición HTTP al servidor cuando , La solicitud http se enviará al servidor junto con el ID de sesión obtenido por primera vez , y se identificarán diferentes usuarios en el lado del servidor.

          El proceso de seguimiento de sesión anterior es similar al proceso de almacenar artículos en las taquillas en la entrada del supermercado cuando vamos al supermercado.

     4. ¿Cuál es la diferencia entre Sesión y Cookie ?

Galleta

Sesión

Los datos son creados por el servidor y guardados en el lado del navegador.

Datos en el servidor

las cookies no son muy seguras

La sesión es segura

Deben utilizarse cookies para reducir el rendimiento del servidor.

No considere reducir el rendimiento del servidor . Puede usar Session

Los datos guardados por una sola cookie no pueden exceder los 4K

sin límite

 

La sesión se basa en la cookie. Si la cookie está deshabilitada, la sesión también será inválida.

     5. Métodos comunes de HttpSession

          Interfaz HttpSession en Servlet

               1. Obtenga el objeto de interfaz HttpSession a través del método getSession () del objeto HttpServletRequest

               2. Métodos comunes de los objetos de la interfaz HttpSession

Declaración de método

Función descriptiva

String getId ()

Este método se utiliza para obtener el ID de sesión.

long getCreationTime ()

Este método se utiliza para obtener la hora de creación del objeto de sesión [ms]

long getLastAccessedTime ()

Este método se utiliza para obtener la última hora de acceso de la sesión [ms]

int getMaxInactiveInterval ()

Este método se utiliza para obtener el tiempo máximo de inactividad de la sesión [seg]

boolean isNew ()

Este método se utiliza para determinar si el objeto de sesión es un nuevo objeto de sesión.

void setAttribute (String args0, Object args1);

Este método se utiliza para guardar datos en el objeto de sesión creado.

Objeto getAttribute (String args0);

Este método se utiliza para obtener los datos especificados guardados en el objeto de sesión.

vacío

removeAttribute (String args0);

Este método se utiliza para eliminar los datos especificados almacenados en el objeto de sesión.

anular invalidar ()

Este método se utiliza para destruir el objeto de sesión.

Por ejemplo: la operación de inicio de sesión usa el objeto HttpSession

package com.wangxing.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * 绘制登录界面的Servlet
 * @author Administrator
 *
 */
public class LoginUIServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置字符集
		req.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");
		//得到输出流
		PrintWriter out = resp.getWriter();
		out.println("<!DOCTYPE html> "); 
		out.println("<html>"); 
		out.println("<head>"); 
		out.println("<meta charset=\"UTF-8\">"); 
		out.println("<title>用户登录</title>"); 
		out.println("</head>"); 
		out.println("<body>"); 
		out.println("<center>"); 
		//得到session对象
		HttpSession session = req.getSession();
		//显示session信息
		showsessioninfo(out,session);
		out.println("<hr>");
		Object errorobj = req.getSession().getAttribute("error");
		if(errorobj != null){
			out.println("<font color=\"red\">"+(String)errorobj+"</font>");
		}
		out.println("<form action=\"login\" method=\"post\">"); 
		out.println("<table border=\"1px\">"); 
		out.println("<tr align=\"center\">"); 
		out.println("<td colspan=\"2\"><h1>用户登录</h1></td>"); 
		out.println("</tr>"); 
		out.println("<tr align=\"center\">"); 
		out.println("<td>账号:</td>"); 
		out.println("<td><input type=\"text\" name=\"username\"/></td>"); 
		out.println("</tr>"); 
		out.println("<tr align=\"center\">"); 
		out.println("<td>密码:</td>"); 
		out.println("<td><input type=\"password\" name=\"password\"/></td>"); 
		out.println("</tr>"); 
		out.println("<tr align=\"center\">"); 
		out.println("<td colspan=\"2\"><input type=\"submit\" value=\"登录\"/></td");
		out.println("</tr>"); 
		out.println("</table>"); 
		out.println("</form>"); 
		out.println("</center>"); 
		out.println("</body>"); 
		out.println("</html>"); 
		out.close();	
	}
	/**
	 * 显示session信息
	 * @param out
	 * @param session
	 */
	private void showsessioninfo(PrintWriter out, HttpSession session) {
		out.println("<table border=\"1px\">");
		out.println("<tr align=\"center\">");
		out.println("<td colspan=\"2\">");
		out.println("<h1>session信息</h1>");
		out.println("</td>");
		out.println("</tr>");
		out.println("<tr align=\"center\">");
		out.println("<td>sessionID:</td>");
		out.println("<td>"+session.getId()+"</td>");
		out.println("</tr>");
		out.println("<tr align=\"center\">");
		out.println("<td>session对象的创建时间:</td>");
		out.println("<td>"+gettime(session.getCreationTime())+"</td>");
		out.println("</tr>");
		out.println("<tr align=\"center\">");
		out.println("<td>session的最后访问时间:</td>");
		out.println("<td>"+gettime(session.getLastAccessedTime())+"</td>");
		out.println("</tr>");
		out.println("<tr align=\"center\">");
		out.println("<td>session的最大不活动时间:</td>");
		out.println("<td>"+session.getMaxInactiveInterval()+"秒</td>");
		out.println("</tr>");
		out.println("<tr align=\"center\">");
		out.println("<td>session对象是否为新:</td>");
		out.println("<td>"+session.isNew()+"</td>");
		out.println("</tr>");
		out.println("</table>");	
	}
	/**
	 * 得到时间
	 * @param creationTime
	 * @return
	 */
	private String gettime(long creationTime) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
		return sdf.format(new Date(creationTime));
	}
	
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 处理登录业务
 * @author Administrator
 *
 */
public class LoginServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到账号和密码
		String name = req.getParameter("username");
		String pass = req.getParameter("password");
		if("zhangsan".equals(name) & "123456".equals(pass)){
			//req.setAttribute("username", name);
			//req.getRequestDispatcher("success").forward(req, resp);
			req.getSession().setAttribute("username", name);
			resp.sendRedirect("success");
		}else{
			//req.setAttribute("error", "用户名密码有误");
			//req.getRequestDispatcher("loginui").forward(req, resp);
			req.getSession().setAttribute("error", "用户名密码有误!");
			resp.sendRedirect("loginui");
		}
	}
	
}
package com.wangxing.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 绘制登录成功页面的Servlet
 * @author Administrator
 *
 */
public class SuccessUIServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");
		PrintWriter out = resp.getWriter();
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset=\"UTF-8\">");
		out.println("<title>登录成功</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<center>");
		Object userObj = req.getSession().getAttribute("username");
		if(userObj == null){
			//req.getRequestDispatcher("loginui");
			resp.sendRedirect("loginui");
		}else{
			out.println("<h1>"+(String)userObj+",登录成功</h1>");
		}
		out.println("</center>");
		out.println("</body>");
		out.println("</html>");
		out.close();
	}
	
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 处理退出业务 
 * @author Administrator
 *
 */
public class LogoutServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getSession().invalidate();
		resp.sendRedirect("loginui");
	}
	
}

               3. ¿La diferencia entre Obtener y Publicar?

Obtener

Correo

ser transmitido a través de la barra de direcciones

La publicación se transmite a través de mensajes y también puede recibir datos en la barra de direcciones

El parámetro get tiene un límite de longitud (limitado por la longitud de la URL)

No hay límite para publicar, debe publicarse al cargar archivos.

GET genera un paquete TCP

El navegador enviará el encabezado http y los datos juntos, y el servidor responderá con 200 (datos de retorno);

POST genera dos paquetes TCP

El navegador envía el encabezado primero, el servidor responde con 100 continue, el navegador envía datos y el servidor responde con 200 ok (devuelve datos).

Diferencia de seguridad

Buena seguridad

Al consultar datos, se recomienda utilizar el método Get

Al agregar, modificar o eliminar datos, se recomienda utilizar el método Publicar

GET es inofensivo cuando el navegador retrocede

POST enviará la solicitud nuevamente cuando el navegador retroceda

La dirección URL generada por GET se puede marcar

La dirección URL generada por POST no se puede marcar

Las solicitudes GET serán almacenadas en caché activamente por el navegador

El navegador no almacenará en caché activamente POST a menos que se configure manualmente.

Las solicitudes GET solo se pueden codificar en URL

POST admite varios métodos de codificación.

Los parámetros de solicitud GET se conservarán por completo en el historial del navegador

Los parámetros de solicitud en la POST no se guardarán en el historial del navegador.

El tipo de datos del parámetro, GET solo acepta caracteres ASCII

POST no tiene límites

Los parámetros GET se pasan a través de la URL

POST放在Request body中

               4.中文乱码的处理

                   网页----<meta charset="utf-8">

                    Eclipse---window-->preferences--->General---->workspace---->Text file encoding

                    Tomcat---默认的字符编码“iso8859-1”

                   服务器/conf目录/server.xml文件

                    <Connector port="8080" protocol="HTTP/1.1"

                    connectionTimeout="20000"

                    redirectPort="8443"  URIEncoding="UTF-8"/>

               1.页面提交到Servlet处理程序中的中文为乱码

                    Post提交方式  request.setCharacterEncoding(“utf-8”);

                   GET方式  String name = new String(name.getBytes(“iso8859-1”),“utf-8”);

               2.Servlet处理程序向页面输出的中文为乱码

                    response.setCharacterEncoding("utf-8"); response.setHeader("Content-Type","text/html;charset=utf-8");

Supongo que te gusta

Origin blog.csdn.net/m0_49935332/article/details/115017642
Recomendado
Clasificación