springmvc实现拦截器可以通过继承(不推荐)HandlerInterceptorAdapter,或者实现(推荐)HandlerInterceptor类,两种都可以,只是看个人喜欢
继承方式验证登录:
public class LoginInterceptor extends HandlerInterceptorAdapter{
private static final String[] unHandle = new String[]{"/user/register","/user/login"};
private static final List<String> list = new ArrayList<String>(Arrays.asList(unHandle));
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String url = request.getRequestURI();
if(list.contains(url)){
return true;
}
// User user = SysUtil.getCurrentUser();
return super.preHandle(request, response, handler);
}
}
实现接口方式
public class AuthIntercepter implements HandlerInterceptor {
protected final Logger log = LoggerFactory.getLogger(getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
if (StringUtil.isNotBlank(token)) {
//验证token
String s = "/sso/loginInterface?token=" + token+"&loginflag=interface");
if (s.equals("【true】")) {
return true;
}
}
//未登录
//todo test
// return false;
throw new UnauthenticatedException();
// 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 {
}
}
当然需要在springmvc配置文件spring-mvc.xml里面配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<!-- 需排除拦截的地址 -->
<mvc:exclude-mapping path="/swagger-ui.html"/>
<mvc:exclude-mapping path="/webjars/**"/>
<mvc:exclude-mapping path="/v2/**"/>
<mvc:exclude-mapping path="/swagger-resources/**"/>
<bean class="cn.gov.zjport.pen.restapi.intercepter.AuthIntercepter" />
</mvc:interceptor>
</mvc:interceptors>
当然也可以基于注解
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/static/");
super.addInterceptors(registry);
}
当然在拦截器里面也可以通过java方式判断不需要过滤的路径,也可以通过配置,推荐使用java方式进行设置.