狂神说Java Web学习笔记_Cookie & Session

佚名 / 2024-02-03 / 原文

Cookie

保存会话的两种技术, Cookie(客户端技术), Session(服务端技术)

服务器端设置token,从客户端获取token

Cookie[] cookies = req.getCookies();//从客户端获取cookie
cookie.getName();//获取cookie名字
cookie.getValue();//获取cookie值
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis() + "");//创建cookie
resp.addCookie(cookie);//服务端给客户端返回一个cookie
package com.bambi;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CookieExample extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=UTF-8");

        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("lastLoginTime")) {
                    long l = Long.parseLong(cookie.getValue());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    resp.getWriter().write("你上一次访问本站的时间为: " + format.format(l));
                }
            }
        } else {
            resp.getWriter().write("第一次访问本站~");
        }

        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
<servlet>
    <servlet-name>cookie</servlet-name>
    <servlet-class>com.bambi.CookieExample</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>cookie</servlet-name>
    <url-pattern>/cookie</url-pattern>
</servlet-mapping>

设置token有效期

cookie.setMaxAge(24 * 60 * 60);//设置cookie有效期为1天

Session

常用方法

HttpSession session = req.getSession();
session.invalidate();
session.setAttribute("name", "summer");
session.isNew();
session.getId();

方法实践

SessionDemo01设置attribute "name"

package com.bambi.session;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        HttpSession session = req.getSession();
        session.setAttribute("name", "summer");

        resp.getWriter().write("sessionId: " + session.getId());

        if (session.isNew()) {
            resp.getWriter().write("sessionId刷新了");
        }
    }

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

SessionDemo02获取attribute "name"

package com.bambi.session;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        HttpSession session = req.getSession();
        String name = (String) session.getAttribute("name");

        resp.getWriter().write("name: " + name);
    }

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

SessionDemo03设置session invalid

package com.bambi.session;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        HttpSession session = req.getSession();
        session.invalidate();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>cookie</servlet-name>
        <servlet-class>com.bambi.CookieExample</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>session01</servlet-name>
        <servlet-class>com.bambi.session.SessionDemo01</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>session02</servlet-name>
        <servlet-class>com.bambi.session.SessionDemo02</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>session03</servlet-name>
        <servlet-class>com.bambi.session.SessionDemo03</servlet-class>
    </servlet>


    <servlet-mapping>
        <servlet-name>cookie</servlet-name>
        <url-pattern>/cookie</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>session01</servlet-name>
        <url-pattern>/session01</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>session02</servlet-name>
        <url-pattern>/session02</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>session03</servlet-name>
        <url-pattern>/session03</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>2</session-timeout><!-- 以分钟为单位 -->
    </session-config>
</web-app>

调用session01,此时session中就已经存在了一个name参数。

调用session02,获取到name的值。

调用session03,将session设置为invalid。此时再次调用session02的话,将获取不到name了。