javaweb开发中的session

    之前我们介绍的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方法即可。

 

posted @ 2019-09-11 14:29  牧神风  阅读(5531)  评论(0编辑  收藏  举报