基本概念
SpringMVC为我们预留了一系列的接口供我们自定义配置来满足业务需要。HandlerInterceptorAdapterHttp
就是Http请求处理的拦截器配置。请求在进入自定义的 Controller 之前会执行 Inteceptor拦截器的perhanld方法;
方法参数里有 request 和 response 供我们使用
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
}
随后进入到我们自己的 Controller 处理完业务代码后 会进入到 Posthandle 方法,和perhandle不同的是参数列表里多了一个 ModelAndView 我们可以利用它对试图进行特殊处理
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
}
执行完成之后业务处理完了,视图也装配完了,还有个回调方法 afterCompletion
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
拦截器使用方法
新建一个配置类继承 HandlerInterceptorAdapter
方法,重写以上三个方法,必须全部重写
public class WebMvcConfiguration extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
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 {
}
}
编写拦截器处理方法,这里只编写了 perhandle 用来判断请求里是否包含用户信息的cookie若不存在重定向到登录页
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
String uri = request.getRequestURI();
log.info("request.URI: {}", uri);
String username = CookieUtil.getCookie(request, "username");
// 如果没有携带 cookie 重定向到登录页
if (StringUtils.isBlank(username)){
response.sendRedirect("/login");
return false;
}
// 已经携带 cookie 且访问的是登录页说明不需要登陆了,直接放行到主页
else if("/login".equals(uri)) {
response.sendRedirect("/");
return false;
}
return true;
}
最后将拦截器加入到 SpringMVC 的执行链中。新建一个类实现 WebMvcConfigurer
重写 addInterceptors 方法
这个接口是整个MVC运行时的配置,可以做很多事。比如放行静态资源等操作也可以在这里完成
/**
* 加入自定义拦截器
* 放行静态资源,不做处理
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new WebMvcConfiguration())
// 放行静态资源和登录接口
.excludePathPatterns("/dist/**", "/plugins/**", "/user/login");
}
打完收工~