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)