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

Posted

技术标签:

【中文标题】为啥代理下的getContextPath()返回的是HttpServlet内部的内部路径,而不是Filter内部的路径?【英文标题】:Why does getContextPath() under a proxy return the internal path inside HttpServlet but not inside Filter?为什么代理下的getContextPath()返回的是HttpServlet内部的内部路径,而不是Filter内部的路径? 【发布时间】:2012-04-20 11:43:33 【问题描述】:

一直在打扰我。

所以,我正在使用 JSP,在我实现的过滤器和扩展的 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 要么:

    (来自同一域) 显示 Tomcat 的服务器地址,将我重定向到 tomcatserver:8080/app/foo(来自域外) 只是卡住了加载。

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

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

【问题讨论】:

【参考方案1】:

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

您可以通过使用来更改此设置

ProxyPreserveHost On

在您的 httpd 配置中。

【讨论】:

以上是关于为啥代理下的getContextPath()返回的是HttpServlet内部的内部路径,而不是Filter内部的路径?的主要内容,如果未能解决你的问题,请参考以下文章

request.getcontextPath() 详解

Java Web 应用程序:为啥 getContextPath 为空?

为啥reducer函数只返回代理?还原/工具包

为啥“findById()”在同一实体上调用 getOne() 后返回代理?

为啥即使对于“写入时复制”的 const 成员函数也返回代理类?

getServletContext.getContextPath()和request.getContextPath()可能不同吗?