引言
所谓拦截器即为可以拦截HTTP请求的并做一些前置或者后置的通用处理手段,是一种AOP的处理方式,它不依赖于servlet容器,而依赖于web框架SpringMVC。主要用于拦截controller的请求接口。
- 基于URL实现拦截器
- 基于注解实现拦截器
一、基于URL实现拦截器
首先说明下基于URL的拦截器实现方式,具体代码如下所示,它主要完成的功能是对除了/cs
结尾之外的其他请求都进行token有效性的验证,只有header中带有有效token信息的请求才会被转发到具体的controller接口中。
public class TokenInterceptor implements HandlerInterceptor {
/**
* Handler执行之前调用此方法
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURL().toString();
if(url.endsWith(PropertiesConstants.EV_CONTEXT+"/cs")){ //websocket连接不拦截
return true;
}
// 验证header里的token是否合法
String token = request.getHeader("Token");
if (StringUtils.isEmpty(token)) {
return false;
}
boolean bool = TokenUtils.isTokenValid(token);
if (bool) {
return true;
} else {
return false;
}
}
/**
* Handler执行之后,ModelAndView返回之前调用这个方法
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
/**
* Handler执行完成之后调用这个方法
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
注意在springMVC.xml中将对应的拦截器进行配置。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**/*" />
<bean class="com.tms.TokenInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
二、基于注解实现拦截器
1、创建注解
/**
是否需要进行登录验证
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginHandler {
}
2、创建登录拦截器
public class LoginInterceptor implements HandlerInterceptor {
static Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
logger.info(">>>LoginInterceptor>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
//获取方法级别注解
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
LoginHandler loginHandler = method.getAnnotation(LoginHandler.class);
//判断是否需要进行登录验证
if (null != loginHandler) {
//TODO : 具体的实现
return true;
}
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 {
}
}
3、排至拦截器,将其注入容器中
@Configuration
public abstract class WebConfigurer implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
registry.addInterceptor(LoginInterceptor()).addPathPatterns("/**");
}
@Bean
public LoginInterceptor LoginInterceptor() {
return new LoginInterceptor();
}
}