SpringMVC拦截器
一, 拦截器的作用和概念
SpringMVC 框架中的拦截器用于对处理器进行预处理
和后处理
的技术。
可以定义拦截器链,连接器链就是将拦截器按着顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
二,拦截器和过滤器的功能比较类似,有以下区别:
-
过滤器是 Servlet 规范的一部分,任何框架都可以使用过滤器技术;
拦截器是SpringMVC框架独有的。 -
过滤器配置了 /*,可以拦截任何资源;
拦截器只会对控制器中的方法进拦截,也就是我们个controller层
拦截器是AOP的思想
三, 创建拦截器的步骤:
1. 创建一个类实现HandlerInterceptor接口
package com.itheima.reggie.interceptor;
import lombok.extern.slf4j.Slf4j;
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;
@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {
/**
* 预处理,controller 方法执行前
* 应用:用于身份认证、身份授权
* @param request
* @param response
* @param handler
* @return return true 放行,执行下一个拦截器,如果没有,执行 controller 中的方法
* return false 不放行,即不向下执行
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
/**
* 后处理方法,controller 方法执行后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 页面执行之后执行,
* 应用: 统一异常处里,统一日志处里
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
2. 将创建的拦截器添加到容器中
package com.itheima.reggie.config;
import com.itheima.reggie.interceptor.TokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 将创建好的拦截器添加到容器中,并设置要拦截的路径
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor())
.addPathPatterns("/**");
}
//解决跨域问题
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("*").maxAge(3600);
}
}
有什么不对的地方望各位大佬多多指教