从HttpRequest对象获取未转义的servlet路径

时间:2012-03-23 07:51:07

标签: java http rest servlets url-encoding

我有一个自定义代理servlet,它必须处理路径中包含特殊字符(例如,; , . /)的URL。这是因为它是一个RESTful应用程序,其设计具有丑陋的路径参数。 (不要评论它,因为它不是我的。)

我的客户端(实际上wget,因为浏览器倾向于显示未转义的URL)向此网址发送请求:

http://localhost:8080/MyApplication/proxy/foo/ugly%3Apart%2Fcomes%3Bhere/children
//note: %2F = '/', %3A = ':', %3B = ';'

当我尝试转发GET请求时,在我的servlet中(映射到/proxy/*),我无法重建它,因为HttpRequest.getPathInfo()返回了未转义的URL:

http://localhost:8080/MyApplication/proxy/foo/ugly:part/comes;here/children

因此,/; s最初被转义或未转义的信息将丢失。例如,这对我有所帮助;使我的URL成为所谓的矩阵URL,请参阅http://www.w3.org/DesignIssues/MatrixURIs.html,或者通过斜杠移动所有REST路径参数。

实际上我在Glassfish服务器上发现了这个问题,所以我不确定不同的应用程序服务器是否会以不同的方式对待它。我在Servlet API中只找到了这个:

  

getPathInfo()返回与之关联的任何额外路径信息   客户端发出此请求时发送的URL。

如何获取客户端发送的原始未转义请求网址?

1 个答案:

答案 0 :(得分:1)

查看HttpServletRequest的{​​{3}}和getRequestURI()方法。

如果您需要删除上下文和servlet映射,请查看getRequestURL()getContextPath()