Tomcat 8将连字符转换为URL中的%2D

时间:2016-01-07 15:24:48

标签: java tomcat

如何防止Tomcat在URL中将连字符( - )编码为%2D。当从Safari浏览器发出请求时,此行为会导致一些与会话相关的问题。

部署战争文件:my-app.war

生成的网址:/my%2Dapp

所需网址:/my-app

3 个答案:

答案 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/