SpringMVC - 拦截器

本文详细介绍了SpringMVC中的拦截器(Interceptor)概念,包括其实现方式、配置方法及在权限验证、日志记录等场景的应用。同时对比了拦截器与过滤器、监听器的区别。

1. 概述

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等

其实我认为在不考虑具体内部的实现方法时,过滤器和拦截器没什么区别,都是用来处理所有请求的共性问题

2. 使用

① 通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义

public class InterceptorUtil implements HandlerInterceptor{  
 
 //进入Handler方法之前执行 
 //可以用于身份认证、身份授权。如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行,否则就放行 
 @Override 
	public boolean preHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler) throws Exception {  
 // TODO Auto-generated method stub 
        System.out.println("InterceptorUtil...........preHandle");  
        String user= (String) request.getSession().getAttribute("user");  
 		if(user != null){  
 			return true;  
        }  
        request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request, response);  
 //true表示放行,false表示不放行 
 		return false;  
    }  
 
 @Override 
	public void postHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler,  
            ModelAndView modelAndView) throws Exception {  
 // TODO Auto-generated method stub 
        System.out.println("InterceptorUtil...........postHandle");  
    }  
 
 @Override 
 	public void afterCompletion(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex)  
 throws Exception {  
 // TODO Auto-generated method stub 
        System.out.println("InterceptorUtil...........afterCompletion");  
    }  
 
}  

preHandle() 方法:
该方法会在控制器方法前执行,其返回值表示是否中断后续操作。
当其返回值为true时,表示继续向下执行;
当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)

可以用于身份认证、身份授权。比如如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行(return false),否则就放行(return true)。

postHandle()方法:
进入Handler方法之后,返回ModelAndView之前执行。可以看到该方法中有个modelAndView的形参。应用场景:从modelAndView出发:将公用的模型数据(比如菜单导航之类的)在这里传到视图,也可以在这里同一指定视图

afterCompletion()方法:
该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作

② 在配置文件进行配置

注意:拦截器不是在web.xml配置的,比如struts在struts.xml配置,在springMVC在spring与springMVC整合的配置文件中配置

<!-- 拦截器配置 --> 
<mvc:interceptors> 
 	<!--多个拦截器,顺序执行 --> 
 	<!-- 登陆认证拦截器 --> 
 	<mvc:interceptor> 
 	<!-- /** 表示拦截所有url包括子url路径,/*只拦截根下的url --> 
 		<mvc:mapping path="/**"/> 
 		<bean class="com.cn.util.InterceptorUtil"></bean> 
 	</mvc:interceptor> 
 	<!-- 其他拦截器 --> 
 </mvc:interceptors> 

3. 多个拦截器的执行顺序

在这里插入图片描述

4. 拦截器和过滤器还有监听器的区别

  • 监听器:

监听器最好区分,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它主要对域对象进行监听,过滤器依赖与servlet容器

  • 过滤器:

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序

  • 拦截器
    拦截器不依赖与servlet容器,是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现
    拦截器不是在web.xml配置的,比如struts在struts.xml配置,在springMVC在spring与springMVC整合的配置文件中配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值