JHipster登录有Remember Me选项,配置项中不勾选session可以保持24小时,勾选则为10天。
下面讲述一下JHipster对于登录超期的处理方法,这里登陆超期是指JWT的超期。
对于超期有两种情况,一种是对账户进行操作,另一种是非账户操作。前端代码如下:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
tap(null, (err: HttpErrorResponse) => {
if (err.status === 401 && err.url && !err.url.includes('api/account')) {
this.stateStorageService.storeUrl(this.router.routerState.snapshot.url);
this.loginService.logout();
this.router.navigate(['']);
this.loginModalService.open();
}
})
);
}
由于Vue没有相关处理代码,这里贴出angular代码,基本逻辑是一致的,对于非账户操作会转到登录页面要求用户重新登录。
这里特别指出,后端可能存在无需任何权限的操作,所以当token发生超期时,request依旧会受到后端处理,除非因权限不足返回401错误时,才会跳转到登录页面。
后端的是否超期是通过TokenProvider中的validateToken进行处理:
public boolean validateToken(String authToken) {
try {
Jwts.parserBuilder().setSigningKey(key)
.build()
.parseClaimsJws(authToken);
return true;
} catch (JwtException | IllegalArgumentException e) {
log.info("Invalid JWT token.");
log.trace("Invalid JWT token trace.", e);
}
return false;
}
其中JwtException包含了ExpiredJwtException,当抛出该异常,系统就不会赋予该用户任何权限,JWTFilter中代码如下:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String jwt = resolveToken(httpServletRequest);
if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
Authentication authentication = this.tokenProvider.getAuthentication(jwt);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(servletRequest, servletResponse);
}
最后提到一点,当用户名或者密码输入错误同样会从后端返回401错误,如果需要前端提示不同错误信息,例如:“用户名和密码错误”和“用户登录超时,请重新登录”,这时需要!err.url.includes('api/account')来加以区分。
Good Luck,
Cheers!