session对象
session对象使用来在同一个用户的不同请求之间传递信息的。每个网站都会为每个用户在登录后创建一个session对象。
原理
用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的JSESSIONID使用cookie技术存储到浏览器中,保证用户的其它请求能够获取到同一个session对象,也保证了不同请求能获取到共享的数据。
特点
- 在服务端创建
- 存储在服务端
- 依赖cookie技术
- 一次会话(session的生命周期 )
作用域
- 一次会话
- 在JESSIONID和session对象不时效的情况下,整个项目内。
使用
创建session对象/获取session对象(都用同一句代码)
HttpSession hs = req.getSession();
- 如果请求中有session的标识符也就是JSESSIONID,则返回对应的session队形
- 如果请求中没有session的表示符也就是JESESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储在浏览器(如下图1)
- 如果session对象失效了,也会重新创建一个session对象,并将JSESSIONID存储在浏览器内存中
获取JSESSIONID
hs.getId();
设置Session时间
hs.setMaxInactiveInterval(int seconds);
注意:在指定时间(默认30min)内session对象没有被使用,则销毁。如果使用了则重新计时。
修改默认session生命周期
在项目的web.xml内(也可以是tomcat下的web.xml,那对所有的项目生效,优先级低),添加如下代码(单位:秒):
<session-config> <session-timeout>30</session-timeout> </session-config>
强制失效
hs.invalidate();
使用session存取数据
- 存储:hs.setAttribute(String name ,Object obj);
- 获取:hs.getAttribute(String name);//返回类型为object
- 注意:存储的动作和取出的动作发生在不同的请求中,存储要先于取出
注意:JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效。
小案例1
为了验证session可以在同一用户的不同请求中传递信息,我们来做这样一个小案例:SessionServlet创建session,然后看看Session2Servlet能不能拿到SessionServlet设置的session的JSESSIONID。
SessionServlet
package com.xiaohei.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class SessionServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应编码格式 resp.setContentType("text/html;charset=utf-8"); //获取请求信息 String anme = "张三";//假设我们获取到 //处理请求 //创建session对象 HttpSession hs = req.getSession();//即是创建也是获取,取决于请求里面有没有session的id System.out.println(hs.getId());
//设置时间
hs.setMaxInactiveInterval(30*60);//单位:秒
// 响应 //直接响应 resp.getWriter().write("session学习"); } }
Session2Servlet
public class Session2Servlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("session2Servlet"+req.getSession()); } }
运行SessionServlet
可以看到首次运行设置了一个cookie:JSESSIONID=xxxxx;
运行Session2Servlet
可以看到在请求中携带的cookie:JSESSIONID与上面一致,说明了他们访问的是同一个session对象。
小案例2
请看下一篇文章