encodeURL和encodeRedirectURL有什么区别?

时间:2011-02-09 12:23:24

标签: java servlets

我已经看到了现有的问题:Difference between encodeURL and encodeRedirectURL。但它并没有真正回答这个问题。在我的测试中,这两种方法看起来像是一样的。无论我使用print还是sendRedirect,它们都可以正常使用。

那么真的有什么区别吗?我想查看源代码,所以也许我可以找到差异,但HttpServletResponse是一个没有实现的接口。实现代码在哪里?

3 个答案:

答案 0 :(得分:5)

  

HttpServletResponse是没有实现的接口。实施代码在哪里?

这是servletcontainer本身,它是具体的Servlet API实现。例如,在Apache Tomcat的情况下,具体实现是org.apache.catalina.connector.Response。以下是相关摘录:

 1128       /**
 1129        * Encode the session identifier associated with this response
 1130        * into the specified redirect URL, if necessary.
 1131        *
 1132        * @param url URL to be encoded
 1133        */
 1134       public String encodeRedirectURL(String url) {
 1135   
 1136           if (isEncodeable(toAbsolute(url))) {
 1137               return (toEncoded(url, request.getSessionInternal().getIdInternal()));
 1138           } else {
 1139               return (url);
 1140           }
 1141   
 1142       }
 1159       /**
 1160        * Encode the session identifier associated with this response
 1161        * into the specified URL, if necessary.
 1162        *
 1163        * @param url URL to be encoded
 1164        */
 1165       public String encodeURL(String url) {
 1166           
 1167           String absolute = toAbsolute(url);
 1168           if (isEncodeable(absolute)) {
 1169               // W3c spec clearly said 
 1170               if (url.equalsIgnoreCase("")){
 1171                   url = absolute;
 1172               }
 1173               return (toEncoded(url, request.getSessionInternal().getIdInternal()));
 1174           } else {
 1175               return (url);
 1176           }
 1177   
 1178       }

差异非常微妙。只要给定(相对)URL为空,encodeURL()就会使用完整的绝对URL。

答案 1 :(得分:0)

当您的应用程序容器使用URL参数来传递会话ID时,这两种方法只能产生不同的结果。由于现在几乎每个人都使用Cookie来执行此操作,因此您不太可能在正常测试中看到差异。

要在URL中强制会话ID,请在浏览器中停用存储会话cookie(并希望应用程序服务器检测到该事实),或在应用程序服务器的URL中显式启用会话ID。

答案 2 :(得分:0)

我查找并寻找答案,我知道我会在stackoverflow或coderanch中找到它,在那里我找到了Charles Lyons的answer,我手里拿着这本书的作者,这是一个令人愉快的巧合。

  

发表于8/9/2008 11:41 AM   确切地说 - 不同之处在于encodeURL总是写入   会话ID到URL中(如果需要,例如因为cookie是   已禁用),而encodeRedirectURL包含其他逻辑   确定是否需要写入会话ID。它是一个   给外国网站提供会话ID真是个坏主意,例如,   从那时起,他们可以冒充用户的会话。于是   encodeRedirectURL只会将jsessionid放在URL上   位于当前的Web应用程序中,不执行任何重写   否则。

Charles Lyons(SCJP 1。4,2003年4月; SCJP 5,2006年12月; SCWCD 1.4b,2004年4月) OCEJWCD研究助手甲骨文考试1Z0-899(国际标准书号0955160340)的作者

我也发现了这个answer,这是之前发布的,

  

发表于2006年4月19日上午8:02报告发布给主持人嗨,

     

encodeURL用于编码会话跟踪的网址   转发和包括机制。 encodeRedirectURL对。编码   指定的URL,用于sendRedirect方法。

     

两者的主要区别在于,执行   encodeRedirectURL方法包括判断是否的逻辑   在您遇到的情况下,会话ID需要在URL中进行编码   将URL重定向到会话信息的不同上下文   不是必需的或无效的。 encodeURL方法不会附加   如果启用了cookie,则为seesion id。除此之外   如果URL是,则encodeRedirectURL不会附加会话信息   重定向到不同的上下文(Web应用程序)。因为   做出此决定的规则可能与以往不同   决定是否编码普通链接,这个方法是separete   encodeURL方法。

     

希望这对你有所帮助。

     

由于

     

Narendra Dhande