Puntos de conocimiento de cookies y sesiones

Cookie (cliente)

Que es cookie

  • Cookie es una tecnología para que el servidor notifique al cliente que guarde pares clave-valor
  • Una vez que el cliente tiene una cookie, cada solicitud se envía al servidor.
  • El tamaño de cada cookie no puede exceder de 4kb

Cómo crear cookies

Inserte la descripción de la imagen aquí

Puede crear varias cookies a la vez

Crea un Servletprograma

public abstract class BaseServlet extends HttpServlet {
     
     

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        //解决post请求中文乱码问题
        //一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");

        response.setContentType("text/html;charset=UTF-8");

        //获取隐藏表单项的action的值
        String action = request.getParameter("action");

        //利用反射获取相应的用户行为,避免使用大量的if else
        //我们只需要在下面编写相应的方法即可,修改密码,绑定邮箱,绑定手机号等业务
        try {
     
     
            //获取action鉴别对象,获取相应的业务
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务
            method.invoke(this,request,response );

        } catch (Exception e) {
     
     
            e.printStackTrace();
        }
    }

    //因为图书管理板块的提交方式是Get请求,所以我们让doGet执行doPost相同的操作
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        doPost(request,response);
    }
}

CookieServletprograma

public class CookieServlet extends BaseServlet {
     
     


    protected void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        //1.创建Cookie对象
        Cookie cookie = new Cookie("key1","value1");
        //2.通知客户端保存Cookie(服务器发送给客户端/浏览器,所以是response)
        response.addCookie(cookie);

        response.getWriter().write("Cookie创建成功");
        //解决中文乱码问题在BaseServlet中,        response.setContentType("text/html;charset=UTF-8");

    }
}

web.xml

    <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>com.gw.servlet.CookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>

cookie.html

	<base href="http://localhost:8080/13_cookie_session/">

			<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>

Cómo obtiene las cookies el servidor

    protected void getCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
                //遍历所有的Cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie: cookies){
     
     
            response.getWriter().write("Cookie["+cookie.getName()+"="+cookie.getValue()+"]"+"<br/>");
        }

        //查找特定的Cookie
        Cookie iWantCookie = CookieUtils.findCookie("key1",cookies);
    }
}

Encuentra una cookie específica

//查找指定名称的cookie对象
public class CookieUtils {
     
     
    public static Cookie findCookie(String name,Cookie[] cookies){
     
     
        if (name==null|| cookies==null|| cookies.length==0){
     
     
            return null;
        }
        for (Cookie cookie : cookies) {
     
     
            if (name.equals(cookie.getName())){
     
     
                return cookie;
            }
        }
        return null;
    }
}

Modificación del valor de la cookie

    protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        /*方案一*/
        //覆盖之前的
        Cookie cookie = new Cookie("key1","value111");
        response.addCookie(cookie);

        /*方案二*/
        //1 先找到需要修改的Cookie对象
        Cookie cookie1 = CookieUtils.findCookie("key1",request.getCookies());
        //2 调用setValue()方法赋予新值
        cookie1.setValue("value111");
        //3 调用response.addCookie()
        response.addCookie(cookie1);
    }

Vista de cookies en el navegador

Ver cookie en la aplicación

Control de vida de las cookies

El control de la vida de las cookies se refiere a cómo administrar cuando se destruyen las cookies

setMaxAge()

  • Número positivo: expira después del número especificado de segundos.
  • Número negativo: destruir después de cerrar el navegador (predeterminado -1)
  • 0: Destruye la Cookie inmediatamente
   
protected void defaultCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = new Cookie("default1","value1");
        //-1是默认值
        cookie.setMaxAge(-1);
        response.addCookie(cookie);
    }

    protected void deleteCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = CookieUtils.findCookie("default1",request.getCookies());
        if (cookie!=null){
    
    
            //表示立即删除
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }

    protected void life1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = new Cookie("default1","value1");
        //存活一个小时(就算关闭浏览器也能存活)
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
    }

Ruta efectiva de cookies Configuración de ruta

El atributo Ruta de la cookie puede filtrar de forma eficaz qué cookies se pueden enviar al servidor y cuáles no; para un filtrado eficaz

comprensión

CookieA-------- ruta = / ruta del proyecto

CookieB-------- ruta = / ruta del proyecto /abc


Solicitar juicio de dirección:

  • http: // ip: puerto / ruta del proyecto /a.html
    • CookieA enviar
    • CookieBNo envíe
  • http: // ip: puerto / ruta del proyecto /abc/a.html
    • CookieA Enviar (no mires la ruta más tarde)
    • CookieB enviar
   //path属性
   protected void testPath(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
       Cookie cookie = new Cookie("path1","path1");
       //获取工程路径request.getContextPath()
       cookie.setPath(request.getContextPath()+"/abc");// 工程路径/abc
       response.addCookie(cookie);
   }

