SpringMVC拦截器-Interceptor

前言

Spring MVC属于SpringFrameWork中的一个模块,也就是Spring实现WEB、实现MVC

而 Interceptor拦截器 是属于SpringMVC中的机制,作用是对于  Controller层接口执行前后 进行拦截,表现形式有点像Spring的AOP,但是AOP是针对单一的方法。Interceptor是针对Controller接口以及可以处理request和response对象。

 

1.HandlerInterceptor拦截器接口的定义

在该接口中,定义了一下三个方法

public interface HandlerInterceptor {
 
    boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
 
    void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;
 
    void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}
  • preHandle:                                                                                                                                                                                  在访问到达Controller之前执行,如果需要对请求做预处理,可以选择在该方法中完成
    返回值为true:继续执行后面的拦截器或者Controller
    返回值为false:不再执行后面的拦截器和Controller,并调用返回true的拦截器的afterCompletion方法                                                ( 多个拦截器拦截时,先声明的先调用)
  • postHandle:    

    在执行完Controller方法之后,DispatcherServlet渲染视图之前执行,如果需要对响应相关的数据进行处理,可以选择在该方法中完成,(多个拦截器时)先声明的后调用。

  • afterCompletion:                                                                                                                                                                       调用完Controller接口,渲染View页面后调用。返回true的拦截器都会调用该拦截器的afterCompletion方法。                       (多个拦截器时) 先声明的后调用。只要有一个拦截器的preHandle 为true,那么它的 afterCompletion 方法就一定会执行。    

 

2.流程图:

 

 

3.自定义拦截器 以及使用

1. 定义拦截器,首先我们要定义一个类,实现HandlerInterceptor接口,重写对应的方法

public class MyFirstInterceptor implements HandlerInterceptor {

	/**
         * 	在控制器执行之前进行拦截操作
         *	方法的返回值 为 true 控制器方法放行 ,如果返回false则不放行
         */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("MyFirstInterceptor.......preHandle执行了");
		
