jsp中使用URL重写跟踪Session,浏览器不支持Cookie的解决方案

http://blog.csdn.net/linbooooo1987/article/details/12843823

大家都知道session关浏览器就会清除(即使sessionid会写到客户端的 cookie中),如果浏览器新建一个父窗口,在原窗口不关闭的情况下,共享一个sessionId。在一次会话中,session是基于cookie 的,也就是说当cookie被删除时,session又会创建。当客户端禁掉cookie时,就要通过URL重写获取sessionId,且 sessionId不会改变。

HttpServletResponse接口提供了encodeURL(String url)实现URL地址重写。例如:
<a href=”<%= response.encodeURL(“index.jsp?c=1&wd=Java”) %>”>Homepage</a>


该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动输出来。如果客户端不支持Cookie,则会将用户Session的ID重写到URL中。重写后的输出可能是这样的:

http://localhost:8080/xxx/index.jsp;jsessionid=091A82E070579D3FA881FE901E532422?c=1&wd=Java
其中jsessionid后面跟的就是session.getId()的值,这样session就可以使用了。


清掉request携带的所有cookie

Cookie[] cookies = request.getCookies();
for(int i = 0; i < cookies.length; i++){
   cookies[i].setMaxAge(0);
   response.addCookie(cookies[i]);
}

不管是encodeURL还是encodeRedirectURL都要判断是否需要添加sessionid  例如 String str=response.encodeURL("index.jsp"); 变量str保存的值为

index.jsp;jsessionid=A9B0F04345178E7BDC3626EAF666D34C 如果没有禁用Cookie,刷新浏览器str为index.jsp.
出现以上情况是因为session 与cookie 成对使用的.第一次访问页面时cookie中sessionid没有值(或者值为空)故encodeURL认为需要添加jsessionid需要传递session对象,重写了URL但是在没有禁用cookie浏览器中第一访问页面时cookies对象会保存sessionid 故再次刷新不再需要重写URL.

 

session 对象能和客户建立意义对应的关系依赖于客户的浏览器是否支持cookie,如果客户的浏览器不支持的话,那么客户再不同网页之间的session对象可能 时互不相同的,因为服务器无法将ID存放到客户端,就不能建立session对象和客户的一一对应关系。可以通过URL重写来实现session对象的唯 一性。所谓URL重写就是当客户从一个页面重新连接到一个页面时,通过向这个新的URL添加参数,把session对象的id传过去,这样能够保证 session对象是完全相同的。可以使用response对象调用encodeURL()或encodeRedirectURL()方法实现URL重 写。

eg:

String str=response.encodeURL("hope.jsp");  //使用在jsp页面中。

连接目标写成:<%=str%>即可。

encodeURL()是本应用级别的,encodeRedirectURL()是跨应用的。  

 两者的区别:

在使用重定向时,response.sendRedirect(response.encodeRedirectURL(***));时一定要使用encodeRedirectUrl();

由于附加在URL中的session ID是动态产生的,对每一个用户是不同的,所以对于静态页面的相互跳转,URL重写机制无能为力。当然可以通过将静态页面转换为动态页面解决。


方 法的执行:首先判断当前的Servlet是否执行了HttpSession对象的invalidate()方法(当前session是否失效,失效后重新 建立新的session),如果已经执行返回参数URL。接下来判断客户端是否禁用了Cookie,没有禁用直接返回参数URL,如果禁用,则在参数 URL中附加session ID,返回编码后的URL。

原文地址:https://www.cnblogs.com/ttjava/p/3641038.html