会话状态管理cookie和session
一、什么是会话
会话可以简单的理解为:用户打开浏览器访问了多个资源,然后关闭浏览器。整个过程称之为一次会话。
我们所说的会话管理其实就是指状态管理,而状态的管理其实就是对数据的管理!
而在整个会话的过程中不可避免的会产生一些数据(状态)。程序要想办法来保存这些数据,但是浏览器发送的是基于HTTP协议的请求,HTTP又是无状态协议,所以我们要使用其他技术来完成状态的管理。
HTTP的无状态是指,当浏览器给服务器发送请求的时候,服务器响应客户端请求。
但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才的那个浏览器。
简单的说,就是服务器不会去记得你,所以就是http的无状态协议。
同理我们可以知道有状态会话与之相反
二、保存用户状态的两大机制
Session 会话
Session是服务器端技术,数据保存在服务器端,服务器在运行时为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
cookie
Cookie是客户端技术,数据保存在客户端,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。
还有一个token技术,解决频繁访问服务器的问题。
可参考这篇博文:深入理解tokenl
三、Cookie
- 在主工程的pom中配置依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
- 配置servlet映像
<?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"
metadata-complete="true">
</web-app>
<servlet>
<servlet-name>cookie</servlet-name>
<servlet-class>org.raylene.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookie</servlet-name>
<url-pattern>/cookie</url-pattern>
</servlet-mapping>
- java文件
package org.raylene.servlet;
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.io.PrintWriter;
import java.util.Date;
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset =utf-8");
PrintWriter out = resp.getWriter();
//cookie服务器从客户端获取
Cookie[] cookies = req.getCookies();//可以获取多个cookie
if(cookies != null){
out.write("你上一次访问的时间为:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if(cookie.getName().equals("LastLoginTime")){
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
}else{
System.out.println("这是第一次访问该网页");
}
//服务器给客户端一个cookie
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 配置tomcat服务器
四、session
关于web.xml中servelt映射配置也可以使用注解@WebServlet()
了解具体用法
可参考:添加链接描述
java,
存一个字符串
package org.raylene.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
//注解的用法
//@WebServlet(description = "a text for session", urlPatterns = { "/sess3"},loadOnStartup=1)
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;utf-8");
//
HttpSession session = req.getSession();
//获取session的值
String name = (String) session.getAttribute("name");
resp.getWriter().write("session对应的值为:"+name);
System.out.println("session对应的值为:"+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
存一个对象
package org.raylene.servlet;
import org.raylene.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
//注解的用法
//@WebServlet(description = "a text for session", urlPatterns = { "/sess3"},loadOnStartup=1)
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;utf-8");
//
HttpSession session = req.getSession();
//获取session的值
Person name = (Person) session.getAttribute("name");
resp.getWriter().write("session对应的值为:"+name.toString());
System.out.println("session对应的值为:"+name.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
手动注销一个session
package org.raylene.servlet;
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 ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
会话自动注销
<!-- 设置session默认的失效时间 -->
<session-config>
<!-- 以分钟为单位 -->
<session-timeout>15</session-timeout>
</session-config>
session和cookie的区别
- cookie时把用户的数据写给用户的浏览器,由浏览器来保存(可以保存多个数据)
- session是把数据写到由给i用户独占的session中,由服务器来保存(保存重要的信息,减少服务器资源的浪费)
- session对象由服务器创建。
session的使用场景
- 保存一个登录用户的信息;
- 购物车信息
- 在整个网站中经常会使用到的数据,我们将其保存在session中
参考链接:
- https://blog.csdn.net/Fu_Shi_rong/article/details/105505982
- https://blog.csdn.net/qq_34598667/article/details/83012671