Servlet过滤器不适用于容器管理的登录页面

时间:2015-10-21 06:07:58

标签: servlets http-headers servlet-filters jboss-eap-6 login-page

我使用Filter在我的所有页面中插入反点击劫持标头 - 这是正常的,除了JBoss EAP 6.3容器管理登录页面,这是更重要的页面之一拥有它。

登录页面完全不会调用过滤器,登录页面由http://localhost/Application/提供。我试过的过滤器映射包括

<filter>
    <filter-name>InsertXFrameOptions</filter-name>
    <filter-class>com.filter.InsertXFrameOptionsFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>InsertXFrameOptions</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>    
<filter-mapping>
    <filter-name>InsertXFrameOptions</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>InsertXFrameOptions</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

虽然没有运气 - 如何映射过滤器以使其适用于容器管理的登录页面?

1 个答案:

答案 0 :(得分:4)

过滤器不会启用j_security_check次请求。在Web应用程序的过滤器被命中之前,它们由容器在内部处理。所以你需要前往一个特定于容器的解决方案来挂钩请求/响应。

JBoss 6.x / 7.x(以及所有其他基于Tomcat的容器)为此提供Valves。基本上,将Filter替换为looks like below

Valve
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;

public class InsertXFrameOptionsValve extends ValveBase {

    @Override
    public void invoke(Request request, Response response) throws IOException, ServletException {
        response.addHeader("X-Frame-Options", "SAMEORIGIN");
        getNext().invoke(request, response);
    }

}

为了让它在jboss-web.xml中运行register,如下所示:

<valve>
    <class-name>com.example.InsertXFrameOptionsValve</class-name>
</valve>