javaee--springmvc下的拦截器配置

本文深入探讨SpringMVC中的拦截器机制,包括其与过滤器的区别,如何通过实现HandlerInterceptor接口来创建拦截器,以及预处理(preHandle)、后处理(postHandle)和完成处理(afterCompletion)方法的作用。同时,介绍了在SpringMVC配置文件中如何定义和应用拦截器。

1 概念

1.1 springmvc中的拦截器,相当于是servlet中的过滤器

1.2 主要用于拦截用户请求,并做相应的处理

2具体实现

package com.fhzheng.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
 * 以实现接口的方式定义拦截器
 */
public class Interceptor1 implements HandlerInterceptor {
	@Override
	public boolean **preHandle**(HttpServletRequest request, 
		HttpServletResponse response, Object handler) throws Exception {
		System.out.println("Intercepter1...preHandle");
		return true;
	}
	@Override
	public void **postHandle**(HttpServletRequest request, 
		HttpServletResponse response, Object handler,
		ModelAndView modelAndView) throws Exception {
		System.out.println("Intercepter1...postHandle");
	}
	@Override
	public void **afterCompletion**(HttpServletRequest request, 
		HttpServletResponse response, Object handler, 
		Exception ex) throws Exception {
		System.out.println("Intercepter1...afterCompletion");
	}
}

这里的preHandler方法,会在控制器方法前执行,返回值表示是否中断后续操作。
返回真,继续向下执行
返回假,中断后续的所有操作
一般进行数据验证,格式调整等,用户登录验证等动作

这里的postHandler方法,会在控制器方法调用后,且解析视图之前执行
一般可以通过它对视图做进一步的修改动作

这里的afterCompletion方法,会在整个请求完成之后,即视图渲染结束之后执行
一般此方法用于实现一些资源清理、日志记录等工作

3配置节点

    <!-- 配置拦截器 -->
	<mvc:interceptors>
		<!-- 定义具体的一个拦截器顺序:mapping...exclude-mapping...bean -->
    	<mvc:interceptor>
    		<!-- 拦截器作用的路径  /**表示拦截所有路径 -->
        	<mvc:mapping path="/**" />
        	<!-- 拦截器位置指定 -->
        	<bean class="com.fhzheng.core.interceptor.LoginInterceptor" />
    	</mvc:interceptor>
	</mvc:interceptors>	
    <!-- 配置拦截器 -->
	<mvc:interceptors>
	   <!--使用bean直接定义在<mvc:interceptors>下面的拦截器将拦截所有请求-->
	  <!--  <bean class="com.fhzheng.interceptor.CustomInterceptor"/> -->	
	   <!-- 拦截器1 -->
		<mvc:interceptor>
   			<!-- 配置拦截器作用的路径 -->
    		<mvc:mapping path="/**" />
    		<!-- 定义在<mvc:interceptor>下面的表示匹配指定路径的请求才进行拦截的 -->
    		<bean class="com.fhzheng.interceptor.Interceptor1" />
		</mvc:interceptor>
		<!-- 拦截器2 -->
		<mvc:interceptor>
			<!-- 配置拦截器作用的路径:只拦截以/hello结尾的路径 -->
    		<mvc:mapping path="/hello" />
    		<bean class="com.fhzheng.interceptor.Interceptor2" />
		</mvc:interceptor>
		
		<mvc:interceptor>
    		<mvc:mapping path="/**" />
    		<bean class="com.fhzheng.interceptor.LoginInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

4 当有多个拦截器时,它的执行顺序类似于多个过滤器

比如有2个
InterceptorA
InterceptorA

则执行顺序是
A.preHandler()
B.preHandler()
HanderAdapter()【控制器方法执行】
B.postHandler()
A.postHandler()
DispatcherServlet【前端serlvet】
B.afterCompletion
A.afterCompletion
即最先拦截的,最后放行

### SpringMVC项目中`index.jsp`页面点击“添加用户”按钮跳转出现404错误的原因分析 在SpringMVC项目中,如果`index.jsp`页面点击“添加用户”按钮后跳转出现404错误,可能与`web.xml`中`DispatcherServlet`的配置及其`url-pattern`映射关系有关。以下是具体原因分析和检查方法: --- #### 1. `DispatcherServlet`拦截静态资源问题 如果`web.xml`中`DispatcherServlet`的`url-pattern`配置为`/`,则该Servlet会拦截所有请求,包括`.jsp`文件的访问[^1]。如果未正确配置视图解析器或控制器处理逻辑,则可能导致404错误。 **解决方法:** 确保`web.xml`中`DispatcherServlet`的`url-pattern`配置合理。例如: ```xml <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 在这种情况下,需要确保Spring配置文件中包含正确的视图解析器配置,例如: ```xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> ``` 如果希望`DispatcherServlet`仅拦截特定路径(如`.do`),可以修改`url-pattern`为: ```xml <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ``` --- #### 2. 静态页面未被正确映射 如果`DispatcherServlet`拦截了所有请求,但未配置相关功能处理`.jsp`文件,则会导致404错误。例如,当`url-pattern`为`/`时,直接访问`.jsp`文件会被`DispatcherServlet`拦截,但未找到对应的控制器处理逻辑。 **解决方法:** 在`web.xml`中添加静态资源过滤规则,确保`.jsp`文件能够被正确访问。例如: ```xml <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> ``` --- #### 3. 控制器映射路径错误 如果“添加用户”按钮的表单提交路径未正确映射到控制器,则也会导致404错误。例如,表单提交路径为`/addUser`,但控制器中未定义对应的处理方法。 **解决方法:** 确保控制器中定义了正确的请求映射。例如: ```java @Controller public class AddUserController { @RequestMapping(value = "/addUser", method = RequestMethod.POST) public String addUser(@RequestParam("username") String username, @RequestParam("password") String password) { // 处理逻辑 return "redirect:/success.jsp"; } } ``` --- #### 4. 视图解析器配置错误 如果视图解析器未正确配置,则可能导致无法找到目标JSP页面。例如,视图解析器的前缀或后缀配置错误。 **解决方法:** 检查Spring配置文件中的视图解析器配置是否正确。例如: ```xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> ``` --- #### 5. 项目部署问题 如果项目部署不完整,缺少必要的依赖库或配置文件,也可能导致404错误。 **解决方法:** - 确保`WEB-INF/lib`目录下包含所有必要的依赖库。 - 检查Tomcat日志文件(如`catalina.out`),查看是否存在加载失败的错误信息。 --- ### 示例代码 以下是一个简单的示例,展示如何通过SpringMVC处理“添加用户”请求: #### `web.xml`配置 ```xml <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` #### `springmvc.xml`配置 ```xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> ``` #### `index.jsp`页面 ```html <form action="addUser" method="post"> 用户名: <input type="text" name="username"><br><br> 密码: <input type="password" name="password"><br><br> <input type="submit" value="提交"> </form> ``` #### `AddUserController`类 ```java @Controller public class AddUserController { @RequestMapping(value = "/addUser", method = RequestMethod.POST) public String addUser(@RequestParam("username") String username, @RequestParam("password") String password) { System.out.println("用户名: " + username); System.out.println("密码: " + password); return "redirect:/success.jsp"; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值