本次异常如下:
返回的效果:
出错原因:是自己在访问controller的时候忘了删除接收的@RequestBody,开始之所以写了这个是因为访问时要传入参数,但是我忽略了,传入的参数只是给客户端请求的jwt token验证过滤器使用的实际业务不用接收,如下:
jwt过滤器:
public class AuthFilter extends OncePerRequestFilter {
private final Log logger = LogFactory.getLog(this.getClass());
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private JwtProperties jwtProperties;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request.getServletPath().equals("/" + jwtProperties.getAuthPath())) {
chain.doFilter(request, response);
return;
}
// 配置忽略列表
String ignoreUrl = jwtProperties.getIgnoreUrl();
String[] ignoreUrls = ignoreUrl.split(",");
for(int i=0;i<ignoreUrls.length;i++){
if(request.getServletPath().equals(ignoreUrls[i])){
chain.doFilter(request, response);
return;
}
}
final String requestHeader = request.getHeader(jwtProperties.getHeader());
String authToken = null;
if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
authToken = requestHeader.substring(7);
// 通过Token获取userID,并且将之存入Threadlocal,以便后续业务调用
String userId = jwtTokenUtil.getUsernameFromToken(authToken);
if(userId == null){
return;
} else {
CurrentUser.saveUserId(userId);
}
//验证token是否过期,包含了验证jwt是否正确
try {
boolean flag = jwtTokenUtil.isTokenExpired(authToken);
if (flag) {
RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_EXPIRED.getCode(), BizExceptionEnum.TOKEN_EXPIRED.getMessage()));
return;
}
} catch (JwtException e) {
//有异常就是token解析失败
RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_ERROR.getCode(), BizExceptionEnum.TOKEN_ERROR.getMessage()));
return;
}
} else {
//header没有带Bearer字段
RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_ERROR.getCode(), BizExceptionEnum.TOKEN_ERROR.getMessage()));
return;
}
chain.doFilter(request, response);
}
}
解决:直接删除@RequestBody标识的字段
扩展:JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。---------(详解另写一篇博文)