//
springboot2.x的自定义拦截器 和 servlet3.0的自定义过滤器
拦截器定义在interceptor包下。
定义一个WebConfig类,用于添加具体的自定义拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private SessionInterceptor sessionInterceptor;//自动注入要添加的自定义拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(sessionInterceptor).addPathPatterns("/**");//拦截器的添加和作用的范围的设定
//还可以通过添加.excludePathPatterns("")在拦截路径中剔除路径
//先注册的拦截器先对资源进行拦截
}
}
定义一个自定义拦截器,如SessionInterceptor:
实现HandlerInterceptor:
- preHandle:调用controller前
- postHandle:controller调用之后,视图渲染之前
- afterCompletion:用于清理资源
@Service//让spring接管,使其能自动注入userMapper
public class SessionInterceptor implements HandlerInterceptor {
@Autowired
private UserMapper userMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Cookie[] cookies = request.getCookies();
if (cookies!=null&&cookies.length!=0)
for (Cookie cookie : cookies) {
if(cookie.getName().equals("token")){
String token = cookie.getValue();
UserExample userExample = new UserExample();
userExample.createCriteria().andTokenEqualTo(token);
List<User> users = userMapper.selectByExample(userExample);
if(users.size()!=0){
request.getSession().setAttribute("user",users.get(0));//当访问首页时,把user放到session中
}
break;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
拦截器不生效问题
所有子路径下的所有资源写作:/*/**
拦截器和筛选器同时使用会互相干扰
@Configuration注解的添加
过滤器定义在filter包下。
filter优先级
值越小优先级越高。自定义的过滤器避免和默认已实现的filter的优先级一样。
定义一个自定义过滤器,如LoginFilter:
@WebFilter(urlPatterns="/*", filterName="loginFilter")
public class LoginFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException{
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException{
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String name = request.getParameter("username");
if("从数据库拿到的数据".equals(name)){
filterChain.doFilter(servletRequest, servletResponse);//执行回调函数doFilter进行放行操作
} else{
response.sendRedirect("/error.html");//验证失败返回自定义错误页面
return;
}
}
@Override
public void destory(){
}
}
过滤器不生效问题
启动类要添加@ServletComponentScan进行扫描
和拦截器一起使用会有冲突
过滤器和拦截器不同点
过滤器只能在容器初始化时调用一次,拦截器可以多次被调用
两者执行顺序:过滤前 -> 拦截前 -> 执行 -> 拦截后 -> 过滤后