Cookie->Session->Token的发展旅程(一)

前言

JAVA WEB项目可分为无状态与有状态。一个商城,用户添加购物车或者下订单这种操作,都是有状态的,服务器为了区分不同用户的操作,需要记录一些特殊的信息。当用户再次访问时,携带这些信息,服务器就可以区分出用户做了哪些操作。从最早的Cookie到后来的Session,再到后来的Token,本文带你了解这段发展旅程。

Cookie概念

你有没有碰到过这种情形,之前在搜索引擎搜索过一些商品,之后连着几天都会有各种广告推送相关的商品。这是因为之前浏览网页的时候,服务器发送了一些信息记录在你的计算机上,下次再次光临网站时,服务器会先看看请求中有没有这些信息,有的话就会推送特定的网页内容。上面提到的信息就是Cookie。

Cookie是由服务器生成,发送给浏览器,浏览器会将Cookie中的key/value保存到某个目录下的文件中。下次访问时携带Cookie发送到服务器。

Cookie的属性主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。

1)Name 和 Value 属性由程序设定,默认值都是空引用。

2)Domain属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。

3)Path属性的默认值是根目录,即 ”/” ,不管发出这个cookie的页面在哪个目录下的。可以由程序设置为一定的路径来进一步限制此cookie的作用范围。

4)Comment属性,注释。

5)version属性。

6)maximum age:属性,单位是秒如果是0,说明要删除。

public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        Cookie cookie=new Cookie("name","Tom");        //设置Maximum Age        cookie.setMaxAge(1000);        //设置cookie路径为当前项目路径        cookie.setPath(request.getContextPath());        //添加cookie        response.addCookie(cookie);    }
public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        PrintWriter out=response.getWriter();        Cookie[] cookies=request.getCookies();        if(cookies!=null){            for(Cookie cookie:cookies){                String name=cookie.getName();                String value=cookie.getValue();                out.write(name+"="+value);            }        }    }

 

Session

Cookie保存在浏览器中,所以有可能被篡改。保存在服务器上的Session应运而生。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

每个用户访问服务器都会建立一个session,那服务器是怎么标识用户的唯一身份呢?事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。

HttpSession session = request.getSession();List<Book> list = (List) session.getAttribute("list");
 HttpSession session = request.getSession();         //将数据存储到session中         session.setAttribute("data", "孤傲苍狼");         //获取session的Id         String sessionId = session.getId();         //判断session是不是新创建的         if (session.isNew()) {             response.getWriter().print("session创建成功,session的id是:"+sessionId);         }else {             response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);         }

  

session产生一个sessionId,可以由浏览器的Cookie保存。 如果客户端禁用了cookie,通常有两种方法实现session而不依赖cookie。

1)URL重写,就是把sessionId直接附加在URL路径的后面。

2)表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如: 

<form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> <input type="text"> </form> 

Session共享:

对于多网站(同一父域不同子域)单服务器,我们需要解决的就是来自不同网站之间SessionId的共享。由于域名不同(aaa.test.com和bbb.test.com),而SessionId又分别储存在各自的cookie中,因此服务器会认为对于两个子站的访问,是来自不同的会话。解决的方法是通过修改cookies的域名为父域名达到cookie共享的目的,从而实现SessionId的共享。带来的弊端就是,子站间的cookie信息也同时被共享了。  

总结

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页