1. 简介
Session即HttpSession,主要用来保存用户信息
由服务器创建,保存在服务器
Session 也是jsp 的一个内置的域对象,
2. 运行原理
浏览器向服务器发送请求时,服务器会创建一个Session对象,并且这个Session对象具有唯一id
同时服务器也会创建一个cookie对象,会将Session对象的id赋值到Cookie中, name = "JSESSIONID", value = id
服务器会将这个Cookie对象发送给浏览器
浏览器在之后发送请求时,都会携带这个Cookie对象
服务器根据Cookie对象中的的JSESSIONID的值,获取对应的Session的id值,从而匹配session对象,区分不同的用户。
特点
Session中的id是自动添加的,name 和 value需要设置
存放Session id Cookie 的JSESSIONID 是自动创建的
3.创建、获取与删除
3.1 创建
对于html页面,需要在Servlet中手动创建
HttpSession session = request.getSession();
对于jsp页面,会自动创建session,因为JSP初始化的时候,会先解析成一个java文件,在其对应的类中会调用 jspServer() 初始化session对象
final javax.servlet.jsp.PageContext pageContext;javax.servlet.http.HttpSession session = null;
request.getSession() 创建 or 获取session的依据
看浏览器发送请求所携带的Cookie中是否有JSESSIONID
有,则获取
没有,创建一个新的Session对象
3.2 取值
Servlet中获取
Object name = request.getSession().getAttribute("name");
在jsp中获取
${sessionScope.name}
3.3删除
removeAttribute()
HttpSession session = request.getSession();// 删值不删键session.removeAttribute("name");
invalidate()
// 1.删除session// 2.创建一个新sessionrequest.getSession().invalidate();
4. 活化与钝化
Session的钝化:服务器关闭时,把内存中的Session及其数据 序列化到磁盘的过程 因此当存放的value是一个对象时,该对象要先实现序列化接口(Serializable),否则这个值会钝化失败
Seesion的活化:服务器启动时,把磁盘中保存的数据反序列化到内存中的过程
idea中的活化,重启服务器,idea会将本地中保存的项目文件信息先删掉再重新创建,这一过程会导致钝化时保存的Session文件删掉,因此可以更改Session钝化时产生的文件夹位置,解决idea活化失败的问题
在本地Tomcat的/conf 下的context.xml文件的Context节点下添加
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"> <Store className="org.apache.catalina.session.FileStore" directory=w/></Manager>
5. Session持久化
浏览器关闭Session消失原因: Cookie是会话级别的,Cookie没了导致JSESSIONID找不到了=> Session消失
5.1 在web.xml全局配置
配置全部的Seeion最大有效时间,单位:分钟
<session-config> <session-timeout>3</session-timeout></session-config>
5.2 配置当前Seeion
单位:秒
HttpSession session = request.getSession();// 配置最大有效时间session.setMaxInactiveInterval(20);
在jsp中获取Session最大有效时间
${pageContext.session.maxInactiveInterval}
5.3 持久化JSESSIONID
Cookie[] cookies = request.getCookies();if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("JSESSIONID")) { cookie.setMaxAge(60 * 30); response.addCookie(cookie); } }}
6. application 于session的区别
application 存放于获取数据
// 存放getServletContext().setAttribute("msg", "乔布斯入职锤子科技");// 获取Object msg = getServletContext().getAttribute("msg");
session是会话变量,基于个人用户的,对单个用户有效,默认的有效时间是30分钟,也可以设置最大有效时间。在一个web应用中可以有多个session对象,每个用户对应了一个session对象
application是全局变量,是基于整个web应用的,对所有用户有效。在服务器启动时创建,服务器停止时销毁。一个web应用只有一个application对象。
7. cookie与session的区别
Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端
Cookie有大小限制,浏览器所存储的cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关
Cookie只能保存字符串数据,Session可以保存任意类型数据
Cookie有安全隐患,通过拦截或本地文件找到你的cookie后可以进行攻击
Session是有保存在服务器端上会存在一段时间才会消失,如果Session过多会增加服务器的压力