`

Tomcat 7源码学习笔记 -6 encodeURL深度解析补充

阅读更多

之前提到调用response.encodeURL(String url)方法的时候,如果客户端支持cookie,那么不做任何处理,直接返回传进去的url,因为jsessionid可以写入cookie中,所以不需要url重写。其实所说的客户端支持cookie并不严谨,因为在客户端支持cookie的情况下,调用response.encodeURL(String url)方法,也会遇到对传进去的url进行重写的情况。那么什么情况下会出现这个问题呢?请看下面:

 

客户端支持cookie,第一次访问某个servlet,这时servlet接收到的request的cookie中没有jsessionid信息,这时encodeURL内部会认为客户端不支持cookie,所以会重写传进去的url,即使你在请求url中手动添加了正确的;jsessionid=30A7F107A1E5B1E7250622C158244032信息,也仍然会重写传进去的url。

 

由此可以得出encodeURL内部的具体的判定规则:

request的cookie中是否有正确的jsessionid信息。

有的话,就不重写传进去的url。否则符合重写url的条件(当然还有其他条件也必须符合)。

 

从代码中也可以得出相同的结论:

 

boolean isEncodeable(final String location)方法中

 

if (hreq.isRequestedSessionIdFromCookie()) {
        return (false);
}

 

isRequestedSessionIdFromCookie()方法如下:

public boolean isRequestedSessionIdFromCookie() {

        if (requestedSessionId == null) {
            return false;
        }

        return requestedSessionCookie;
}

 requestedSessionId是指从客户端得到的jsessionid的值,具体采用cookie传递还是url传递都没关系。

1.如果requestedSessionId为空,说明客户端没有传入jsessionid,当然cookie中也没有,所以符合url重写的条件。

2.如果requestedSessionId有值,再进一步判断这个jsessionid是否是从cookie中取到的,如果是那么就不用重写url,否则重写。

 

上面这些分析可以看出:

1.servlet或者说tomcat其实是无法准确地获知浏览器是否禁用了cookie。

2.即使浏览器禁用了cookie,只要servlet里面创建了session,那么jsessionid同样会写入response的cookie,并返回给客户端,只是浏览器不往本地cookie中写,直接忽略掉了。

3.只要在request的cookie中没有找到jsessionid,那么就可以进行url重写。

 

最后,顺便看一下HttpServletRequest中的下面这几个方法:

public String getRequestedSessionId() //获取客户端传过来的jsessionid的值

public boolean isRequestedSessionIdFromCookie() //request的cookie中是否有jsessionid

public boolean isRequestedSessionIdFromURL() //request url中是否有jsessionid

 

那么,有一个问题,如果客户端的cookie中含有jsessionid,同时request url中也含有jsessionid,这时候会怎么样呢?

 

答案是:使用cookie中的jsessionid

1.优先判断cookie中有没有,cookie中有的话,就使用cookie中的jsessionid

2.如果cookie中没有,再看request url中有没有

 

isRequestedSessionIdFromCookie()返回 true

isRequestedSessionIdFromURL()返回 false

 

分享到:
评论
1 楼 jacktao219 2016-01-06  
赞一个! 好文,但实际测试后发现第一次 浏览器也木有把url rewrite。。

相关推荐

    EncodeDecode经典加密解密+VB源码.rar

    EncodeDecode经典加密解密+VB源码.rarEncodeDecode经典加密解密+VB源码.rarEncodeDecode经典加密解密+VB源码.rarEncodeDecode经典加密解密+VB源码.rar

    php二维码扩展库exqrcode.zip

    $instance->setSize(7); //$instance->setDpi(72); $instance->encodeGeneral("hello world"); var_dump($instance->writeToFile("/tmp/qrgeneral.png")); $instance->encodeUrl("http://www.baidu.com"); ...

    servlet学习笔记

    上某培训班的servlet笔记 Session 功能的实现依赖cookie URL 重写: 就是把原来送往客户端页面中的所有URL,重新编写. 怎么重新编写 String newURL=response.encodeURL(oldURL); 目的:保证session在...

    servlet2.4doc

    The default behavior of this method is to call encodeURL(String url) on the wrapped response object. encodeURL(String) - Method in interface javax.servlet.http.HttpServletResponse Encodes the ...

    用JSP做的网上交友页面

    <a href="<%=response.encodeURL("showMember.jsp")%>">浏览会员| <a href="<%=response.encodeURL("register.jsp")%>">会员注册| <a href="<%=response.encodeURL("login.jsp")%>">会员登录| ...

    metal:[实验性]快速的Node 10+ HTTP中间件框架

    @ nuxt /金属Nuxt当前依赖于 ,它是Node的轻... - connect@3.6.6 - debug@2.6.9 - finalhandler@1.1.0 - encodeurl@1.0.2 - escape-html@1.0.3 - on-finished@2.3.0 - ee-first@1.1.1 - statuses@1.4.0 - unpipe@1.

    java-servlet-api.doc

    Servlet引擎解析并载入一个Servlet,这个过程可以发生在引擎启动时,需要一个Servlet去响应请求时,以及在此之间的任何时候。 Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统...

    字符串转EnCode_c#

    字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c#

    lua-base64mix:base64编码解码模块

    lua-base64mix base64编码/解码模块 安装 ...应用程序接口 编码 str, err = base64mix.encode( src:...str, err = base64mix.encodeURL( src:string ) 此函数会将参数编码为 base64url 格式。 解码 str, err = base64

    ios获取数据之encodeURI和decodeURI的实例

    下面小编就为大家带来一篇ios获取数据之encodeURI和decodeURI的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    javascript中encodeURI和decodeURI方法使用介绍

    一、基本概念 encodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字符还原回来。...

    portal开发portlet的一些知识

    图片路径的写法 <IMG >/testportlet/images/mark.gif"> <IMG src="%=renderResponse.encodeURL(renderRequest.getContextPath()+">"> 其中renderResponse.encodeURL表示编码。目录结构截图: 。。。 。。。

    UrlRewriting Filter-开源

    UrlRewriting Filter 是一个 servlet 过滤器,它自动将 request.encodeURL() 应用于 servlet 响应正文中的 url。 这允许用户不必担心手动将 request.encodeURL() 应用于这些 url 以进行会话传播。

    ASP中只有UrlEncode,没有Urldecode问题的解决方法?

    在ASP中传递参数时有一个很有用的系统函数Server.UrlEncode,可以将一些非字母数字的特殊符号转换成标准URL编码(其实就是16进制ASC码),这样就解决了参数传递问题,然后我以为也提供了Server.UrlDecode,但使用后...

    SimpleServlet.zip

    out.println(response.encodeURL("cart")); out.println("\"method=\"POST\">"); out.println("<table cellspacing=\"5\" cellpadding=\"5\"><tr>"); out.println("<td align=\"center\"><b>种类</b></td>")...

    jsqrcodeSample:安卓手机,js调用系统摄像头扫码二维码并识别,推荐火狐以及谷歌浏览器

    shot目录目录结构├── 1.sh├── README.md├── node_modules│ ├── connect│ ├── debug│ ├── depd│ ├── destroy│ ├── ee-first│ ├── encodeurl│ ├── escape-html│ ├──...

    在asp中使用js的encodeURIComponent方法

    encodeURIComponent 方法返回一个已编码的 URI。如果您将编码结果传递给 decodeURIComponent,那么将返回初始的字符串

    Excelize文档类库-其他

    CONCATENATE, COUNT, COUNTBLANK, CUMIPMT, CUMPRINC, DATE, DATEDIF, DB, DDB, DEC2BIN, DEC2HEX, DEC2OCT, DOLLARDE, DOLLARFR, EFFECT, ENCODEURL, EXACT, FALSE, FIND, FINDB, FISHER, FISHERINV, FIXED, FV, ...

    PHP rawurlencode与urlencode函数的深入分析

    结论:rawurlencode遵守是94年国际标准备忘录RFC 1738,urlencode实现的是传统做法,和上者的主要区别是对空格的转义是’+’而不是’ ′javascript的encodeURL也是94年标准, 而javascript的escape是另一种用”%xxx”...

Global site tag (gtag.js) - Google Analytics