springboot 拦截器与全局异常的连动使用 实现未登录的重定向

拦截器

需要继承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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值