Iniciar sesión sin nombre de usuario

Inserte la descripción de la imagen aquí

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/13_cookie_session/loginServlet" method="get">
        用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

LoginServlet

public class LoginServlet extends HttpServlet {
     
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("gao123".equals(username) && "123456".equals(password)){
     
     
            //创建一个Cookie对象
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(60*60*24*7);//Cookie保存一周时间(也就是用户名保存一周时间)
            response.addCookie(cookie);

            System.out.println("登陆成功");

        }else{
     
     
            System.out.println("登陆失败");
        }

    }

web.xml

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.gw.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>

Sesión (lado del servidor)

Que es Session

  • La sesión es una interfaz ( HttpSession)
  • La sesión de sesión es una tecnología que se utiliza para mantener la asociación entre un cliente y un servidor.
  • Cada cliente tiene su propia sesión
  • En la sesión de sesión, a menudo estamos acostumbrados a proteger la información después de que el usuario inicia sesión.

Cómo crear sesión y obtener

request.getSession()

  • La primera llamada es: Crear sesión
  • Todas las llamadas posteriores son: Obtener el objeto de sesión creado antes

isNew(): Determina si se acaba de crear

  • verdadero: significa recién creado
  • falso: significa obtener el objeto de la sesión anterior

Cada sesión tiene un número de ID, que es el valor de ID, que es único; getId() Obtenga el valor de ID de la sesión de sesión

SessionServlet

Crea y obtén

public class SessionServlet extends BaseServlet {
     
     

    protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        //创建和获取Session对象
        HttpSession session = request.getSession();
        //判断当前的Session会话是否是新创建的
        boolean isNew = session.isNew();
        //获取唯一标识ID
        String id = session.getId();

        response.getWriter().write("唯一标识ID"+id);
        response.getWriter().write("是否是新创建的"+isNew);
    }
}

web.xml

    <servlet>
        <servlet-name>SessionServlet</servlet-name>
        <servlet-class>com.gw.servlet.SessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet</servlet-name>
        <url-pattern>/sessionServlet</url-pattern>
    </servlet-mapping>
			<li><a href="sessionServlet?action=createOrGetSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>

Datos en el campo Sesión

    //存储
    protected void setAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        request.getSession().setAttribute("key1", "value1");
        response.getWriter().write("往Session域中已经存储了数据");
    }

    //获取
    protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        Object key1 = request.getSession().getAttribute("key1");
        response.getWriter().write("Session中获取的值"+key1);
    }
		<li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li>
			<li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>

Ciclo de vida de la sesión

El tiempo de espera de la sesión se refiere al intervalo máximo entre dos solicitudes de cliente

  • El tiempo de espera predeterminado para la sesión es de 30 minutos.

    El archivo web.xmlde configuración del servidor Tomcat tiene por defecto la siguiente configuración, lo que significa que el período de tiempo de espera de todas las sesiones de Tomcat está configurado para ser de 30 minutos.

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    
  • Si web.xmlel tiempo de espera de la información de configuración anterior del archivo se modifica en un determinado proyecto web, la sesión en toda la web es el valor modificado

  • Si solo necesita modificar el tiempo de espera de una sesión específica, necesita los siguientes métodos

Duración predeterminada
    //获取Session的默认超时时长
    protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        int maxInactiveInterval = request.getSession().getMaxInactiveInterval();
        response.getWriter().write("默认超时时间为"+maxInactiveInterval);
    }
Modificar el período de tiempo de espera
    //修改3秒超时时长
    protected void life3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(3);
        response.getWriter().write("当前Session设置为3秒后超时");
    }
Destruir inmediatamente
    //让Session马上超时
    protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        HttpSession session = request.getSession();
        //马上销毁
        session.invalidate();
        response.getWriter().write("当前Session设置立即销毁");
    }

La historia interna de la asociación entre la sesión y el navegador

er (). write ("La sesión actual está configurada para expirar después de 3 segundos");
}


##### **立即销毁**

```java
    //让Session马上超时
    protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //马上销毁
        session.invalidate();
        response.getWriter().write("当前Session设置立即销毁");
    }

La historia interna de la asociación entre la sesión y el navegador

Inserte la descripción de la imagen aquí
Descargo de responsabilidad: compilado por el video de Silicon Valley

Supongo que te gusta

Origin blog.csdn.net/weixin_46250447/article/details/112298545
Recomendado
Clasificación