zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    HDU 5583 Kingdom of Black and White 水题
    HDU 5578 Friendship of Frog 水题
    Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
    hdu 5594 ZYB's Prime 最大流
    hdu 5593 ZYB's Tree 树形dp
    hdu 5592 ZYB's Game 树状数组
    hdu 5591 ZYB's Game 博弈论
    HDU 5590 ZYB's Biology 水题
    cdoj 1256 昊昊爱运动 预处理/前缀和
    cdoj 1255 斓少摘苹果 贪心
  • 原文地址:https://www.cnblogs.com/ttjava/p/3641038.html
Copyright © 2011-2022 走看看