Browse Source

Merge branch 'feature-domain-implement' of ssh://git.mooctest.com:1022/crowd-2019/crowd-test-service-backend into feature-domain-implement

merge
guochao 6 years ago
parent
commit
db739de835

+ 12 - 0
core/src/main/java/com/mooctest/crowd/domain/exception/UnauthorizedException.java

@@ -0,0 +1,12 @@
+package com.mooctest.crowd.domain.exception;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-06 20:18
+ */
+public class UnauthorizedException extends BaseException {
+    public UnauthorizedException(){
+        super("请登录后访问");
+    }
+}

+ 4 - 0
site/pom.xml

@@ -91,6 +91,10 @@
 			<artifactId>aliyun-sdk-oss</artifactId>
 			<version>3.5.0</version>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.session</groupId>
+			<artifactId>spring-session-data-redis</artifactId>
+		</dependency>
 	</dependencies>
 
 	<build>

+ 24 - 0
site/src/main/java/com/mooctest/crowd/site/configuration/CustomSessionDefaultRedisSerializer.java

@@ -0,0 +1,24 @@
+package com.mooctest.crowd.site.configuration;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-06 18:58
+ */
+@Slf4j
+public class CustomSessionDefaultRedisSerializer extends GenericJackson2JsonRedisSerializer {
+
+    @Override
+    public Object deserialize(byte[] bytes) {
+        Object deserialObj = null;
+        try {
+            deserialObj = super.deserialize(bytes);
+        }catch (Exception e){
+            log.warn("deserialize session Object error!", e);
+        }
+        return deserialObj;
+    }
+}

+ 0 - 1
site/src/main/java/com/mooctest/crowd/site/configuration/OSSConfiguration.java

@@ -33,7 +33,6 @@ public class OSSConfiguration {
         return "http://"+bucketName+"."+endPoint+"/";
     }
 
-    @Bean
     public OSS ossClient(){
         return new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
     }

+ 0 - 32
site/src/main/java/com/mooctest/crowd/site/configuration/RedisConfiguration.java

@@ -1,32 +0,0 @@
-package com.mooctest.crowd.site.configuration;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
-import org.springframework.data.redis.serializer.RedisSerializer;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
-
-/**
- * @author: Diors.Po
- * @Email: 171256175@qq.com
- * @date 2019-07-29 20:47
- */
-public class RedisConfiguration {
-//
-//    @Bean
-//    public RedisTemplate redisTemplate(RedisConnectionFactory factory){
-//        RedisTemplate redisTemplate = new RedisTemplate();
-//        redisTemplate.setKeySerializer(new StringRedisSerializer());
-//        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
-//        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
-//        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
-//        // 开启事务
-//        redisTemplate.setEnableTransactionSupport(true);
-//        redisTemplate.setConnectionFactory(factory);
-//        return redisTemplate;
-//    }
-
-}

+ 42 - 0
site/src/main/java/com/mooctest/crowd/site/configuration/RedisSessionConfiguration.java

@@ -0,0 +1,42 @@
+package com.mooctest.crowd.site.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
+import org.springframework.session.web.http.CookieSerializer;
+import org.springframework.session.web.http.DefaultCookieSerializer;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-07-29 20:47
+ */
+@Configuration
+@EnableRedisHttpSession
+public class RedisSessionConfiguration {
+    @Bean
+    public CookieSerializer cookieSerializer() {
+        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
+        serializer.setCookiePath("/");
+        serializer.setDomainName("mooctest.net");
+        /**
+         * 划重点,Spring-Session 2.x版本与1.x版本有较大差异
+         * 由于内嵌tomcat版本不同,2.x版本默认开启Base64Encoding,同时使用1.x和2.x版本会导致Session不一致
+         * 此项目SpringBoot版本与用户中心相差较大,无法调整版本适配
+         */
+        serializer.setUseBase64Encoding(false);
+        return serializer;
+    }
+
+    @Bean
+    RedisSerializer<Object> springSessionDefaultRedisSerializer() {
+        return new CustomSessionDefaultRedisSerializer();
+    }
+
+}

