本次異常如下:
返回的效果:
出錯原因:是自己在訪問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對象在各方之間安全地傳輸信息。該信息可以被驗證和信任,因爲它是數字簽名的。---------(詳解另寫一篇博文)