cookie被禁止后怎样使用session的解决方案

cookie被禁止后怎样使用session的解决方案

1. 方法

禁止使用cookie

response.encodeURL("http://www.laozizhu.com");    
response.encodeRedirectURL("http://www.laozizhu.com");    

判断是否成功

url 后面出现一个小尾巴,即成功
;JSESSIONID=fjsdklafjdsfsldkafjlsf?type=1

2. 原理

当程序为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应返回给客户端保存。 保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于 SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。

  1. 经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。
  2. 还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
<form name=”"testform”" action=”"/xxx”"> 
     <input type=”"hidden”" name=”"jsessionid”" value=”"ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764″”/>
     <input type=”"text”"> 
    form>

Servlet 容器为 HttpSession 分配一个唯一标识符,称为 Session ID。Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中(当前内存或者磁盘中)。

每次客户发出 HTTP 请求时,Servlet 容器能够从 HttpRequest 对象中读取 Session ID,然后根据 Session ID 找到相应的 HttpSession 对象,从而获取客户的状态信息。

禁用 cookie 后,Servlet 容器无法取得 Session ID

解决方案是

Servlet 容器能够重写客户请求的 URL,把 Session ID 添加到 URL 信息中,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session。

重写的方法

public java.lang.String encodeURL(java.lang.String url)

该方法的实现机制为:

  • 先判断当前的 Web 组件是否启用 Session,假如没有,直接返回参数 url。
  • 再判断 客户端浏览器 是否支持 Cookie,假如支持,直接返回参数 url;假如不支持 ,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。

网页链接写法

 // 存在隐患(禁用cookie后出现)
     

 // 修改后:
     “>

参考

PHP–浏览器禁用cookie后,怎么使用session

你可能感兴趣的:(Servlet)