我有一个自定义代理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。
如何获取客户端发送的原始未转义请求网址?
答案 0 :(得分:1)
查看HttpServletRequest
的{{3}}和getRequestURI()
方法。
如果您需要删除上下文和servlet映射,请查看getRequestURL()
和getContextPath()
。