+ 7 - 0
site/src/main/java/com/mooctest/crowd/site/configuration/WebMvcConfiguration.java

@@ -1,5 +1,6 @@
 package com.mooctest.crowd.site.configuration;
 
+import com.mooctest.crowd.site.controller.interceptor.AuthCheckInterceptor;
 import com.mooctest.crowd.site.controller.interceptor.FileCheckInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
@@ -17,9 +18,15 @@ public class WebMvcConfiguration implements WebMvcConfigurer {
     @Autowired
     private FileCheckInterceptor fileCheckInterceptor;
 
+    @Autowired
+    private AuthCheckInterceptor authCheckInterceptor;
+
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(fileCheckInterceptor)
                 .addPathPatterns("/api/files/**");
+        registry.addInterceptor(authCheckInterceptor)
+                .excludePathPatterns("/api/common/**")
+                .addPathPatterns("/**");
     }
 }

+ 1 - 1
site/src/main/java/com/mooctest/crowd/site/controller/CommonController.java

@@ -1 +1 @@
-package com.mooctest.crowd.site.controller;

import com.mooctest.crowd.site.data.dto.IndexDTO;
import com.mooctest.crowd.site.data.dto.MyCrowdDTO;
import com.mooctest.crowd.site.service.CommonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @Author: xuexb
 * @Date: 2019.7.22 16:51
 */
@RestController
@RequestMapping("/api")
public class CommonController {

    @Autowired
    private CommonService commonService;

    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public IndexDTO index(){
        return commonService.getIndexInfo();
    }

    @RequestMapping(value = "/mycrowd/{userId}", method = RequestMethod.GET)
    public MyCrowdDTO mycrowd(@PathVariable("userId") Long userId){
       return commonService.getPersonCrowd(userId);
    }

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        return "Hello, Spring Boot!";
    }
}
+package com.mooctest.crowd.site.controller;

import com.mooctest.crowd.site.data.dto.IndexDTO;
import com.mooctest.crowd.site.data.dto.MyCrowdDTO;
import com.mooctest.crowd.site.service.CommonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @Author: xuexb
 * @Date: 2019.7.22 16:51
 */
@RestController
@RequestMapping("/api/common")
public class CommonController {

    @Autowired
    private CommonService commonService;

    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public IndexDTO index(){
        return commonService.getIndexInfo();
    }

    @RequestMapping(value = "/mycrowd/{userId}", method = RequestMethod.GET)
    public MyCrowdDTO mycrowd(@PathVariable("userId") Long userId){
       return commonService.getPersonCrowd(userId);
    }

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

+ 17 - 0
site/src/main/java/com/mooctest/crowd/site/controller/TestController.java

@@ -3,6 +3,7 @@ package com.mooctest.crowd.site.controller;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClient;
 import com.mooctest.crowd.domain.exception.BaseException;
+import com.mooctest.crowd.site.annotation.LoginRequired;
 import com.mooctest.crowd.site.configuration.OSSConfiguration;
 import com.mooctest.crowd.site.service.UploadService;
 import com.mooctest.crowd.site.util.FileUtil;
@@ -11,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 
 /**
@@ -19,6 +21,7 @@ import java.io.IOException;
  * @date 2019-07-26 22:25
  */
 @RestController
+@RequestMapping("/api")
 public class TestController {
 
