如何防止Tomcat在URL中将连字符( - )编码为%2D。当从Safari浏览器发出请求时,此行为会导致一些与会话相关的问题。
部署战争文件:my-app.war
生成的网址:/my%2Dapp
所需网址:/my-app
答案 0 :(得分:2)
如果您指的是Tomcat Manger生成的链接:
您遇到的问题根本不是Context
个配置,而是HTMLManagerServlet
。该servlet包含以下line:
"<a href=\"" + URL_ENCODER.encode(contextPath + "/")
这是一个自定义编码器:org.apache.catalina.util.URLEncoder
。代码中使用的静态实例不使用DEFAULT
单例,它将以下字符标记为安全:
public static final URLEncoder DEFAULT = new URLEncoder();
static {
DEFAULT.addSafeCharacter('~');
DEFAULT.addSafeCharacter('-');
DEFAULT.addSafeCharacter('_');
DEFAULT.addSafeCharacter('.');
DEFAULT.addSafeCharacter('*');
DEFAULT.addSafeCharacter('/');
}
而是this:
static {
URL_ENCODER = new URLEncoder();
// '/' should not be encoded in context paths
URL_ENCODER.addSafeCharacter('/');
}
结果是除/
之外的每个字符都使用UTF-8进行URL编码。
答案 1 :(得分:1)
我认为您不应该尝试手动控制它。相反,您需要在conf / Catalina / localhost / my-app.xml下定义自己的上下文文件 然后:
<?xml version="1.0"?>
<Context docBase="/some/path/to/my-app.war">
</Context>
你可以玩这个,直到你得到你想要的正确行为。
答案 2 :(得分:0)
只需在上下文配置中设置路径:
<Context path="/myAppPath" docBase="h:/foo/mywar.war" reloadable="true" />
在这种情况下,您可以使用:http://domain/myAppPath/