zoukankan      html  css  js  c++  java
  • 【Head First Servlets and JSP】笔记12:URL重写

    1、会话管理的核心在于“交换会话ID”,来回传递cookie是最简单的方法,容器通过客户端发来的JSSESIONID查找匹配的对话。

    2、如果浏览器禁用了cookie,那就意味着浏览器将忽略响应首部中的set-cookie,cookie都设置不了,那么浏览器拿什么信息去“匹配会话”呢?

    3、解决这个问题的方法就是URL重写,每次切换页面都把“会话ID”添加到URL的后面,容器利用这个“URL后缀信息”去匹配会话。

    • 客户端<——url重写(类似于set-cookie,只不过形式不同)——服务器

    • 客户端——url重写(携带着jsession后缀到服务器认证)——>服务器,提取url后缀信息查找对应回话

    4、cookies就是一些字典、键值对,存在于客户端本地、由HTTP请求的首部携带;

    session存在于服务端JVM中,是一个存储会话信息的对象,需要对应的JSESSIONID查找、访问。

    5、url重写的流程分析。这是进行URL重写的登陆程序,

         if(userID.equals(user) && password.equals(pwd)){
                HttpSession session = request.getSession();
                // 创建一个session,同时向response添加一个含有JSESSIONID的cookie
                // 相当与执行了 request.createSession(); response.addCookie(new Cookie("JSESSIONID", 7DDE0B5AB1BECF68DCDC46F56619F0ED));
                session.setAttribute("user", "Pankaj");
    
                session.setMaxInactiveInterval(30*60); //setting session to expiry in 30 mins
                Cookie userName = new Cookie("user", user);
                response.addCookie(userName);
    
                String encodedURL = response.encodeRedirectURL("LoginSuccess.jsp");
                // 编码重定向URL
                response.sendRedirect(encodedURL);
            }

     没有进行URL重写的程序,

            if(userID.equals(user) && password.equals(pwd)){
                HttpSession session = request.getSession();
                session.setAttribute("user", "Pankaj");
                //setting session to expiry in 30 mins
                session.setMaxInactiveInterval(30*60);
                Cookie userName = new Cookie("user", user);
                userName.setMaxAge(30*60);
                response.addCookie(userName);
                response.sendRedirect("LoginSuccess.jsp");
    我们发现,除了String encodedURL = response.encodeRedirectURL("LoginSuccess.jsp");这一句外两者没有任何差别,但是,对于程序2而言,一旦浏览器禁用cookie将完全无法使用,
    而对于程序1,不论是否禁用cookie都一样能用,url重写的好处就很明显了。
    观察一下程序1的运行状况,当我们成功登陆的时候,可以看到url栏的变化:

    ——————登陆后,将变化为——————>
     

     6、在我们一般使用电脑的使用,cookie都是未禁用的,url重写只是作为一个“后备方法”!只有在cookie禁用的时候才生效,就实现URL重写的代码而言,并不需要加很多的代码,简单的encodeURL就好了。

    7、另外一些问题:

    1. Q:既然url重写只是后备方法,那么容器怎么知道何时启用url重写?A:容器在第一次与客户端通信的时候会同时使用两种方式(cookie和url重写),以此作为一种安全的“试探”,认真观察一下Java Servlet中的会话管理——URL重写中程序的运行情况就很清楚了,第一次切换页面url一定会重写
    2. url重写只存在于动态页面。这里需要考虑一个性能问题。
    3. 特定的Web容器解析特定的“重写的URL”,例如Tomcat解析的重写URL的分隔符是;号。
    4. URL编码只与响应有关。切不可在request上调用encodeURL!


  • 相关阅读:
    IE6IE9兼容性问题列表及解决办法总结
    正则表达式笔记:提取C#代码中的中文信息,双引号,尖括号间的信息
    IE6IE9兼容性问题列表及解决办法_补遗漏之一:button的type默认值改变为submit了。
    IE6IE9兼容性问题列表及解决办法_补充之三:Table的Col不再支持style及align,需要到th, td中去设置
    再谈IE的浏览器模式和文档模式
    WebRequest, WebResponse , HttpWebResponse, HttpWebResponse , WebClient笔记
    IE6IE9兼容性问题列表及解决办法_补遗漏之二:CSS区分大小写,Style中height需要加px
    VS2010的智能提示没有了的可能原因
    IE6IE9兼容性问题列表及解决办法_补充之四:HTC (Html Components) 功能逐渐被IE抛弃
    LINQ to XML 笔记,确实比DOM好用,方便。
  • 原文地址:https://www.cnblogs.com/xkxf/p/6959413.html
Copyright © 2011-2022 走看看