此处我采用了JwtFilter 在每个请求之前
拦截器都会对请求进行拦截 导致本来很好用的@ControllerAdvice不管用了
那么怎么办呢 可以使用response即可 方法参数没有 也可以直接注入
代码示例如下
@SneakyThrows
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
//只有当请求头中包含Authorization字段时才 做下面的验证操作
if (isLoginAttempt(request, response)) {
JwtToken jwtToken = new JwtToken(getAuthzHeader(request));
// 开始登陆的验证
log.info("登陆验证~~~");
try {
getSubject(request, response).login(jwtToken);
} catch (AuthenticationException e) {
//这里只要在错误处直接打印 返回前端 让前端根据错误码进行处理即可
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(JSON.toJSONString(Result.fail().message("token错误")));
return false;
}
}
return true;
}
但是我还是推荐第二种重定向的方法 因为第一种方法可能会出现弹框
该方法是在JwtFilter里面的
@SneakyThrows
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
//只有当请求头中包含Authorization字段时才 做下面的验证操作
if (isLoginAttempt(request, response)) {
JwtToken jwtToken = new JwtToken(getAuthzHeader(request));
// 开始登陆的验证
log.info("登陆验证~~~");
try {
getSubject(request, response).login(jwtToken);
} catch (AuthenticationException e) {
//这里只要在错误处直接打印 返回前端 让前端根据错误码进行处理即可
responseError(response,400, "未登陆");
return false;
}
}
return true;
}
/**
* 将非法请求跳转到 /filterError/**中
*/
private void responseError(ServletResponse response, int code,String message) {
try {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
//设置编码,否则中文字符在重定向时会变为空字符串
message = URLEncoder.encode(message, "UTF-8");
//如果有项目名称路径记得加上
httpServletResponse.sendRedirect("/api/vi/filterError/" + code + "/" + message);
} catch (IOException e1) {
log.error(e1.getMessage());
}
}
@RestController
public class FilterErrorController {
@ResponseBody
@RequestMapping("/filterError/{code}/{message}")
public Map<String,Object> error(@PathVariable("code")Integer code, @PathVariable("message")String message){
Map<String,Object> map = new HashMap<>();
map.put("code",code);
map.put("message",message);
return map;
}
}
很重要的一点 需要放行该请求 不能有拦截哦!!!
参考的就是这篇博文 有第二种跳转的方法 大家可以参考一下
https://blog.csdn.net/weixin_43344930/article/details/107902143