为什么getContextPath()下一个代理返回内部的HttpServlet而不是内部过滤器内部

2019-09-16 09:44发布

被如此迷恋我。

所以,我使用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 ,无论是筛选和正确的HttpServlet我重定向到localhost:8080/app/foo

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

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. (来自外域)刚刚卡住加载。

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

PS:我知道,去掉request.getContextPath()"/"部分从HttpServlet的解决了这个问题,我不要求这一点。

Answer 1:

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

您可以通过使用更改此

ProxyPreserveHost On

在你的httpd配置。



文章来源: Why does getContextPath() under a proxy return the internal path inside HttpServlet but not inside Filter?