Spring拦截器Interceptor的使用
程序员文章站
2022-05-23 10:25:47
...
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 的配置文件中配置相关的配置,注意需要的配置文件声明
<beans xmlns="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>
<!-- 使用 bean声明定义一个Interceptor,但是如果是直接定义在 mvc:interceptors 下面的 Interceptor将会拦截所有的请求 -->
<!--<bean class="com.xxx.xxx.AuthorityInterceptor"/> -->
<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>