logback error级日志不打印org.apache.shiro.authc.AuthenticationException: Token失效,请重新登录!

logback error级日志不打印org.apache.shiro.authc.AuthenticationException: Token失效,请重新登录!

1.问题描述

logback日志分包后 error级别日志中打印了shiro抛出来的Token失效异常,影响后期阅读error级别日志

2.希望达到的效果

logback中不再打印shiro抛出来的Token失效异常,Token失效日志的级别调整为info级别

3.如何捕获 shiro抛出的异常

正常大家都会想到用SpringBoot的全局异常捕捉@RestControllerAdvice和@ExceptionHandler
但是此异常是在Firlter中抛出的异常 @RestControllerAdvice无法捕捉此类异常

3.1解决方法

package org.jeecg.config.shiro.filters;

import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.exception.NoLoginException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.HandlerExceptionResolver;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author liuy
 * @Date 2021/12/2-15:58
 */
@Component
public class CustomExceptionFilter extends OncePerRequestFilter {
    @Autowired
    @Qualifier("handlerExceptionResolver")
    private HandlerExceptionResolver resolver;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
       try {
           filterChain.doFilter(request, response);
       }catch (Exception e){
           boolean contains = e.getMessage().contains("Token失效,请重新登录");
           if(contains){
               resolver.resolveException(request,response,null,new NoLoginException("Token失效,请重新登录"));
           }else {
               resolver.resolveException(request,response,null,new JeecgBootException(e.getMessage()));
           }
       }
    }
}

通过resolveException()抛出的异常 就可以被@RestControllerAdvice捕捉到了

	@ExceptionHandler(NoLoginException.class)
	public Result<?> handleNoLoginException(NoLoginException e){
		log.info(e.getMessage(), e);//改变输出日志级别
		return Result.nologin(e.getMessage());
	}

4.前端如何判断未登录状态码

// 创建 axios 实例
const service = axios.create({
  //baseURL: '/jeecg-boot',
  baseURL: apiBaseUrl, // api base_url
  timeout: 120000 // 请求超时时间
})

service.interceptors.response.use((response) => {
  if (response.status === 200) {
    switch (response.data.code) {
      case 520:
        Vue.prototype.$Jmodal.error({
          title: '登录已过期',
          content: '很抱歉,登录已过期,请重新登录',
          okText: '重新登录',
          mask: false,
          onOk: () => {
            store.dispatch('Logout').then(() => {
              console.log('=======退出登录========')
              window.location.reload()
            })
          }
        })
        return ;
    }
  }
    return response.data
  }, err)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值