05.Session

前言

如果说Cookie是保存在浏览器端的键值对数据,那么Session是保存在服务器端的键值对数据。对于一个新开的会话,服务器会开辟一块空间用来保存本次会话所要共享的数据,并返回一个sessionId,然后通过Cookie(“JSESSIONID”,sessionId)给浏览器保存。

  • 每个Session会分配一个SessionID;Session存储键值对
  • Sesson基于cookie,cookie保存sessionID以便找到对应的Session
  • Session数据存储服务端,Cookie数据存储客户端
  • Session与Cookie都有存活时间

Session原理

在这里插入图片描述

Session存取数据

session存数据的能力比cookie要强,session可以存储对象,cookie只能存储字符串,要存储对象要转化为json数据

//获取session对象
HttpSession session = request.getSession();
//存数据
//void setAttribute(String s, Object o)
session.setAttribute("country","中国");
//取数据
// Object getAttribute(String s)
session.getAttribute("country");
//获取session的编号jsessionId
String jsessionId = session.getId();

Session有效期设置

如果用户长时间未与服务端产生交互,服务端便会删除session。这个长时间tomcat默认是30分钟,当然可以更改这个时间。

setMaxInactiveInterval方法

void setMaxInactiveInterval(int i)//单位为秒

session.setMaxInactiveInterval(60*60);//session存活一小时

配置web.xml

单位为分钟,且必须为整数,如果是负数或零表示永不过期。

//存活60分钟
 <session-config> 
           <session-timeout>60</session-timeout> 
</session-config> 

配置tomcat配置文件

打开tomcat目录下conf/web.xml配置文件,找到session-timeout元素,单位为分钟

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

Session的注销

session对象的invalidate()方法可以删除属于自己的session,并删除所有数据。想要重新使用需要重新创建session。

 HttpSession session = request.getSession();
 session.invalidate();

Cookie被禁用,如何获取Session

URL重写和表单隐藏提交

URL地址重写的原理是将该用户Session的id信息重写到URL地址中,服务器能够解析重写后的URL获取Session的id。

//适合服务端重定向
String response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。
//适合前端向后端
String response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址重写

这两个方法都可以自动对原有的url路径上附件上sessionID,再返回重写后的url。

String url = request.getContextPath+"/login/?id="+id;
url = response.encodeRedirectURL(url);
//url = /MyWeb/login;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=5
 response.sendRedirect(url);
 //encodeURL方法适合前端表单action和超链接的url地址进行重写
url = response.encodeURL(url);
//前端获取url
<a href='"url"'>链接<a>

手动使用Cookie保存SessionId

每次关闭浏览器,再访问项目,服务器会分配一个新的sessionId
如果关闭浏览器之后,再启动,如何访问到之前的session的数据(session数据保存30分钟)。
这个需要手动使用Cookie保存SessionId,设置较长的Cookie存活时间,但Cookie的键是固定的,必须是JSESSIONID,服务端只认这个,它发现有这个键,就能顺利的重新找到session。

//1 获取session对象
 HttpSession session = request.getSession();
//2 获取session的编号jsessionId
String jsessionId = session.getId();
Cookie cookie = new Cookie("JSESSIONID",jsessionId);
//存活时间
cookie.setMaxAge(10*60);
//项目地址
cookie.setPath(request.getContextPath());
response.addCookie(cookie);

猜你喜欢

转载自blog.csdn.net/lglglglglgui/article/details/108545242
05
今日推荐