一、HttpSession:客户端打开浏览器连接服务端后生成一个会话(HttpSession对象),直到浏览器关闭此对象才销毁;
//底层依赖Cookie,或是URL重写;
//session的生成和销毁均有tomcat执行,程序员无法干预,且和jvm的gc机制也无关;
二、获取HttpSession:
(1)HttpSession request.getSesssion();//如果存在则获取,不存在则创建;
(2)HttpSession request.getSession(boolean);
//true:与(1)一样
//false:存在则获取,不存在返回null;
三、操作属性方法:
1.设置属性:void setAttribute(String name, Object object);//多次调用同个name属性会覆盖;
2.获取属性:Object getAttribute(String name);//获取没设置过的属性名返回null;
3.删除属性:void removeAttribute(String name);
4.获取所有本域的属性名:Enumeration getAttributeNames();
四、其他常用方法:
(1)获取sessionId:String getId();
//sessionid在http头中的格式:Set-Cookie: JSESSIONID=7FC9BB641898ABC83A34B8DB972B3629;
(2)获取最大不活动时间:int getMaxInactiveInterval();
//返回单位秒;默认为30分钟;如果30分钟没有使用,tomcat会自动在session池中移除这个session;
(3)设置最大不活动时间:void setMaxInactiveInterval(int interval);
//设置单位秒;0或负数表示永远不超时;
(4)返回session创建的时间:long getCreationTime();//返回单位毫秒;
(5)返回session的最后活动时间:long getLastAccessedTime();//返回单位毫秒;
(6)重置session:void invalidate();//强制失效,且重新生成新的session;//场景用户注销功能;
(7)查看session是否为新:boolean isNew();
//当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新。
1)web.xml配置:
<?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"> <servlet> <servlet-name>Test</servlet-name> <servlet-class>com.qf.controller.Test</servlet-class> </servlet> <servlet-mapping> <servlet-name>Test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> </web-app>
2)测试类:
public class Test extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); //获取sessionId String JSESSIONID = session.getId(); System.out.println(JSESSIONID); //获取最大不活动时间 int maxInactiveInterval = session.getMaxInactiveInterval(); System.out.println(maxInactiveInterval); //设置最大不活动时间 session.setMaxInactiveInterval(60); System.out.println(session.getMaxInactiveInterval()); //返回session创建的时间 System.out.println(session.getCreationTime()); //返回session的最后活动时间v System.out.println(session.getLastAccessedTime()); //重置session session.invalidate(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
五、配置最大不活动时间:
<session-config> <session-timeout>30</session-timeout> </session-config>
六、设置session关闭浏览器后还保存:
@WebServlet("test") public class Test extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); String JSESSIONID = session.getId(); Cookie cookie = new Cookie("JSESSIONID", JSESSIONID); cookie.setMaxAge(30 * 60); resp.addCookie(cookie); } }
注意点:不能直接修改名为JSESSIONID的值,因为不是相同的对象,需要自己构建JSESSIONID对象;
七、session失效方法小结:
(1)等待30min;
(2)设置setInactiveInterval();//单位分;
(2)修改web.xml的<session-config>标签;
(4)调用invalidate()方法;
(5)清空浏览器上所有的Cookie;