4

我有一个错误页面,当返回 404 响应状态时会显示该页面。这个页面是通过模板机制生成的(我使用瓷砖);在这个模板中,我有一个包含类似内容的标题:

    <sec:authorize access="isAnonymous()">
        blabla
    </sec:authorize>
    <sec:authorize access="isAuthenticated()">
        blibli
    </sec:authorize>

因此,根据用户是否通过身份验证,它会显示 blibli 或 blabla。此代码适用于使用此模板的所有页面,但我的 404 页面除外!它什么都不显示!

任何的想法??

4

3 回答 3

10

我敢打赌,问题在于您如何定义filter-mapping. web.xml最常见的配置是:

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

这会将过滤器映射到所有 URL,但仅当它们通过REQUEST方法访问时。此过滤器未捕获的所有其他情况(如INCLUDE和)。所以要将过滤器绑定到请求,将其定义为FORWARDERRORERROR

<filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>

        <!-- apply Spring Security authentication to error-pages -->
        <dispatcher>ERROR</dispatcher>
</filter-mapping>

尝试一下。如果不起作用,则添加<dispatcher>INCLUDE</dispatcher>因为 Tiles,可能通过这种方式包含页面。

也可以看看:

于 2012-08-22T20:27:37.960 回答
1

对于那些寻找 java 配置的人:

private void registerSpringSecurityFilterChain(ServletContext servletContext) {
  FilterRegistration.Dynamic springSecurityFilterChain = servletContext.addFilter(
        BeanIds.SPRING_SECURITY_FILTER_CHAIN, new DelegatingFilterProxy());
  springSecurityFilterChain.addMappingForUrlPatterns(null, false, "/*");
  springSecurityFilterChain.addMappingForUrlPatterns(EnumSet.of(DispatcherType.ERROR), false, "/*");

}
于 2014-12-15T05:18:37.493 回答
0

如果这个 404 页面不在您的安全 URL 中,那么 isAnonymous() 和 isAuthenticated() 都将返回 false 并且不会呈现任何内容。

于 2012-08-17T04:28:41.173 回答