deason 7 ani în urmă
părinte
comite
e23d9b971a

+ 1 - 2
src/main/java/cn/com/qmth/examcloud/app/controller/version1/UserAuthRestController.java

@@ -43,7 +43,7 @@ public class UserAuthRestController {
         Result<User> result = userAuthService.login(loginInfo);
         if (result.isSuccess()) {
             //缓存登录信息
-            //userAuthService.cacheLoginInfo(loginInfo, result.getData());
+            userAuthService.cacheLoginInfo(loginInfo, result.getData());
         }
         return result;
     }
@@ -57,7 +57,6 @@ public class UserAuthRestController {
     @ApiOperation(value = "获取用户信息接口")
     @RequestMapping(value = "/user/info", method = {RequestMethod.GET, RequestMethod.POST})
     public Result getUserInfo(@RequestHeader String key, @RequestHeader String token, HttpServletRequest request) throws Exception {
-        //token = (String) request.getAttribute("loginToken");
         return userAuthService.getUserInfo(key, token);
     }
 

+ 1 - 33
src/main/java/cn/com/qmth/examcloud/app/core/config/AccessInterceptor.java

@@ -8,11 +8,7 @@
 package cn.com.qmth.examcloud.app.core.config;
 
 import cn.com.qmth.examcloud.app.model.DeviceRecord;
-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.DeviceRecordService;
-import cn.com.qmth.examcloud.app.service.UserAuthService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,7 +21,6 @@ import java.util.Date;
 import java.util.Map;
 
 import static cn.com.qmth.examcloud.app.model.Constants.PARAM_PASSWORD;
-import static cn.com.qmth.examcloud.app.model.Constants.PLATFORM_SESSION_EXPIRE_TIME;
 
 /**
  * API请求拦截器
@@ -37,38 +32,11 @@ public class AccessInterceptor extends HandlerInterceptorAdapter {
     private final static Logger log = LoggerFactory.getLogger(AccessInterceptor.class);
     @Autowired
     private DeviceRecordService deviceRecordService;
-    @Autowired
-    private UserAuthService userAuthService;
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        DeviceRecord record = this.parseParams(request);
-        //用户带的login token实际为缓存的redisKey
-        /*String redisKey = record.getLoginToken();
-        if (StringUtils.isNotBlank(redisKey)) {
-            //通过redisKey获取原始的登录信息,loginInfo为null则代表尚未登录
-            LoginInfo loginInfo = userAuthService.getLoginInfo(redisKey);
-            if (loginInfo != null) {
-                //判断原始的login token是否在有效时间内
-                if (loginInfo.hasExpired(PLATFORM_SESSION_EXPIRE_TIME)) {
-                    //已超过有效时间,则自动登录续期
-                    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);
-                    }
-                }
-                //将login token绑定到request请求中
-                request.setAttribute("loginToken", loginInfo.getToken());
-            }
-            //初始化内部接口请求鉴权
-            userAuthService.initRequestTrace();
-        }*/
         //异步保存设备访问记录
+        DeviceRecord record = this.parseParams(request);
         deviceRecordService.addDeviceRecord(record);
         return true;
     }

+ 2 - 2
src/main/java/cn/com/qmth/examcloud/app/core/config/CustomRequestWrapper.java → src/main/java/cn/com/qmth/examcloud/app/core/config/CustomHttpServletRequest.java

@@ -17,11 +17,11 @@ import java.util.*;
  * @author: fengdesheng
  * @since: 2018/8/1
  */
-public class CustomRequestWrapper extends HttpServletRequestWrapper {
+public class CustomHttpServletRequest extends HttpServletRequestWrapper {
     private final Set<String> names = new HashSet<>();
     private final Map<String, String> headers = new HashMap<>();
 
-    public CustomRequestWrapper(HttpServletRequest request) {
+    public CustomHttpServletRequest(HttpServletRequest request) {
         super(request);
         Enumeration<String> enumeration = super.getHeaderNames();
         while (enumeration.hasMoreElements()) {

+ 9 - 0
src/main/java/cn/com/qmth/examcloud/app/core/config/FilterConfig.java

@@ -7,6 +7,9 @@
 
 package cn.com.qmth.examcloud.app.core.config;
 
+import cn.com.qmth.examcloud.app.service.UserAuthService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -15,16 +18,22 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
+ * 请求过滤器
+ *
  * @author: fengdesheng
  * @since: 2018/8/1
  */
 @Configuration
 public class FilterConfig {
+    @Autowired
+    private UserAuthService userAuthService;
 
     @Bean
+    @ConditionalOnBean({UserAuthService.class})
     public FilterRegistrationBean filterRegistrationBean() {
         FilterRegistrationBean registrationBean = new FilterRegistrationBean();
         TokenFilter tokenFilter = new TokenFilter();
+        tokenFilter.setUserAuthService(userAuthService);
         registrationBean.setFilter(tokenFilter);
         List<String> urlPatterns = new ArrayList<>();
         urlPatterns.add("/api/*");

+ 6 - 0
src/main/java/cn/com/qmth/examcloud/app/core/config/InterceptorConfig.java

@@ -12,6 +12,12 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
+/**
+ * 请求拦截器
+ *
+ * @author: fengdesheng
+ * @since: 2018/7/16
+ */
 @Configuration
 public class InterceptorConfig extends WebMvcConfigurerAdapter {
 

+ 45 - 2
src/main/java/cn/com/qmth/examcloud/app/core/config/TokenFilter.java

@@ -7,6 +7,12 @@
 
 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.LoggerFactory;
 
@@ -14,6 +20,9 @@ import javax.servlet.*;
 import javax.servlet.FilterConfig;
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
+import java.util.Date;
+
+import static cn.com.qmth.examcloud.app.model.Constants.PLATFORM_SESSION_EXPIRE_TIME;
 
 /**
  * @author: fengdesheng
@@ -21,13 +30,43 @@ import java.io.IOException;
  */
 public class TokenFilter implements Filter {
     private final static Logger log = LoggerFactory.getLogger(TokenFilter.class);
+    private UserAuthService userAuthService;
 
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
             throws IOException, ServletException {
         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);
     }
 
@@ -41,4 +80,8 @@ public class TokenFilter implements Filter {
         log.debug("destroy");
     }
 
+    public void setUserAuthService(UserAuthService userAuthService) {
+        this.userAuthService = userAuthService;
+    }
+
 }

+ 1 - 1
src/main/java/cn/com/qmth/examcloud/app/service/impl/UserAuthServiceImpl.java

@@ -130,7 +130,7 @@ public class UserAuthServiceImpl implements UserAuthService {
         String redisKey = StrUtils.md5Key(userInfo.getKey());
         this.cacheLoginInfo(loginInfo, redisKey);
         log.debug("redisKey:" + redisKey + " loginToken:" + loginInfo.getToken());
-        //替换login token为缓存的redisKey,并作为接口的结果返回
+        //替换login token为缓存的redisKey,并作为结果返回给接口
         userInfo.setToken(redisKey);
     }