拦截器
需要继承WebMVCConfigurer:实现的接口某个方法就等价与web.xml中的配置
定义回调方法以自定义通过@EnableWebMvc启用的Spring MVC的基于Java的配置。
@EnableWebMvc配置类可以实现此接口,以使其被回调,并有机会自定义默认配置。拦截器对应接口中的方法:addInterceptors(InterceptorRegistry registry)
拦截路径(那些将会被拦截)addPathPatterns
放行路径(拦截路径中放行的资源)excludePathPatterns
拦截检验器(拦截后,检验后再放行)addInterceptor
拦截检验器:实现方法,需要在视图前实现 HandlerInterceptorAdapter
解析 HandlerInterceptorAdapter
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
// 请求前
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception
//请求后视图前
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception
// 视图后
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception
//在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。
void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception
}
显然我们在请求前拦截判断
未登录拦截转到登录界面案例
1,实现接口WebMVCConfigurer中的addInterceptors(InterceptorRegistry registry) 配置方法
2,设置拦截筛选器 抛出未登录异常
3,在全局异常中捕获未登录异常 重定向到登录界面
需要定义一个未登录异常
第一步:实现接口WebMVCConfigurer
/**
* 拦截器 拦截登录
* Created by ppliang on 2020/11/30 22:13
*/
@Configuration //配置类
public class AdminInterceptor implements WebMvcConfigurer {
//实例化拦截筛选器
@Resource
private NoLoginInterceptor noLoginInterceptor;
/**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截筛选器的对象
registry.addInterceptor(noLoginInterceptor)
//拦截路径
.addPathPatterns("/**")
//放行路径
.excludePathPatterns("/login","/user/checkLogin","/css/**","/images/**","/js/**","/lib/**");
}
}
第二步:设置拦截筛选器
@Component
public class NoLoginInterceptor extends HandlerInterceptorAdapter {
@Resource
private UserService userService;
/**
* 判断用户是否是登录状态
* 获取Cookie对象,解析用户ID的值
* 如果用户ID不为空,且在数据库中存在对应的用户记录,表示请求合法
* 否则,请求不合法,进行拦截,重定向到登录页面
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取Cookie中的用户ID
Integer userId = LoginUserUtil.releaseUserIdFromCookie(request);
// 判断用户ID是否不为空,且数据库中存在对应的用户记录
if(userId == null || userService.selectByPrimaryKey(userId) == null){
throw new NoLoginException();
}
return true;
}
}
第三步:捕获未登录异常
@ResponseBody //此处要注意 全局异常处理 返回全部数据都是json
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = NoLoginException.class)
public void noLoginException(HttpServletResponse response) throws IOException {
response.sendRedirect("/crm/login");//重定向到登录界面
}
}
需要配置一个登录异常类
package com.ppl.crm.exceptions;
public class NoLoginException extends RuntimeException {
private Integer code=300;
private String msg="用户未登录!";
public NoLoginException() {
super("用户未登录!");
}
public NoLoginException(String msg) {
super(msg);
this.msg = msg;
}
public NoLoginException(Integer code) {
super("用户未登录!");
this.code = code;
}
public NoLoginException(Integer code, String msg) {
super(msg);
this.code = code;
this.msg = msg;
}
}