|
@@ -7,6 +7,12 @@
|
|
|
|
|
|
package cn.com.qmth.examcloud.app.core.config;
|
|
package cn.com.qmth.examcloud.app.core.config;
|
|
|
|
|
|
|
|
+import cn.com.qmth.examcloud.app.model.Constants;
|
|
|
|
+import cn.com.qmth.examcloud.app.model.LoginInfo;
|
|
|
|
+import cn.com.qmth.examcloud.app.model.Result;
|
|
|
|
+import cn.com.qmth.examcloud.app.model.User;
|
|
|
|
+import cn.com.qmth.examcloud.app.service.UserAuthService;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
@@ -14,6 +20,9 @@ import javax.servlet.*;
|
|
import javax.servlet.FilterConfig;
|
|
import javax.servlet.FilterConfig;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
|
+import java.util.Date;
|
|
|
|
+
|
|
|
|
+import static cn.com.qmth.examcloud.app.model.Constants.PLATFORM_SESSION_EXPIRE_TIME;
|
|
|
|
|
|
/**
|
|
/**
|
|
* @author: fengdesheng
|
|
* @author: fengdesheng
|
|
@@ -21,13 +30,43 @@ import java.io.IOException;
|
|
*/
|
|
*/
|
|
public class TokenFilter implements Filter {
|
|
public class TokenFilter implements Filter {
|
|
private final static Logger log = LoggerFactory.getLogger(TokenFilter.class);
|
|
private final static Logger log = LoggerFactory.getLogger(TokenFilter.class);
|
|
|
|
+ private UserAuthService userAuthService;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
|
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
|
|
throws IOException, ServletException {
|
|
throws IOException, ServletException {
|
|
log.debug("doFilter");
|
|
log.debug("doFilter");
|
|
- CustomRequestWrapper customRequest = new CustomRequestWrapper((HttpServletRequest) servletRequest);
|
|
|
|
- //customRequest.addHeader("token", "111");
|
|
|
|
|
|
+ HttpServletRequest request = (HttpServletRequest) servletRequest;
|
|
|
|
+ CustomHttpServletRequest customRequest = new CustomHttpServletRequest(request);
|
|
|
|
+ //用户带的token实际为缓存的redisKey
|
|
|
|
+ String redisKey = request.getHeader(Constants.PARAM_TOKEN);
|
|
|
|
+ if (StringUtils.isNotBlank(redisKey)) {
|
|
|
|
+ //通过redisKey获取原始的登录信息,loginInfo为null则代表尚未登录
|
|
|
|
+ LoginInfo loginInfo = userAuthService.getLoginInfo(redisKey);
|
|
|
|
+ if (loginInfo != null) {
|
|
|
|
+ //判断原始的login token是否在有效时间内
|
|
|
|
+ if (loginInfo.hasExpired(PLATFORM_SESSION_EXPIRE_TIME)) {
|
|
|
|
+ //已超过有效时间,则自动登录续期
|
|
|
|
+ try {
|
|
|
|
+ Result<User> result = userAuthService.login(loginInfo);
|
|
|
|
+ User userInfo = result.getData();
|
|
|
|
+ if (userInfo != null) {
|
|
|
|
+ //登录成功后缓存新的login token
|
|
|
|
+ log.debug("redisKey:" + redisKey + " newLoginToken:" + userInfo.getToken());
|
|
|
|
+ loginInfo.setToken(userInfo.getToken());
|
|
|
|
+ loginInfo.setCreateTime(new Date());
|
|
|
|
+ userAuthService.cacheLoginInfo(loginInfo, redisKey);
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error(e.getMessage());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //替换原始token到request请求中
|
|
|
|
+ customRequest.addHeader(Constants.PARAM_TOKEN, loginInfo.getToken());
|
|
|
|
+ }
|
|
|
|
+ //初始化内部接口请求鉴权
|
|
|
|
+ userAuthService.initRequestTrace();
|
|
|
|
+ }
|
|
filterChain.doFilter(customRequest, servletResponse);
|
|
filterChain.doFilter(customRequest, servletResponse);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -41,4 +80,8 @@ public class TokenFilter implements Filter {
|
|
log.debug("destroy");
|
|
log.debug("destroy");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public void setUserAuthService(UserAuthService userAuthService) {
|
|
|
|
+ this.userAuthService = userAuthService;
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|