		return true;  
	}

	/**
	 * 	在Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用
         */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("MyFirstInterceptor.......postHandle执行了");
	}

	/**
         *	 在完成视图渲染之后,执行此方法。
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("MyFirstInterceptor.......afterCompletion执行了");
	}
}

2.在SpringMVC 配置文件中配置 拦截器

<!-- 添加拦截器 -->
<mvc:interceptors>
   
   <!-- 配置具体的拦截器,如果不指定拦截具体请求,默认拦截所有 -->
   <bean class="com.crud.interceptor.MyFirstInterceptor"></bean>
   
   <!-- 配置具体的拦截器
    <mvc:interceptor>
    	配置要拦截的目标方法
    	<mvc:mapping path="interceptor/handler01"/>
    	<bean class="com.crud.interceptor.MyFirstInterceptor"></bean>
    </mvc:interceptor> -->   		
   
 </mvc:interceptors>

3.Controller

@RequestMapping("/handler01")
public String handler01(Model mod) {
		
	System.out.println("目标方法执行............");		
		
	mod.addAttribute("message", "访问成功");
	return "success";
}

4.index.jsp 页面

<a href="interceptor/handler01">发送请求,进入拦截器</a>

5.访问成功页面

<body>
	<h1>${message}</h1>
	<% System.out.println("访问了 success.jsp....");%>
</body>

访问演示:

客户端登录index.jsp 页面,点击超链接(请求被拦截器拦截) 

     查看控制器台输出:
        MyFirstInterceptor.......preHandle执行了
        目标方法执行............
        MyFirstInterceptor.......postHandle执行了
        访问了 success.jsp....
        MyFirstInterceptor.......afterCompletion执行了

以上是正常的执行顺序,还有其他情况下的执行顺序

    执行顺序: 
        正常执行过程
        preHandle --> 目标方法 --> postHandle --> 目标页面 --> afterCompletion
     
        当preHandle返回false,不放行Controller时
        preHandle  执行了
        
        当目标方法出现异常时,执行过程
        preHandle --> 目标方法 --> afterCompletion

 

 

4.多个拦截器时,执行顺序

代码如上 3.0 ,我们再编写一个拦截器。

public class MyTowInterceptor  implements HandlerInterceptor{

	//执行Controller 之前拦截
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("MyTowInterceptor.....preHandle...执行了");
		return true;
	}
	//执行完目标方法后 视图渲染前执行
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("MyTowInterceptor.....postHandle...执行了");
	}

	// 渲染完视图 之后执行
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("MyTowInterceptor.....afterCompletion...执行了");
	}

}

在SpringMVC配置文件中,配置拦截器

<!-- 添加拦截器 -->
   <mvc:interceptors>
   
   	<!-- 配置具体的拦截器,如果不指定拦截具体请求,默认拦截所有 -->

    <!-- 配置拦截器 -->
   	<bean class="com.crud.interceptor.MyFirstInterceptor"></bean>
    <!-- 配置拦截器 -->
    <bean class="com.crud.interceptor.MyTowInterceptor"></bean>

</mvc:interceptors>

 

浏览器访问: http:localhost:8080.../index.jsp

点击超链接,发送请求

查看控制台输出:

MyFirstInterceptor.......preHandle执行了
MyTowInterceptor.....preHandle...执行了
目标方法执行............
MyTowInterceptor.....postHandle...执行了
MyFirstInterceptor.......postHandle执行了
访问了 success.jsp....
MyTowInterceptor.....afterCompletion...执行了
MyFirstInterceptor.......afterCompletion执行了
 


我们来看它的执行顺序

1. 首先是两个拦截器的 preHandle 方法  按照先后声明顺序   执行了,
2. 然后执行Controller方法
3. 执行完Controller方法后,在前端控制器渲染视图前,执行了postHandle 方法
                  postHandle方法按照逆序执行,先声明的后执行

4. 然后jsp 视图页面被渲染完成了
5. 视图渲染完之后,执行了afterCompletion 方法。该方法也是逆序执行,先声明的后执行

 

 

若此时第一个拦截器( MyFirstInterceptor) 的preHandle方法返回false,会怎样,让执行看看顺序

控制台输出:

MyFirstInterceptor.......preHandle执行了

此时第一个拦截器的preHandle方法返回false之后,请求就中断了,后边的拦截器Controller也不会执行了

 

 

如果目标方法发生异常时,执行顺序又是什么请求呢? 

控制台输出:

MyFirstInterceptor.......preHandle执行了
MyTowInterceptor.....preHandle...执行了
目标方法执行............
MyTowInterceptor.....afterCompletion...执行了
MyFirstInterceptor.......afterCompletion执行了

1. 两个过滤器的preHandle都执行了
2. 到目标方法后发生异常
3. 然后按照逆序执行返回true的拦截器的afterCompletion方法 

 

 

 

5.拦截器与过滤器的区别

过滤器是 javaEE三大核心技术之一  (servlet的规范) ,初始化由容器创建

拦截器是属于SpringMVC的,只有在SpringMVC 中才能使用拦截器,由SpringIOC创建

 

 

 

部分转载自:

https://blog.csdn.net/wolfcode_cn/article/details/82965064

https://blog.csdn.net/weixin_42594325/article/details/80909946

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 拦截器Interceptor)是一种强大的机制,它可以拦截客户端请求并在控制器处理请求之前或之后执行一些操作。拦截器可以用于许多用例,例如身份验证、日志记录、性能监视、跨站点请求伪造(CSRF)防护等。 在 Spring MVC 中,拦截器是基于 Java 的接口 org.springframework.web.servlet.HandlerInterceptor 实现的。此接口定义了三个方法,它们是: - preHandle(): 在控制器处理请求之前调用,返回值为布尔类型。如果该方法返回 true,则继续执行后续拦截器或者控制器处理请求;如果该方法返回 false,则停止执行后续拦截器或者控制器处理请求。 - postHandle(): 在控制器处理请求之后、视图呈现之前调用。可以通过该方法修改 ModelAndView 中的模型数据或者视图。 - afterCompletion(): 在视图呈现之后调用,用于清理资源。 要使用拦截器,需要在 Spring MVC 配置文件中进行配置。可以通过 <mvc:interceptors> 标签或者实现 WebMvcConfigurer 接口进行配置。以下是一个拦截器的示例代码: ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在控制器处理请求之前执行 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在控制器处理请求之后、视图呈现之前执行 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在视图呈现之后执行 } } ``` 在配置文件中进行配置: ```xml <mvc:interceptors> <bean class="com.example.MyInterceptor" /> </mvc:interceptors> ``` 这样就可以将 MyInterceptor 拦截器应用到所有的控制器中了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值