我正在尝试我的第一个网络应用。使用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一样?
答案 0 :(得分:1)
默认情况下,过滤器不会应用过滤器。需要明确指定以申请转发
因此,在接收应用程序(此处为app2)的WEB-INF / web.xml中,对于应该应用于转发请求的每个过滤器,还要添加以下内容
<filter-mapping>
...
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
...
<filter-mapping>
之后,/ app2中所有必需的过滤器也开始执行