Session Cookie

    先贴两篇好帖子

    https://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html

    https://www.cnblogs.com/woshimrf/p/5317776.html

    http://blog.csdn.net/lingadobe/article/details/53193008

    看完这两篇基本就基本明白了Session和Cookie的关系,这里再做个归纳。

1.Session的创建来自于java程序中request.getSession(),如果没写这句话,则ResponseHeader中不会有setCookie,自然客户端也没有名为JSESSIONID的Cookie。

所以没有调用getSession方法则不会创建session。 

Session的销毁只有两种情况: 

第一:session调用了 session.invalidate()方法。 (程序主动退出)

第二:前后两次请求超出了session指定的生命周期时间。 (关闭网页、断点时,需要SessionListener来监听session失效,执行某些操作如获取用户退出时间等,可以在web.xml中修改session过期时间)

那为什么浏览器关闭后再次访问网页会获得不同的sessionid呢?这样如何保存登录信息?sessionid到底有什么用?

关闭浏览器后,session并未销毁,但会话cookie是会消失的,那么存储JSESSIONID的cookie也没有了,自然request.getSession()会重新生成一个session,如果想连接到原来的session可以这样

//在servletA中设置cookie
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        session.setAttribute("name", "张三");
        out.println("创建一个session并放入姓名属性");
        //手动添加cookie,保存JSESSIONID信息
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        cookie.setMaxAge(60*30);//设置cookie的生命周期为30min
        response.addCookie(cookie);
    }


//在servletB中就可以正常访问session了
        public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        HttpSession httpSession = request.getSession();
        String name = (String) httpSession.getAttribute("name");
        out.println("name = "+name);
    }

只要我们手动为cookie中添加JSESSIONID信息,那么不管你的浏览器是否关闭,我的cookie中都会携带JSESSION信息,这样的话,服务器就一定能够找到对应的session,而不会重新建立一个新的session,这样只要session没有消亡,就一定可以访问到对应的session。

   sessionid只是用来确定是不是同一个session,在分布式系统中,将session存于redis中,每次会话客户端带cookie JSESSIONID=742C04200E64E469351A41C74608E6AA, 然后系统去redis中取这个session,就可以session.getAttribute("user"),获取session域上存储的值。



2.requset.getSession()其实默认为request.getSession(true),如果requestHeader中有sessionId,则直接取来用;没有则新增。可以用session.isNew()来判断是否为新建


3.session默认是存在服务器内存中,也可以用数据库redis等进行存储管理。

4.Cookie c = new Cookie(name,value);cookie肯定会有键值,还有路径等属性。可以通过response.addCookie(c)来给客户端发送自定义cookie。


5.session可以用来做简单的用户登录验证,进入网站时先判断是否登录

   if(request.getSession.getAttribute("user")==null)

    如果没有登录则要求登录,登录是判断用户名密码是否正确,正确则

request.getSession().setAttribute("user",user);

    注销 request.getSession.removeAttribute("user");

6.session做登录验证有个缺点,关闭浏览器后getSession又会重新生成一个新的session,导致原来的信息缺失,这时候就可以用cookie来替代session。

 判断登录:  request.getCookies()判断有没有cookie.getName=="user",有则cookie.getValue获得用户id

 登录成功:

Cookie c= new Cookie("user",user.getId()); // 一般cookie中只存不敏感信息,因为不安全
c.setMaxAge(1800); 
c.setPath("/");  
response.addCookie(c);

 注销:request.getCookies() 找到 cookie.getName=="user"   ,  c.setMaxAge(0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值