目录
会话过程
介绍和作用
web会话是从一个浏览器(一个用户)第一次请求服务器开始到浏览器关闭结束之间发生的多次请求与响应过程,就叫一个会话过程。简述:一个用户多次请求与响应的过程。在会话过程中,一个用户与服务器多次请求与响应过程中产生的数据就是会话数据。
会话时间:
从浏览器开启到浏览器关闭(开启新标签是同一个会话,新开一个窗口(同一个浏览器)也是同一个会话)
会话数据
1、客户端会话对象cookie, 会话对象数据存储在浏览器(不敏感的数据)
2、 服务器端会话对象session,会话对象数据存储在服务器端(敏感的数据)
会话对象数据,每个客户端浏览器独享(用户独享会话数据)
cookie介绍和应用场景
介绍和作用
cookie是用于在客户端浏览器存储会话数据,可以叫做浏览器缓存。Cookie 是由 Web服务器创建,最后保存在用户浏览器(客户端)上的文本数据。
客户端存储会话数据,等于使用浏览器缓存数据,可以减少服务器的内存压力,从而提升服务器性能。
1、Cookie写入与查询数据
浏览器限制每个网站最多只能有50个Cookie,且大小不能超过4KB
Cookie操作API
Cookie数据 写入到响应头中,然后传递给浏览器
2、Cookie的有效期
Cookie数据在浏览器中默认存活到会话结束(关闭浏览器)
修改Cookie的有效期
//1.创建Cookie对象写入数据
Cookie cookie = new Cookie("loginUser", "admin");
//设置cookie过期时间为7天,设置单位是秒
//7天 = 60 * 60 *24 *7
cookie.setMaxAge(60 * 60 *24 *7);
//2.将cookie输出给浏览器
response.addCookie(cookie);
//3.打印输出成功
response.getWriter().print("cookie write success");
注意:
单位是秒
3、Cookie非法字符的问题
响应头不能存储非法字符(;中文),所以Cookie不能直接存储非法字符,需要进行URL编码
注意:
java的url编码 : 空格会变成 +
浏览器的url编码会吧空格变成%20
由于Cookie不需要浏览器读取,仅仅只是保存,所以java的url不需要转化为浏览器的url编码(+变成%20)
编码:
String value = ";=你好";
//对数据URL编码
value = URLEncoder.encode(value, "utf-8");
Cookie cookie = new Cookie("loginUser2",value);
response.addCookie(cookie);
解码:
//读取到的是url编码数据
String value = cookie.getValue();
//URL解码操作
value = URLDecoder.decode(value, "utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("loginUser="+value);
4、Cookie有效路径设置
注意:
浏览器访问的网站需要拥有整个项目路径,比如重定向跳转。
服务器使用的是相对路径,比如转发跳转。
//1.创建Cookie对象写入数据
Cookie cookie = new Cookie("loginUser3", "admin");
//设置有效路径
cookie.setPath(request.getContextPath()+"/Demo2Servlet");
//访问1:"/项目路径/Demo2Servlet" 会携带,与有效路径一模一样
//访问2:"/项目路径/Demo2Servlet/123" 会携带,以有效路径开头
//访问3:"/项目路径/Demo2Servlet123" 不会携带,没有以有效路径开头
//2.将cookie输出给浏览器
response.addCookie(cookie);
//3.打印输出成功
response.getWriter().print("cookie write success");
注意:
Cookie.setPath("/项目路径/资源路径")只要是"/项目路径/资源路径"开头的都会携带cookie,
比如:
//访问1:"/项目路径/Demo2Servlet" 会携带,与有效路径一模一样
//访问2:"/项目路径/Demo2Servlet/123" 会携带,以有效路径开头
如果没有设置有效路径,默认就是项目路径,只要访问当前项目目录下的都会携带
5、Cookie删除
cookie没有专门修改或删除的方法,必须采用覆盖方式修改或删除客户端的cookie。
//1.创建name一样的cookie
Cookie cookie = new Cookie("loginUser3", "");
//2.设置有效期为 0
cookie.setMaxAge(0);
//3.创建一样的有效路径
cookie.setPath(request.getContextPath()+"/Demo2Servlet");
//4.输出给客户端浏览器去覆盖
response.addCookie(cookie);
//5.输出删除成功
response.getWriter().print("delete success");
如果没有有效路径,就不用设置有效路径(使用的是默认路径)
服务端会话Session
Session介绍
属于服务器端的会话技术,数据是保存在服务器的内存中,session也叫会话域对象
服务器会为每个浏览器(每个用户)都会创建独享的session对象
Servlet三个作用域
1、请求域request,一次请求有效
2、会话域session,一个会话内有效
3、上下文域servletContext,全局有效,服务器启动到服务器关闭结束
一般情况下,用户登录成功,就写进会话域中。
1、session会话域对象
2、session运行原理
3、session默认有效期与修改
session默认有效期
1、浏览器关闭,会话结束,导致已有的session对象没用了,但是依然驻留在服务器的内存中.
2、session在服务器内存中不是永久的,默认距离上一次请求间隔超过30分钟会被销毁。(默认30分钟)
修改过期时间方式
方式1
方式2
<?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">
<!--第二种方式设置非活动时间,xml方式单位:分钟
如果设置为0,代表永久不销毁,坚决不建议使用0
-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
方式3、立刻失效
4、扩展:关闭浏览器继续访问session
因为浏览器关闭了,默认生成的cookie数据JSESSIONID过期了,导致打开浏览器第二次访问服务器不会携带JSESSIONID,所以服务器自己创建新的session返回使用。所以,只要延长JSESSIONID过期时间,服务器就会获取其对应的旧session返回使用
//1.获取session对象
HttpSession session = request.getSession();
//2.获取sessionid
String sessionId = session.getId();
//3.将session写入cookie,并且覆盖客户端的JSESSIONID数据,设置有效期为1天
Cookie cookie = new Cookie("JSESSIONID",sessionId);
cookie.setMaxAge(60*60*24); //1天
//这里不用设置有效路径,因为系统默认生成的JSESSIONID的cookie数据也是使用默认有效路径
response.addCookie(cookie);
response.getWriter().print("sessionid="+sessionId);
注意:
即使cookie延长为1天后,但是30分钟之后还是无法访问同一个session,这是因为Session默认保存30分钟
5、扩展:session钝化和激活
浏览器关闭的时候,服务器端的会话就销毁?
不会,默认保存30分钟后销毁
服务器关闭的时候,服务端的会话就销毁?
不会,服务器会将会话数据持久化到文件中(序列化)
钝化:
服务器正常关闭,会将内存session数据持久化到服务器磁盘上,类似于序列化对象过程
序列化磁盘位置:tomcat\work\Catalina\localhost\项目名\SESSIONS.ser
激活:
服务器启动时,会将磁盘数据恢复到内存会话域对象中,类似于反序列化对象过程
作用:
在cookieJSESSIONID有效的情况下,正常重启服务器会话数据经过钝化与激活依然可用。防止因为服务器重启会话数据丢失的问题。
注意:
1.idea无法演示钝化与激活,必须将项目部署到正式tomcat上,单独启动与关闭服务器测试才有效。因为idea部署的机制先删除所有数据再进行部署,这个删除会将序列化文件也删除了
2.由于进行序列化与反序列操作,需要会话的中的对象数据所属的类实现可序列化接
6、扩展:禁用Cookie的解决方案
禁用Cookie后的问题
无法得到原来会话中的信息,每次请求都是新的会话session对象
使用url重写解决cookie禁用依然使用旧的session会话数据
servlet1
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//目标:使用url重写解决cookie禁用依然使用旧的session会话数据
//需求:在Servlet1得到会话对象写入数据,跳转到Servlet2读取旧会话数据
//1.创建session
HttpSession session = request.getSession();
//2.写入数据
session.setAttribute("username","admin");
//字符串拼接
String sessionId = session.getId();
response.sendRedirect(request.getContextPath() + "/Servlet2;jsessionid=" + sessionId);
//response.sendRedirect(request.getContextPath() + "/Servlet2");
/* //使用url重写解决
String url = response.encodeURL(request.getContextPath() + "/Servlet2");
//实现原理:就是在这个路径request.getContextPath() + "/Servlet2"后面拼接“;jsessionid=sessionid”
//3.跳转到Servlet2去读取展现
response.sendRedirect(url);*/
}
}
servlet2
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 目标:读取session中的数据输出
* */
//1.获取session
HttpSession session = request.getSession();
//2.读取数据
String username = (String) session.getAttribute("username");
//3.打印输出
response.getWriter().print("username="+username);
}
}