HttpSession简介
与客户端技术不同,HttpSession是服务端技术。在Web开发中,服务器为每个浏览器(客户端)创建一个特有的HttpSession对象。我们可以将数据(不仅仅是字符串还可以是对象)存入到HttpSession对象中,当用户通过浏览器访问当前应用下的其它程序时,其它程序仍然可以从HttpSession中取出数据。
HttpSession由服务端创建,我们在Servlet中可以通过request.getSession()得到该对象。
在同一个会话下(即同一浏览器中)多个Servlet可共享数据,比如我们在登录后可以将User数据存入到服务端为其创造的HttpSession中,我们在付款页面可以直接从HttpSession中去获取User以判断用户当前是否是登录状态的。
服务器重启不会使HttpSession中的数据丢失。
HttpSession常用方法
列举它的常用方法:
- setAttribute(),向HttpSession中保存数据;
- getAttribute(),从HttpSession中获取数据;
- removeAttribute(),从HttpSession中移除数据;
- getId(),返回HttpSession的唯一标识符;
- setMaxInactiveInterval(),设置session的存活时间(单位是秒),默认为30分钟;
- invalidate(),销毁HttpSession。
HttpSession举个例子
我们来写个伪代码来在结账时判断用户是否已经登录了。
登录LoginServlet,结账PayServlet,用户User。
先贴代码:
LoginServlet.class
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
HttpSession session = request.getSession(true);
final String name =request.getParameter("name");
final String password = request.getParameter("password");
final User user = new User(name, password);
session.setAttribute(LOGIN_SESSION, user);
System.out.println("保存Session成功!");
}
PaySession.class
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
HttpSession session = request.getSession();
Object obj = session.getAttribute(LoginServlet.LOGIN_SESSION);
if( obj==null ){
System.out.println("请先登录!");
return;
}
if( obj instanceof User ){
User user = (User) obj;
System.out.println("已经登录了");
System.out.println(user.getName() + ":" + user.getPassword() );
}
}
我们先描述一下需求:
1.直接调用PayServlet,看看是否能支付成功(应该提醒未登录);
2.调用LoginServlet登录,设置用户名和密码;
3.再调用PayServlet,这次应该能登陆且打印登录信息;
我们来看一看实际情况
// 1. 在浏览器中打开链接
http://localhost:8080/MyHttpSession/servlet/PayServlet
发现提示"请先登录!",和预期一致
// 2. 再登录,在浏览器打开链接
http://localhost:8080/MyHttpSession/servlet/LoginServlet?name=qdl&password=qi123456
发现提示"保存Session成功!"
// 3. 再次付款打开链接
http://localhost:8080/MyHttpSession/servlet/PayServlet
发现提示
"已经登录了"
"qdl:qi123456"
和预期一致
// 4.我们销毁一下HttpSession然后将其存活时间改为10s
执行步骤1-2-3,然后重复执行3,发现刚开始提示已经登录,不一会变成了请先登录的提示了,这时说明HttpSession失效了
另外虽然我们设置的失效时间为10s,但是实际测试时感觉时间有些许偏差。
注意
我们不仅仅可以调用session.setMaxInactiveInterval()方法来设置session的失效时间,还可以在web.xml中设置,如下:
<!-- 以秒为单位 -->
<session-config>
<session-timeout>10</session-timeout>
</session-config>