通过身份验证转发到另一个webapp

时间:2015-12-03 11:28:05

标签: tomcat servlets forward http-basic-authentication cross-context

我正在尝试我的第一个网络应用。使用Tomcat 7。

我想从host:port / app1 / x / y转发一些帖子数据和身份验证标头到主机:port / app2 / x / y,具有相同的帖子数据和标题。两个应用程序都在同一主机上。

/ app2具有基本身份验证。在客户端,代码

method.addRequestHeader("Authorization",
    "Basic " + new String(Base64.encodeBase64(userNPasswd.getBytes())));

我可以通过执行以下操作从/ app1转发到/ app2

1)实现过滤器并在/ app1

中的doFilter中执行此操作
ServletContext othercontext = filterConfig.getServletContext().getContext("/app2");
RequestDispatcher dispatcher = othercontext.getRequestDispatcher(req.getRequestURI().replace("/app1", ""));
dispatcher.forward(request, response);

2)在app1 ..在WEB-INF / web.xml下转发所有(/ *)url映射

<filter>
    <filter-name>ForwardFilter</filter-name>
    <filter-class><my.package.filter.ForwardFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ForwardFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3)在conf / server.xml中的tomcat中。在同一主机下定义/ app1和/ app2的上下文并关闭解包war等并使crossContext = true

<Context path="/app1" docBase="app1" crossContext="true" />
<Context path="/app2" docBase="app2" crossContext="false" /> 

app1.war非常简单,只有一个过滤器类和一个映射到转发请求的web.xml

app2.war是一个支持Spring的网络应用

当我使用错误的密码直接向/ app2发出请求时,我收到错误

当我转发当前转发的方式(从/ app1转发到/ app2)时,它正在跳过/ app2下的身份验证和请求开始处理。它在/ app2中的某个地方使用npe失败..它试图从安全上下文中读取用户名(Spring应该启动并设置它)

SecurityContextHolder.getContext().getAuthentication().getName();

我无法更改/ app2

下的代码

我希望/ app1是一个非常简单的请求转发。
我不能使用重定向或在tomcat前面使用apache规则重写

如果需要分享更多信息,请与我们联系

转发是否也转发所有身份验证标头,所以它就像请求直接命中/ app2一样?

1 个答案:

答案 0 :(得分:1)

默认情况下,过滤器不会应用过滤器。需要明确指定以申请转发

因此,在接收应用程序(此处为app2)的WEB-INF / web.xml中,对于应该应用于转发请求的每个过滤器,还要添加以下内容

<filter-mapping>
...
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
...
<filter-mapping>

之后,/ app2中所有必需的过滤器也开始执行