Session
1. 什么是Session
服务器端为了保存用户状态而创建的一个特殊的对象
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
2. Session和Cookie的主要区别
首先了解几个概念:
-
无状态的HTTP协议
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
-
会话(Session)跟踪
会话,指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买。
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。
常用的会话跟踪技术是Cookie与Session。
所以它们有以下几个区别:
-
Cookie通过在客户端记录信息确定用户身份,cookie数据存放在客户的浏览器上
Session通过在服务器端记录信息确定用户身份,session数据放在服务器上
-
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
-
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
-
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
-
可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中
3. Session工作原理
当浏览器访问服务器时,服务器创建session对象(该对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId以cookie的方式发送给浏览器。
当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据该sessionId找到对应的session对象。
...
response.setCharacterEncoding("UTF=8");
response.setContentType("text/html;charset=UTF-8");
//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//将数据存储到session中
session.setAttribute("data", "username");
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
response.getWriter().print("session创建成功,session的id是:"+sessionId);
} else {
response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);
}
...
4. 如何获取session对象
-
方式一
HttpSession session = request.getSession(boolean flag);
HttpSession是一个接口,session对象是一个符合该接口的对象。
-
当flag为true时
先查看请求当中有没有sessionId,如果没有则创建一个session对象。如果有sessionId则根据该sessionId查找对应的session对象,如果找到了则返回该对象;如果找不到则创建一个新的session对象。
-
当flag为false时
先查看请求当中有没有sessionId,如果没有返回null。如果有sessionId,则依据该sessionId查找对应的session对象,如果找到了,则返回该session对象,没找到则返回null。
![session](C:\Users\tarena\Desktop\学习笔记\Servlet & JSP\知识点\img\Session\session.png)
-
-
方法二
//等价HttpSession session = request.getSession(true); HttpSession session = request.getSession();
-
常用方法
//设置绑定值 setAttribute(String name,Object obj); //根据name获取绑定值 Object getAttribute(String name); //如果绑定名对应的值不存在,返回null //删除session removeAttribute(String name); //获取session的Id String getId();
5. 浏览器禁用Cookie后的session处理
-
解决方案:URL重写
//用于对sendRedirect方法后的url地址进行重写 response.encodeRedirectURL(java.lang.String url); //用于对表单action和超链接的url地址进行重写 response.encodeURL(java.lang.String url)
所以,当浏览器禁用了cookie后,就可以用URL重写这种解决方案解决Session数据共享问题。而且上面两个方法是两个非常智能的方法,当检测到浏览器没有禁用cookie时,那么就不进行URL重写了。
6. session对象的创建和销毁时机
6.1. session对象的创建时机
在程序中第一次调用request.getSession()
方法时就会创建一个新的Session,可以用isNew()
方法来判断Session是不是新创建的
//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);
}
6.2. session对象的销毁时机
session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间,例如:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 设置Session的有效时间:以分钟为单位-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
当需要在程序中手动设置Session失效时,可以手工调用session.invalidate
方法,摧毁session:
HttpSession session = request.getSession();
//手工调用session.invalidate方法,摧毁session
session.invalidate();
7. Session超时
-
什么是session超时
服务器会将空闲时间过长的session对象删除掉。
服务器缺省的超时时间长度一般是30分钟。
-
如何修改超时时间长度
-
修改web.xml文件中的配置
<!-- 重启生效 --> <session-config> <session-timeout>30</session-timeout> </session-config
-
方法调用
//两次请求间的最大间隔 setMaxInactiveInterval(int seconds)
-
-
立即删除
session.invalidate();
8. session验证
-
在登陆成功之后,绑定一些数据到session对象上。比如:
session.setAttribute("user",user);
-
当用户访问需要保护的资源时(即只有登录成功之后才能访问的资源,比如,访问success.jsp),进行session验证
Object user = session.getAttribute("user"); if(user == null){ //没有登录 response.sendRedirect("login.jsp"); }