     @Autowired
@@ -29,4 +32,18 @@ public class TestController {
         return FileUtil.checkFile(file.getInputStream());
     }
 
+    @RequestMapping(value = "/session/put", method = RequestMethod.GET)
+    public Object sessionTest(HttpServletRequest request) {
+        request.getSession().setAttribute("test", 456);
+        return request.getSession().getId()+request.getSession().getAttribute("userId");
+    }
+
+    @LoginRequired
+    @RequestMapping(value = "/session/get", method = RequestMethod.GET)
+    public Object sessionTest1(HttpServletRequest request) {
+        System.out.println(request.getSession().getAttribute("userId"));
+        return "sessionId: "+request.getSession().getId()+"  userId: "+request.getSession().getAttribute("userId");
+    }
+
+
 }

+ 7 - 0
site/src/main/java/com/mooctest/crowd/site/controller/advice/ExceptionAdvice.java

@@ -39,6 +39,13 @@ public class ExceptionAdvice {
             return new ResponseMessage(ResponseConstant.FAIL, e.getMessage());
     }
 
+    @ExceptionHandler(UnauthorizedException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    public String handleUnauthorized(UnauthorizedException e){
+        log.info("401:未经认证的请求");
+        return e.getMessage();
+    }
+
     @ExceptionHandler(Exception.class)
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     @ResponseBody

+ 44 - 0
site/src/main/java/com/mooctest/crowd/site/controller/interceptor/AuthCheckInterceptor.java

@@ -0,0 +1,44 @@
+package com.mooctest.crowd.site.controller.interceptor;
+
+import com.mooctest.crowd.domain.exception.BaseException;
+import com.mooctest.crowd.domain.exception.UnauthorizedException;
+import com.mooctest.crowd.site.annotation.LoginRequired;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-06 20:02
+ */
+@Slf4j
+@Component
+public class AuthCheckInterceptor extends HandlerInterceptorAdapter {
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        if (hasLoginRequired(handler)){
+            log.info("需要认证的接口访问行为");
+            if (request.getSession().getAttribute("userId") == null)
+                throw new UnauthorizedException();
+        }else
+            log.info("无需认证的接口访问");
+        return true;
+    }
+
+    private boolean hasLoginRequired(Object handler) {
+        if(handler instanceof HandlerMethod) {
+            HandlerMethod handlerMethod = (HandlerMethod) handler;
+            LoginRequired loginRequired = handlerMethod.getMethod().getAnnotation(LoginRequired.class);
+            if(loginRequired==null){
+                loginRequired = handlerMethod.getBeanType().getAnnotation(LoginRequired.class);
+            }
+            return !(loginRequired == null);
+        }
+        return false;
+    }
+}

+ 0 - 1
site/src/main/java/com/mooctest/crowd/site/controller/interceptor/FileCheckInterceptor.java

@@ -34,7 +34,6 @@ public class FileCheckInterceptor extends HandlerInterceptorAdapter {
                     throw new BaseException("文件不是可接受的格式,或上传了非法修改后缀名的文件: "+file.getOriginalFilename());
             }
         }
-        log.info("\n\n\nThis is a Interceptor Test!!!\n\n\n");
         return true;
     }
 }

+ 4 - 3
site/src/main/java/com/mooctest/crowd/site/service/impl/OSSUploadServiceImpl.java

@@ -1,6 +1,7 @@
 package com.mooctest.crowd.site.service.impl;
 
 import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
 import com.aliyun.oss.model.PutObjectResult;
 import com.mooctest.crowd.domain.exception.BaseException;
 import com.mooctest.crowd.site.configuration.OSSConfiguration;
@@ -12,7 +13,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.io.InputStream;
 
 /**
  * @author: Diors.Po
@@ -23,8 +23,8 @@ import java.io.InputStream;
 @Service
 public class OSSUploadServiceImpl implements UploadService {
 
-    @Autowired
-    private OSS ossClient;
+//    @Autowired
+//    private OSS ossClient;
 
     @Autowired
     private OSSConfiguration ossConfig;
@@ -82,6 +82,7 @@ public class OSSUploadServiceImpl implements UploadService {
     }
 
     private String doUpload(String fileName, MultipartFile file){
+        OSS ossClient = ossConfig.ossClient();
         try {
             PutObjectResult result = ossClient.putObject(ossConfig.getBucketName(), fileName, file.getInputStream());
             return ossConfig.getBaseUrl()+fileName;

+ 1 - 1
site/src/main/resources/application.yml

@@ -31,7 +31,7 @@ spring:
         max-idle: 8
         max-wait: -1
         min-idle: 0
-    database: 3
+    database: 6
   servlet:
     multipart:
       enabled: true