Spring拦截器Interceptor的使用

Spring的拦截器(HandlerInterceptor【接口–实现】/HandlerInterceptorAdapter【继承和重写相关的方法】)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * @ClassName AuthorityInterceptor
 * @Author 莫邪
 * @Description TODO 拦截器
 * @Date Created in 18:48 2018/6/6
 * @Version 1.0
 */
@Component
public class AuthorityInterceptor implements HandlerInterceptor {


    @Override//在一个请求进入Controller层方法执行前执行这个方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //在这里可以对参数做一些预处理和做一些验证
        return true;//方法给予执行,就是允许controller的方法进行执行
        //false 不允许,可以在这之前在reponse中编写返回的结果

    }
    //返回model前
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //Controller执行完毕后,返回之前,可以对request和reponse进行处理
        //如果是前后端没有分离,在进入View层中前执行
    }

    //返回model后
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //在一个请求处理完毕,即将销毁的时候,执行,可以做一些资源释放之类的工作
    }
}

写好代码还需要对其进行配置,如果有多个拦截器,拦截器的执行顺序是按照声明的顺序。
第一种配置方式
使用SpringBoot的话我们可以对其进行Java配置,需要和配置类同一个包下或者在其包下的子包中,不然得使用@ComponentScan(basePackages = {“com.”})开启注解扫描


/**
 * @ClassName MyConfig
 * @Author 莫邪
 * @Description TODO
 * @Date Created in 19:06 2018/6/6
 * @Version 1.0
 */

import com.tmo.tmo_sms.Interceptor.AuthorityInterceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootConfiguration
@EnableAspectJAutoProxy
public class MyConfig extends WebMvcConfigurerAdapter{

    @Autowired
    private AuthorityInterceptor authorityInterceptor;



    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorityInterceptor).addPathPatterns("/user/**");//配置拦截的路径,可以传多个参数
        /*registry.addInterceptor(authorityInterceptor).addPathPatterns("/**");*/
    }
}

第二种配置方式,注意使用这种方式不需要再使用@Component在拦截器上声明
在spring 的配置文件中配置相关的配置,注意需要的配置文件声明

"http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
     http://www.springframework.org/schema/context  
     http://www.springframework.org/schema/context/spring-context-3.0.xsd  
     http://www.springframework.org/schema/mvc  
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

然后可以在配置文件中进行相关的配置

<mvc:interceptors>  
      
    
    <mvc:interceptor>  
        
        <mvc:mapping path="/user/**"/>  
        <bean class="com.hit.interceptor.LoginInterceptor"/>  
    mvc:interceptor>  
mvc:interceptors>  

先声明的拦截器将会先执行
下面定义一个拦截器栈,拦截顺序从上到下

<mvc:interceptors>
        <bean class="com.xxx.AAAInterceptor"/>
        <bean class="com.xxx.BBBInterceptor"/>
        <bean class="com.xxx.CCCInterceptor"/>
 mvc:interceptors>

你可能感兴趣的:(Spring框架学习)