apache - 为什么代理下的 getContextPath() 返回的是 HttpServlet 内部的内部路径,而不是 Filter 内部的路径?

标签 apache tomcat servlets servlet-filters response.redirect

一直在烦我。

所以,我正在使用 JSP,并且在我实现的 Filter 和我的扩展 HttpServlet 中分别有这些方法(简单示例):

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    ((HttpServletResponse) response).sendRedirect(((HttpServletRequest) request).getContextPath() + "/foo");
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    response.sendRedirect(request.getContextPath() + "/foo");
}

localhost:8080/app,Filter 和 HttpServlet 都正确地将我重定向到 localhost:8080/app/foo

但是在www.mysite.com/app中,在Apache的代理下隐藏了一个tomcatserver:8080/app如下,

RedirectPermanent /app /app/
ProxyPass /app/ http://tomcatserver:8080/app/
ProxyPassReverse /app/ http://tomcatserver:8080/app/

过滤器将我重定向到 www.mysite.com/app/foo,而 HttpServlet 要么:

  1. (来自同一域) 显示 Tomcat 的服务器地址,将我重定向到 tomcatserver:8080/app/foo
  2. (来自域外) 卡在加载中。

那么……是什么原因造成的?

附言:我知道从 HttpServlet 中删除 request.getContextPath()"/" 部分可以解决问题,我不是在问那个。

最佳答案

因为 Tomcat 不知道反向代理的主机名。 Tomcat 看到的主机头是针对它自己的。因此,这是 Tomcat 在为重定向等生成绝对 URL 时使用的主机。

您可以使用

更改它
ProxyPreserveHost On

在您的 httpd 配置中。

关于apache - 为什么代理下的 getContextPath() 返回的是 HttpServlet 内部的内部路径,而不是 Filter 内部的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050550/

相关文章:

mysql - 无法打开连接 [n/a] java.sql.SQLException : No suitable driver found

java - Tomcat8 org.apache.cxf.BusFactory.getBusFactoryClass 无法确定 BusFactory 实现类名

java - 确保从非 spring 上下文加载 spring bean

java - 当我从 Android 应用程序请求数据时,我的网站停止工作

php - $_POST 值返回空数组

apache - 虚拟主机子域指向错误的目录

apache - 使用浏览器语言和非 www 域进行 mod_rewrite

eclipse 错误 : Websockets are currently only supported in Tomcat

java - 我们如何将 "plus"符号放入 html 表单中?

java - 状态 500 – Java Servlet 上的内部服务器错误