<error-page>不起作用

本文探讨了在Web.xml中配置404错误页面时遇到的问题及解决方案。作者尝试了多种方法,包括设置绝对路径、调整错误页面大小及使用isErrorPage属性,但均未奏效。最终通过在错误页面中正确使用isErrorPage和errorPage属性解决了问题。

在web.xml中配置了404,但是无效

  <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/Project/error.jsp</location>
  </error-page>

百度了一下大致就下面三种方法,但是对我都失效了

  1. location属性中填写的错误页面是绝对路径
  2. 错误页面jsp的大小>1024字节
  3. 在错误页面jsp中添加<%@ page isErrorPage=“true”%>

后来研究了下,页面正常显示,错误页面生效了,如下:

  • 在错误页面jsp中添加<%@ page isErrorPage=“true” errorPage=“error.jsp” %>
<think> 我们已知用户已经在web.xml中配置了欢迎页和错误页,现在需要配置Spring Security(以XML配置方式)来指定拦截某些地址,同时放行其他所有地址,并且要确保web.xml中的配置(如欢迎页、错误页)也能被正确拦截或放行。 根据引用[2],我们知道在Spring Security的XML配置中,可以使用`<http>`标签进行安全配置,其中: - `auto-config="true"` 表示启用默认配置(包括表单登录、注销等) - `use-expressions="true"` 表示使用SpEL表达式来定义访问规则 - 通过`<intercept-url>`标签来配置拦截规则,其中`pattern`属性指定URL模式,`access`属性指定访问条件 需求:指定拦截某些地址(例如`/admin/**`需要认证),其他所有地址(包括web.xml中配置的欢迎页和错误页)都放行。 解决方案: 1. 在`<http>`配置中,首先使用`<intercept-url>`指定需要拦截的URL模式,并设置访问条件(例如`access="authenticated"`表示需要认证)。 2. 然后配置一个匹配所有请求的`<intercept-url>`,并设置`access="permitAll"`,这样所有未被前面规则匹配的请求都会被放行。 3. 注意:拦截规则的顺序很重要,Spring Security会按照配置的先后顺序进行匹配,一旦匹配到规则就不再继续后面的规则。因此,应该将具体的URL模式放在前面,通用的(如`/**`)放在最后。 同时,考虑到web.xml中配置的内容(如欢迎页、错误页)通常也是通过URL访问的,这些URL也会经过Spring Security的过滤器链。因此,我们只需要在Spring Security的拦截规则中确保这些URL被放行即可。 例如,假设web.xml中配置了: - 欢迎页:`index.html` - 错误页:`/error`(或者错误页面映射到了某个URL,如`/error.jsp`或`/error`) 那么,我们在Spring Security的配置中,可以这样处理: - 如果希望欢迎页和错误页不需要认证就能访问,那么我们不需要特别配置,因为最后的`/**`规则已经放行了所有请求。 - 但如果错误页的URL是固定的(比如`/error`),而我们又希望这个URL也能被放行,那么可以显式添加一条规则(虽然由于`/**`已经放行,但为了清晰也可以单独添加)。 下面是一个具体的Spring Security XML配置示例(spring-security.xml): ```xml <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <http auto-config="true" use-expressions="true"> <!-- 配置需要拦截的地址,例如以/admin开头的地址需要认证 --> <intercept-url pattern="/admin/**" access="authenticated" /> <!-- 如果错误页的URL已知,可以显式放行(非必须,因为下面会放行所有) --> <intercept-url pattern="/error" access="permitAll" /> <!-- 放行其他所有请求 --> <intercept-url pattern="/**" access="permitAll" /> <!-- 配置表单登录:登录页面、登录处理URL等 --> <form-login login-page="/login" login-processing-url="/perform_login" default-target-url="/home" authentication-failure-url="/login?error=true" /> <!-- 配置注销 --> <logout logout-url="/logout" logout-success-url="/login" /> <!-- 关闭CSRF保护(如果需要) --> <!-- <csrf disabled="true"/> --> </http> <!-- 配置认证管理器(例如内存认证) --> <authentication-manager> <authentication-provider> <user-service> <user name="admin" password="{noop}admin" authorities="ROLE_ADMIN" /> </user-service> </authentication-provider> </authentication-manager> </beans:beans> ``` 说明: 1. 第一个`<intercept-url>`匹配`/admin/**`,要求认证(即用户必须登录)。 2. 第二个`<intercept-url>`匹配`/error`,放行(非必须,因为第三个规则已经匹配所有请求并放行了)。 3. 第三个`<intercept-url>`匹配`/**`,放行所有请求。这样,除了`/admin/**`以外的所有请求(包括欢迎页、错误页等)都不需要认证。 4. 配置了表单登录和注销的路径,这些路径由于被第三个规则匹配,所以也不需要认证(但登录和注销的路径是Spring Security内部处理的,不受拦截规则中`permitAll`的影响,因为它们是框架内部机制)。 注意:在web.xml中,我们已经配置了Spring Security的过滤器链(如引用[1]所示),它会应用到所有的请求(`/*`)。因此,上面的安全规则会生效。 关于web.xml的内容(引用[1]): - 我们已经在web.xml中配置了`springSecurityFilterChain`,它会拦截所有请求(`/*`)。 - 同时也配置了Spring的ContextLoaderListener(用于加载Spring的根上下文,包括spring-security.xml)。 另外,引用[3]中提到的错误页配置(web.xml中配置的错误页)通常是针对服务器端错误(如500)或页面未找到(404)等。这些错误页面是由容器触发的,但请求仍然会经过Spring Security过滤器链。因此,如果错误页的URL被包含在放行的规则中(如上面的`/**`),那么它们就可以被正常访问。 总结步骤: 1. 在spring-security.xml中,使用`<intercept-url>`配置需要拦截的地址,并设置为需要认证(`access="authenticated"`)。 2. 使用`<intercept-url pattern="/**" access="permitAll" />`放行所有其他地址。 3. 确保配置的顺序:先具体后通用。 这样配置后,web.xml中配置的欢迎页(如index.html)和错误页(如/error)都会被放行,而指定的拦截地址(如/admin下的地址)则需要登录才能访问。 §§相关问题§§ 1. 如何在Spring Security中配置多个需要拦截的URL模式? 2. Spring Security中拦截规则的顺序如何影响安全配置? 3. 如何在Spring Security中配置静态资源的访问规则? </think> ### 在已配置 web.xml 的 Spring 项目中配置拦截规则 针对您在 web.xml 中已配置欢迎页和错误页的情况,以下是完整的 Spring Security 配置方案(基于 XML 配置),确保特定地址被拦截的同时放行其他所有地址,并兼容 web.xml 配置: #### 1. **web.xml 关键配置(保持原配置不变)** ```xml <!-- 引用[1]的配置 - Spring Security 过滤器链 --> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 引用[3]的配置 - 错误页处理 --> <error-page> <error-code>404</error-code> <location>/WEB-INF/jsp/err/err.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/jsp/err/err.jsp</location> </error-page> ``` #### 2. **spring-security.xml 安全配置** ```xml <http auto-config="true" use-expressions="true"> <!-- 1. 指定需要拦截的地址 --> <intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/> <intercept-url pattern="/user/**" access="authenticated"/> <!-- 2. 放行特定资源(兼容web.xml配置) --> <intercept-url pattern="/index.jsp" access="permitAll"/> <!-- 欢迎页 --> <intercept-url pattern="/login" access="permitAll"/> <!-- 登录页 --> <intercept-url pattern="/error/**" access="permitAll"/> <!-- 错误页 --> <intercept-url pattern="/static/**" access="permitAll"/> <!-- 静态资源 --> <!-- 3. 核心配置:放行其他所有请求 --> <intercept-url pattern="/**" access="permitAll"/> <!-- 4. 表单登录配置(引用[2]) --> <form-login login-page="/login" login-processing-url="/perform_login" default-target-url="/home" authentication-failure-url="/login?error=true" /> <!-- 5. 错误处理(兼容引用[3]) --> <access-denied-handler error-page="/error/403"/> </http> ``` #### 3. **关键配置说明** 1. **拦截规则优先级**: - 配置顺序决定匹配优先级(从上到下) - 将`/**`放行规则放在最后,确保其他规则优先匹配 2. **web.xml 兼容处理**: ```xml <!-- 显式放行web.xml配置的资源 --> <intercept-url pattern="/index.jsp" access="permitAll"/> <intercept-url pattern="/error/**" access="permitAll"/> ``` 确保欢迎页和错误页不被拦截(引用[2][^2]) 3. **错误处理集成**: ```xml <access-denied-handler error-page="/error/403"/> ``` 当访问被拒时,重定向到 web.xml 配置的错误处理路径(引用[3][^3]) 4. **静态资源放行**: ```xml <intercept-url pattern="/static/**" access="permitAll"/> ``` 避免 CSS/JS 等资源被拦截 #### 4. **认证管理器配置** ```xml <authentication-manager> <authentication-provider> <user-service> <!-- 测试用户 --> <user name="admin" password="{noop}admin" authorities="ROLE_ADMIN"/> <user name="user" password="{noop}123" authorities="ROLE_USER"/> </user-service> </authentication-provider> </authentication-manager> ``` #### 5. **验证方法** 1. 访问 `/admin/dashboard` → 应重定向到登录页 2. 访问 `/index.jsp`(欢迎页)→ 直接显示内容 3. 触发 403 错误 → 显示 `/WEB-INF/jsp/err/err.jsp` 4. 访问其他任意地址(如 `/about`)→ 直接放行 > 配置要点:**规则顺序决定优先级**,`<intercept-url pattern="/**" access="permitAll"/>` 必须放在最后,确保成为兜底规则(引用[1][^1])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值