之前我们介绍的cookie是把用户的身份信息存在了客户端,而session说白了就是把用户的信息保存在了服务端。由于session是保存在了服务端,所以当用户关闭浏览器时session并不会消失。一般session保存在服务器的内存中当然也可以持久化到硬盘或者数据库中。session的默认过期时间是30分钟,过期的session会被服务器自动的销毁。注意如果大量的创建session可能导致服务器的内存溢出。
一、session的创建流程
当客户端浏览器访问服务器时,服务器会先检查该请求是否携带一个叫JESESSIONID的cookie,如果存在会根据JESESSIONID的cookie值获取存放在服务器端的session值;如果不存在会新建一个session然后把sessionId写到cookei中返回给浏览器,下次浏览器访问时就会携带这个cookie。
图片的来源地址:http://blog.tommyyang.cn/img/session/processofsession.png
在javaweb开发中我们使用HttpServlet对象获取session,session也是一个域对象可以通过setAttribute方法和getAttribute方法获取存储在session中的值。代码如下:
public class TestSessionServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); response.setCharacterEncoding("utf-8"); response.setHeader("content-type","text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); String loginName = (String) session.getAttribute("loginName"); String sessionId = session.getId(); if(StringUtils.isEmpty(loginName)){ session.setAttribute("loginName","张三"); writer.println("session中没有值!"); }else{ writer.println("loginName="+loginName); } writer.println("sessionId="+sessionId); writer.close(); } }
用户第一次访问时:
服务端没有session会在给浏览器响应时添加一个cookie,当用户第二次访问时:
会携带这个cookie。当浏览器被禁用cookie后服务器端可以通过重写URL地址实现sessionId的传递。在java中我们使用HttpServletResponse对象的encodeURL(java.lang.String url)方法和encodeRedirectURL(java.lang.String url)方法实现URL的重写,其中前者是对表单action和超链接的url地址进行重写,后者是对重定向后的地址进行重写。
二、session的销毁
session默认的过期时间是30分钟,当然这个过期时间也可以我们自己来修改但是我们一般不会修改session的过期时间而是手动让session失效只需要调用HttpSession对象的invalidate方法即可。