|
|
@@ -40,6 +40,9 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
|
|
@Resource
|
|
|
private RedisClient redisClient;
|
|
|
|
|
|
+ private static final String APP_PREFIX = "app:";
|
|
|
+ private static final String SYS_PREFIX = "sys:";
|
|
|
+
|
|
|
@Override
|
|
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
|
|
|
String authHeader = request.getHeader(jwtUtil.getJwtProperties().getTokenHeader());
|
|
|
@@ -49,21 +52,44 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
|
|
chain.doFilter(request, response);
|
|
|
return;
|
|
|
}
|
|
|
- String tokenInRedis = redisClient.get(username, "");
|
|
|
+ // 获取请求来源 (app获取pc端)
|
|
|
+ String requestSource = jwtUtil.getRequestSourceFromToken(authToken);
|
|
|
+ if (ObjectUtils.isEmpty(requestSource)) {
|
|
|
+ handleUnauthorized(response);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String tokenKey = "app".equals(requestSource) ? String.format("%s%s",APP_PREFIX,username) : String.format("%s%s",SYS_PREFIX,username);
|
|
|
+ // 判断 token是否过期
|
|
|
+ String tokenInRedis = redisClient.get(tokenKey, "");
|
|
|
if (ObjectUtils.isEmpty(tokenInRedis)){
|
|
|
- response.getWriter().println(JSONUtil.parse(ResultResponse.fail(String.valueOf(HttpServletResponse.SC_UNAUTHORIZED),"没有权限")));
|
|
|
- response.getWriter().flush();
|
|
|
+ handleUnauthorized(response);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 判断 token 是否相同
|
|
|
+ if (!tokenInRedis.equals(authHeader)){
|
|
|
+ handleUnauthorized(response);
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
|
|
|
if (jwtUtil.validateToken(authToken, userDetails)) {
|
|
|
tokenUtil.setCurrentUser(userDetails,request);
|
|
|
- redisClient.set(username,authHeader, RedisStatusEnums.REDIS_EXPIRATION_TIME_1.getCode());
|
|
|
+ // 刷新token过期时间
|
|
|
+ redisClient.set(tokenKey,authHeader, RedisStatusEnums.REDIS_EXPIRATION_TIME_1.getCode());
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.error(e.getMessage());
|
|
|
}
|
|
|
chain.doFilter(request, response);
|
|
|
}
|
|
|
+
|
|
|
+ // 错误处理的方法
|
|
|
+ private void handleUnauthorized(HttpServletResponse response) throws IOException {
|
|
|
+ response.setHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ response.setHeader("Cache-Control", "no-cache");
|
|
|
+ response.setCharacterEncoding("UTF-8");
|
|
|
+ response.setContentType("application/json");
|
|
|
+ response.getWriter().println(JSONUtil.parse(ResultResponse.fail(String.valueOf(HttpServletResponse.SC_UNAUTHORIZED), "登录已过期")));
|
|
|
+ response.getWriter().flush();
|
|
|
+ }
|
|
|
}
|