实现会话跟踪的几种方式

实现会话跟踪的几种方式

  • 使用Cookie
  • URL 重写
  • 隐藏的表单域
  • HttpSession
  • Cookie和Session的的区别

使用Cookie

向客户端发送Cookie

Cookie c = new Cookie("key","value"); //创建Cookie 
c.setMaxAge(60*60*24*7); //设置最大时效,此处设置的最大时效为7天
response.addCookie(c); //把Cookie放入到HTTP响应中

从客户端读取Cookie

String name ="key"; 
Cookie[]cookies =request.getCookies(); 
if(cookies !=null){ 
   for(int i= 0;i<cookies.length;i++){ 
    Cookie cookie =cookies[i]; 
    if(name.equals(cookie.getName())) 
    	String val = cookie.getValue(); 
   }
 }

优点: 数据可以持久保存,不需要服务器资源,简单

缺点: 大小受到限制,用户可以禁用Cookie功能,由于保存在本地,有一定的安全风险

URL 重写

在URL中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以标识一个会话。

优点: 在Cookie被禁用的时候依然可以使用
缺点: 必须对网站的URL进行编码,所有页面必须动态生成,不能用预先记录下来的URL进行访问

隐藏的表单域


优点: Cookie被禁时可以使用

缺点: 所有页面必须是表单提交之后的结果。

HttpSession

在所有会话跟踪技术中,HttpSession对象是最强大也是功能最多的。
当一个用户第一次访问某个网站时会自动创建 HttpSession,每个用户可以访问他自己的HttpSession。
可以通过HttpServletRequest对象的getSession方法获得HttpSession,
通过HttpSession的setAttribute方法可以将一个值放在HttpSession中,通过调用 HttpSession对象的getAttribute方法,
同时传入属性名就可以获取保存在HttpSession中的对象。
与上面三种方式不同的 是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,
即使目前的Servlet容器可以在内存将满时将HttpSession 中的对象移到其他存储设备中,但是这样势必影响性能。
添加到HttpSession中的值可以是任意Java对象,这个对象最好实现了 Serializable接口,
这样Servlet容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。

Cookie和Session的的区别

Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。

Cookie 一般用来保存用户信息,比如
①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了
②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写)
③登录一次网站后访问网站其他页面不需要重新登录

Session 的主要作用就是通过服务端记录用户的状态
典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的
服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端

Cookie 存储在客户端中,而Session存储在服务器上,相对来说Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密

你可能感兴趣的:(Java,Web)