- SpringBoot简单的Interceptor的配置,直接实现HandlerInterceptor接口,重写preHandle,postHandle,afterCompletion方法。
package com.bjut.config;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/**
* Created by fan on 2019/8/29.
*/
@Component
public class TestInterceptor implements HandlerInterceptor {
//视图渲染之后的操作
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO ...
}
//处理请求完成后视图渲染之前的处理操作
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO ...
}
//进入controller层之前拦截请求
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
System.out.println("getContextPath:" + request.getContextPath());
System.out.println("getServletPath:" + request.getServletPath());
System.out.println("getRequestURI:" + request.getRequestURI());
System.out.println("getRequestURL:" + request.getRequestURL());
System.out.println("getRealPath:" + request.getSession().getServletContext().getRealPath("image"));
// 如果不是映射到方法直接通过
if (!(obj instanceof HandlerMethod)) {
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) obj;
Method method = handlerMethod.getMethod();
//检查是否有@PassToken注解 有则跳过验证
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
//检查有没有需要用户权限的注解
if (method.isAnnotationPresent(UserLoginToken.class)) {
// TODO ...
}
return true;
}
} - 除此之外,还可以自定义拦截规则,addPathPatterns 用于添加拦截规则,excludePathPatterns 用于排除拦截,如addPathPatterns("//*") 可以拦截所有请求
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new OneInterceptor()).addPathPatterns("/*/**").excludePathPatterns("/exclude/**");
super.addInterceptors(registry);
}
} - SpringMVC 拦截 /* 和 /** 的区别:
/* : 匹配一级,即 /add , /query 等
/** : 匹配多级,即 /add , /add/user, /add/user/user… 等
/:当请求为/user/login的时候可以被拦截,当为/page/login.html页面的时候不拦截