Spring MVC中的拦截器Interceptor(一)创建拦截器类

一、作用

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并可以在Controller之前或者之后作额外的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录、从cookie里查找发来请求的用户是谁等。

二、实现

目的:本处实现从cookie里查找发来请求的用户是谁然后通过一次请求走同一个线程,同一个线程可以共享数据的原理传给本线程的Controller->Service->mapper之后删除线程所存的用户。
方法:要使用Spring MVC中的拦截器,就需要对自己创建一个拦截器类进行定义和配置。通常拦截器类可以通过两种方式来创建。
1.创建一个拦截器类并实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
2.通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。

以实现HandlerInterceptor接口方式为例,自定义拦截器类 UserInterceptor的代码如下:

public class UserInterceptor implements HandlerInterceptor{
	public boolean preHandle(
		HttpServletRequest request, 
        HttpServletResponse response, 
        Object handler)throws Exception {
    	// 定义一个线程域,共享登录用户。ThreadLocal类的线程对象是一个map结构,key是线程对象本身,value是线程域共享的数据。所以往线程域里面存对象时,线程自己就把key设置为自己了,自动获取自己。因此下边的线程对象tl用的是set()和get()方法存取数据而不是用map的put方法。
    	private static final ThreadLocal<UserInfo> tl = new ThreadLocal<>();
    	//从cookie里获得token然后查询用户
		UserInfo user = JwtUtils.getInfoFromToken(token, jwtProperties.getPublicKey());
        // 把user放入线程域,由于用户的一次请求可以分五步(preHandle->Controller->Service->mapper-> afterCompletion)处于同一个线程内,因此把user放进该线程之后,这个线程的Controller也能提取出这个user.
        tl.set(user);         
        return true;//放行
	}
       
	public void afterCompletion(
		HttpServletRequest request,
	    HttpServletResponse response, 
	    Object handler,                
	    Exception ex) throws Exception {
	    //请求走完了mapper,这时可以把线程的数据清空了
		tl.remove();
	}

	//在拦截器类里提供一个静态方法以便他处取出共享数据
	//UserInterceptor.getUserInfo();即可取出user
	public static UserInfo getUserInfo(){
		return tl.get();//取出user
	}
	
}
 

上述代码中,自定义拦截器UserInterceptor实现了HandlerInterceptor接口,并实现了接口中的三个方法:

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

postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。

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

那么我们该如何让这个自定义拦截器生效呢?
参考文章:https://www.cnblogs.com/black-spike/p/7813238.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值