From 5a00e6c62fcb0d2a65354ff8083ce67e943a394a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 1 Oct 2021 17:48:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E9=A1=B9=E7=9B=AE=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE=E9=A1=B9?= =?UTF-8?q?=E7=9A=84=E8=8E=B7=E5=8F=96=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - new class ` CommonEnvPostProcessor ` - remove ` @value ` - make JwtUtil's method static --- .../article/controller/ArticleController.java | 10 ++- .../article/util/SitemapGenerateUtil.java | 8 +-- .../common/config/CommonEnvPostProcessor.java | 62 +++++++++++++++++++ .../exception/BlogExceptionHandler.java | 6 +- .../celess/common/util/EnvironmentUtil.java | 47 ++++++++++++++ .../main/resources/META-INF/spring.factories | 2 + .../main/java/cn/celess/BlogApplication.java | 4 ++ .../cn/celess/configuration/CorsConfig.java | 6 +- .../cn/celess/configuration/DruidConfig.java | 21 ++----- .../celess/configuration/SwaggerConfig.java | 7 +-- .../serviceimpl/QiniuServiceImpl.java | 13 ++-- .../src/main/resources/application.properties | 2 +- .../user/filter/AuthenticationFilter.java | 14 ++--- .../user/serviceimpl/UserServiceImpl.java | 6 +- .../java/cn/celess/user/util/JwtUtil.java | 31 ++++------ .../cn/celess/user/util/RedisUserUtil.java | 4 +- .../java/cn/celess/user/util/JwtUtilTest.java | 36 +++++------ 17 files changed, 175 insertions(+), 104 deletions(-) create mode 100644 blog-common/src/main/java/cn/celess/common/config/CommonEnvPostProcessor.java create mode 100644 blog-common/src/main/java/cn/celess/common/util/EnvironmentUtil.java create mode 100644 blog-common/src/main/resources/META-INF/spring.factories diff --git a/blog-article/src/main/java/cn/celess/article/controller/ArticleController.java b/blog-article/src/main/java/cn/celess/article/controller/ArticleController.java index 9066378..eac398c 100644 --- a/blog-article/src/main/java/cn/celess/article/controller/ArticleController.java +++ b/blog-article/src/main/java/cn/celess/article/controller/ArticleController.java @@ -6,9 +6,9 @@ import cn.celess.common.entity.Response; import cn.celess.common.entity.dto.ArticleReq; import cn.celess.common.entity.vo.ArticleModel; import cn.celess.common.service.ArticleService; +import cn.celess.common.util.EnvironmentUtil; import cn.celess.user.util.RedisUserUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -25,8 +25,6 @@ public class ArticleController { SitemapGenerateUtil sitemapGenerateUtil; @Autowired RedisUserUtil redisUserUtil; - @Value("${spring.profiles.active}") - private String activeModel; /** * 新建一篇文章 @@ -37,7 +35,7 @@ public class ArticleController { @PostMapping("/admin/article/create") public Response create(@RequestBody ArticleReq body) { ArticleModel articleModel = articleService.create(body); - if ("prod".equals(activeModel)) { + if ("prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) { sitemapGenerateUtil.createSitemap(); } return Response.success(articleModel); @@ -52,7 +50,7 @@ public class ArticleController { @DeleteMapping("/admin/article/del") public Response delete(@RequestParam("articleID") long articleId) { boolean delete = articleService.delete(articleId); - if ("prod".equals(activeModel)) { + if ("prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) { sitemapGenerateUtil.createSitemap(); } return Response.success(delete); @@ -67,7 +65,7 @@ public class ArticleController { @PutMapping("/admin/article/update") public Response update(@RequestBody ArticleReq body) { ArticleModel update = articleService.update(body); - if ("prod".equals(activeModel)) { + if ("prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) { sitemapGenerateUtil.createSitemap(); } return Response.success(update); diff --git a/blog-article/src/main/java/cn/celess/article/util/SitemapGenerateUtil.java b/blog-article/src/main/java/cn/celess/article/util/SitemapGenerateUtil.java index 7cb826d..1322ada 100644 --- a/blog-article/src/main/java/cn/celess/article/util/SitemapGenerateUtil.java +++ b/blog-article/src/main/java/cn/celess/article/util/SitemapGenerateUtil.java @@ -4,8 +4,8 @@ package cn.celess.article.util; import cn.celess.common.entity.Article; import cn.celess.common.mapper.ArticleMapper; import cn.celess.common.util.DateFormatUtil; +import cn.celess.common.util.EnvironmentUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.w3c.dom.Document; @@ -38,9 +38,6 @@ public class SitemapGenerateUtil { @Autowired ArticleMapper articleMapper; - - @Value("${sitemap.path}") - private String path; private Map urlList; private static DocumentBuilder getDocumentBuilder() { @@ -57,7 +54,8 @@ public class SitemapGenerateUtil { @Async public void createSitemap() { initList(); - if ("".equals(path) || "classpath".equals(path)) { + String path = EnvironmentUtil.getProperties("sitemap.path", System.getProperty("user.dir")); + if ("classpath".equals(path)) { path = System.getProperty("user.dir") + "/sitemap.xml"; } File file = new File(path); diff --git a/blog-common/src/main/java/cn/celess/common/config/CommonEnvPostProcessor.java b/blog-common/src/main/java/cn/celess/common/config/CommonEnvPostProcessor.java new file mode 100644 index 0000000..08a409d --- /dev/null +++ b/blog-common/src/main/java/cn/celess/common/config/CommonEnvPostProcessor.java @@ -0,0 +1,62 @@ +package cn.celess.common.config; + +import cn.celess.common.util.EnvironmentUtil; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.boot.env.OriginTrackedMapPropertySource; +import org.springframework.boot.logging.DeferredLog; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.core.Ordered; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Map; +import java.util.Properties; +import java.util.regex.Matcher; + +@Component +public class CommonEnvPostProcessor implements EnvironmentPostProcessor, ApplicationListener, Ordered { + public static final DeferredLog log = new DeferredLog(); + + private static final String CONFIG_PATH = "/config/blog.properties"; + private static final String SOURCE_NAME = "localize"; + + @Override + public void postProcessEnvironment(ConfigurableEnvironment configurableEnvironment, SpringApplication springApplication) { + configurableEnvironment.getPropertySources().forEach(propertySource -> { + if (propertySource.getName().startsWith("applicationConfig") && propertySource instanceof OriginTrackedMapPropertySource) { + EnvironmentUtil.addProperties((Map) propertySource.getSource()); + } + }); + + log.info("加载本地配置文件"); + //获取环境变量 + String homeEnv = EnvironmentUtil.getEnv("BLOG_HOME", EnvironmentUtil.getEnv("USERPROFILE")); + String configPath = (homeEnv + CONFIG_PATH).replaceAll("[\\|/]+", Matcher.quoteReplacement(File.separator)); + try (InputStream input = new FileInputStream(configPath)) { + Properties properties = new Properties(); + properties.load(input); + PropertiesPropertySource propertySource = new PropertiesPropertySource(SOURCE_NAME, properties); + configurableEnvironment.getPropertySources().addLast(propertySource); + log.info("Load the configuration file under the environment variable,end."); + EnvironmentUtil.addProperties(properties); + } catch (Exception e) { + log.info("加载本地[" + configPath + "]的配置文件失败"); + } + } + + @Override + public void onApplicationEvent(ApplicationEvent event) { + log.replayTo(CommonEnvPostProcessor.class); + } + + @Override + public int getOrder() { + return 0; + } +} diff --git a/blog-common/src/main/java/cn/celess/common/exception/BlogExceptionHandler.java b/blog-common/src/main/java/cn/celess/common/exception/BlogExceptionHandler.java index 1deb7a1..91ad1a5 100644 --- a/blog-common/src/main/java/cn/celess/common/exception/BlogExceptionHandler.java +++ b/blog-common/src/main/java/cn/celess/common/exception/BlogExceptionHandler.java @@ -4,10 +4,10 @@ import cn.celess.common.constant.ResponseEnum; import cn.celess.common.entity.Response; import cn.celess.common.service.MailService; import cn.celess.common.util.DateFormatUtil; +import cn.celess.common.util.EnvironmentUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; @@ -31,8 +31,6 @@ public class BlogExceptionHandler { MailService mailService; @Autowired HttpServletRequest request; - @Value("${spring.profiles.active:dev}") - private String activeModel; @ExceptionHandler(value = Exception.class) @ResponseBody @@ -65,7 +63,7 @@ public class BlogExceptionHandler { } // 发送错误信息到邮箱 - if ("prod".equals(activeModel)) { + if ("prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) { logger.debug("有一个未捕获的bug,已发送到邮箱"); sendMessage(e); } diff --git a/blog-common/src/main/java/cn/celess/common/util/EnvironmentUtil.java b/blog-common/src/main/java/cn/celess/common/util/EnvironmentUtil.java new file mode 100644 index 0000000..f868959 --- /dev/null +++ b/blog-common/src/main/java/cn/celess/common/util/EnvironmentUtil.java @@ -0,0 +1,47 @@ +package cn.celess.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.Map; +import java.util.Properties; + +@Slf4j +public class EnvironmentUtil { + + private static final Properties properties = new Properties(); + + + public static String getEnv(String name) { + String value = System.getenv(name); + if (StringUtils.isBlank(value)) { + log.error("没有找到环境变量:" + name); + } + return value; + } + + public static String getEnv(String name, String defaultValue) { + String env = getEnv(name); + if (env == null) { + return defaultValue; + } + return env; + } + + public static String getProperties(String key) { + String value = properties.getProperty(key); + if (StringUtils.isBlank(value)) { + log.error("没有找到配置项: {}", key); + } + return value; + } + + public static String getProperties(String key, String defaultValue) { + return properties.getProperty(key, defaultValue); + } + + + public static void addProperties(Map map) { + properties.putAll(map); + } +} diff --git a/blog-common/src/main/resources/META-INF/spring.factories b/blog-common/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..f686f98 --- /dev/null +++ b/blog-common/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.env.EnvironmentPostProcessor=cn.celess.common.config.CommonEnvPostProcessor +org.springframework.context.ApplicationListener=cn.celess.common.config.CommonEnvPostProcessor \ No newline at end of file diff --git a/blog-deploy/src/main/java/cn/celess/BlogApplication.java b/blog-deploy/src/main/java/cn/celess/BlogApplication.java index 827b8eb..3928c7f 100644 --- a/blog-deploy/src/main/java/cn/celess/BlogApplication.java +++ b/blog-deploy/src/main/java/cn/celess/BlogApplication.java @@ -6,10 +6,14 @@ import org.springframework.boot.Banner; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.core.SpringVersion; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync +@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = "cn.celess.common.test.BaseRedisTest")}) public class BlogApplication { public static final Logger logger = LoggerFactory.getLogger(BlogApplication.class); diff --git a/blog-deploy/src/main/java/cn/celess/configuration/CorsConfig.java b/blog-deploy/src/main/java/cn/celess/configuration/CorsConfig.java index bfe8e2b..2b1b28d 100644 --- a/blog-deploy/src/main/java/cn/celess/configuration/CorsConfig.java +++ b/blog-deploy/src/main/java/cn/celess/configuration/CorsConfig.java @@ -1,6 +1,6 @@ package cn.celess.configuration; -import org.springframework.beans.factory.annotation.Value; +import cn.celess.common.util.EnvironmentUtil; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; @@ -14,8 +14,6 @@ import org.springframework.web.filter.CorsFilter; */ @Configuration public class CorsConfig { - @Value("${spring.profiles.active}") - private String activeModel; @Bean public CorsFilter corsFilter() { @@ -26,7 +24,7 @@ public class CorsConfig { config.addAllowedOrigin("https://celess.cn"); config.addAllowedOrigin("https://www.celess.cn"); // 本地调试时的跨域 - if (!"prod".equals(activeModel)) { + if (!"prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) { config.addAllowedOrigin("http://localhost:4200"); config.addAllowedOrigin("http://127.0.0.1:4200"); } diff --git a/blog-deploy/src/main/java/cn/celess/configuration/DruidConfig.java b/blog-deploy/src/main/java/cn/celess/configuration/DruidConfig.java index 8e93bb0..4dd2857 100644 --- a/blog-deploy/src/main/java/cn/celess/configuration/DruidConfig.java +++ b/blog-deploy/src/main/java/cn/celess/configuration/DruidConfig.java @@ -1,7 +1,7 @@ package cn.celess.configuration; +import cn.celess.common.util.EnvironmentUtil; import com.alibaba.druid.pool.DruidDataSource; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -11,26 +11,15 @@ import org.springframework.context.annotation.Configuration; */ @Configuration public class DruidConfig { - @Value("${spring.datasource.url}") - private String dbUrl; - - @Value("${spring.datasource.username}") - private String username; - - @Value("${spring.datasource.password}") - private String password; - - @Value("${spring.datasource.driver-class-name}") - private String driverClassName; @Bean public DruidDataSource druidDataSource() { DruidDataSource dataSource = new DruidDataSource(); - dataSource.setDriverClassName(driverClassName); + dataSource.setDriverClassName(EnvironmentUtil.getProperties("spring.datasource.driver-class-name")); // 数据库基本信息 - dataSource.setUrl(dbUrl); - dataSource.setUsername(username); - dataSource.setPassword(password); + dataSource.setUrl(EnvironmentUtil.getProperties("spring.datasource.url")); + dataSource.setUsername(EnvironmentUtil.getProperties("spring.datasource.username")); + dataSource.setPassword(EnvironmentUtil.getProperties("spring.datasource.password")); // 数据库连接池配置 dataSource.setInitialSize(10); diff --git a/blog-deploy/src/main/java/cn/celess/configuration/SwaggerConfig.java b/blog-deploy/src/main/java/cn/celess/configuration/SwaggerConfig.java index 6e1222a..0b512e9 100644 --- a/blog-deploy/src/main/java/cn/celess/configuration/SwaggerConfig.java +++ b/blog-deploy/src/main/java/cn/celess/configuration/SwaggerConfig.java @@ -1,6 +1,6 @@ package cn.celess.configuration; -import org.springframework.beans.factory.annotation.Value; +import cn.celess.common.util.EnvironmentUtil; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; @@ -20,13 +20,10 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; @EnableSwagger2 public class SwaggerConfig { - @Value("${spring.profiles.active}") - private String environment; - @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) - .enable(!"prod".equals(environment)) + .enable(!"prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("cn.celess")) diff --git a/blog-extension/src/main/java/cn/celess/extension/serviceimpl/QiniuServiceImpl.java b/blog-extension/src/main/java/cn/celess/extension/serviceimpl/QiniuServiceImpl.java index 37f5994..79b09c9 100644 --- a/blog-extension/src/main/java/cn/celess/extension/serviceimpl/QiniuServiceImpl.java +++ b/blog-extension/src/main/java/cn/celess/extension/serviceimpl/QiniuServiceImpl.java @@ -2,6 +2,7 @@ package cn.celess.extension.serviceimpl; import cn.celess.common.entity.vo.QiniuResponse; import cn.celess.common.service.QiniuService; +import cn.celess.common.util.EnvironmentUtil; import com.qiniu.common.QiniuException; import com.qiniu.common.Zone; import com.qiniu.http.Response; @@ -10,7 +11,6 @@ import com.qiniu.storage.Configuration; import com.qiniu.storage.UploadManager; import com.qiniu.storage.model.FileInfo; import com.qiniu.util.Auth; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.InputStream; @@ -26,14 +26,9 @@ public class QiniuServiceImpl implements QiniuService { private static BucketManager bucketManager; private static Auth auth; - @Value("${qiniu.accessKey}") - private String accessKey; - @Value("${qiniu.secretKey}") - private String secretKey; - @Value("${qiniu.bucket}") - private String bucket; - private void init() { + String accessKey = EnvironmentUtil.getProperties("qiniu.accessKey"); + String secretKey = EnvironmentUtil.getProperties("qiniu.secretKey"); if (auth == null || uploadManager == null || bucketManager == null) { auth = Auth.create(accessKey, secretKey); uploadManager = new UploadManager(cfg); @@ -44,6 +39,7 @@ public class QiniuServiceImpl implements QiniuService { @Override public QiniuResponse uploadFile(InputStream is, String fileName) { init(); + String bucket = EnvironmentUtil.getProperties("qiniu.bucket"); //文件存在则删除文件 if (continueFile(fileName)) { try { @@ -66,6 +62,7 @@ public class QiniuServiceImpl implements QiniuService { @Override public FileInfo[] getFileList() { init(); + String bucket = EnvironmentUtil.getProperties("qiniu.bucket"); BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, "", 1000, ""); FileInfo[] items = null; while (fileListIterator.hasNext()) { diff --git a/blog-resource/src/main/resources/application.properties b/blog-resource/src/main/resources/application.properties index 227b958..7832e39 100644 --- a/blog-resource/src/main/resources/application.properties +++ b/blog-resource/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.profiles.active=prod ####七牛的配置 ####cn.celess.blog.service.serviceimpl.QiniuServiceImpl -logging.level.cn.celess.blog=debug +logging.level.cn.celess=info logging.level.cn.celess.common.mapper=info spring.cache.type=redis mybatis.mapper-locations=classpath*:mapper/*.xml diff --git a/blog-user/src/main/java/cn/celess/user/filter/AuthenticationFilter.java b/blog-user/src/main/java/cn/celess/user/filter/AuthenticationFilter.java index 5df9b89..a23d8b2 100644 --- a/blog-user/src/main/java/cn/celess/user/filter/AuthenticationFilter.java +++ b/blog-user/src/main/java/cn/celess/user/filter/AuthenticationFilter.java @@ -28,8 +28,6 @@ public class AuthenticationFilter implements HandlerInterceptor { private static final String ROLE_ADMIN = "admin"; private static final String ROLE_USER = "user"; @Autowired - JwtUtil jwtUtil; - @Autowired RedisUtil redisUtil; @Autowired UserService userService; @@ -41,9 +39,9 @@ public class AuthenticationFilter implements HandlerInterceptor { int indexOf = path.indexOf("/", 1); String rootPath = indexOf == -1 ? path : path.substring(0, indexOf); String jwtStr = request.getHeader("Authorization"); - if (jwtStr != null && !jwtStr.isEmpty() && !jwtUtil.isTokenExpired(jwtStr)) { + if (jwtStr != null && !jwtStr.isEmpty() && !JwtUtil.isTokenExpired(jwtStr)) { // 已登录 记录当前email - request.getSession().setAttribute("email", jwtUtil.getUsernameFromToken(jwtStr)); + request.getSession().setAttribute("email", JwtUtil.getUsernameFromToken(jwtStr)); } // 不需要鉴权的路径 if (!USER_PREFIX.equalsIgnoreCase(rootPath) && !ADMIN_PREFIX.equalsIgnoreCase(rootPath)) { @@ -53,11 +51,11 @@ public class AuthenticationFilter implements HandlerInterceptor { if (jwtStr == null || jwtStr.isEmpty()) { return writeResponse(ResponseEnum.HAVE_NOT_LOG_IN, response, request); } - if (jwtUtil.isTokenExpired(jwtStr)) { + if (JwtUtil.isTokenExpired(jwtStr)) { return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request); } - String email = jwtUtil.getUsernameFromToken(jwtStr); - if (jwtUtil.isTokenExpired(jwtStr)) { + String email = JwtUtil.getUsernameFromToken(jwtStr); + if (JwtUtil.isTokenExpired(jwtStr)) { // 登陆过期 return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request); } @@ -67,7 +65,7 @@ public class AuthenticationFilter implements HandlerInterceptor { String role = userService.getUserRoleByEmail(email); if (role.equals(ROLE_USER) || role.equals(ROLE_ADMIN)) { // 更新token - String token = jwtUtil.updateTokenDate(jwtStr); + String token = JwtUtil.updateTokenDate(jwtStr); response.setHeader("Authorization", token); } if (role.equals(ROLE_ADMIN)) { diff --git a/blog-user/src/main/java/cn/celess/user/serviceimpl/UserServiceImpl.java b/blog-user/src/main/java/cn/celess/user/serviceimpl/UserServiceImpl.java index 827f08e..d5e26e3 100644 --- a/blog-user/src/main/java/cn/celess/user/serviceimpl/UserServiceImpl.java +++ b/blog-user/src/main/java/cn/celess/user/serviceimpl/UserServiceImpl.java @@ -55,8 +55,6 @@ public class UserServiceImpl implements UserService { @Autowired RedisUtil redisUtil; @Autowired - JwtUtil jwtUtil; - @Autowired RedisUserUtil redisUserUtil; @Override @@ -131,7 +129,7 @@ public class UserServiceImpl implements UserService { redisUtil.delete(loginReq.getEmail() + "-passwordWrongTime"); // redis 标记 redisUserUtil.set(user, loginReq.getIsRememberMe()); - token = jwtUtil.generateToken(user, loginReq.getIsRememberMe()); + token = JwtUtil.generateToken(user, loginReq.getIsRememberMe()); } else { logger.info("====> {} 进行权限认证 状态:登录失败 <====", loginReq.getEmail()); request.getSession().removeAttribute("code"); @@ -160,7 +158,7 @@ public class UserServiceImpl implements UserService { if (token == null || token.isEmpty()) { return "注销登录成功"; } - String email = jwtUtil.getUsernameFromToken(token); + String email = JwtUtil.getUsernameFromToken(token); if (redisUtil.hasKey(email + "-login")) { redisUtil.delete(email + "-login"); } diff --git a/blog-user/src/main/java/cn/celess/user/util/JwtUtil.java b/blog-user/src/main/java/cn/celess/user/util/JwtUtil.java index a495516..b078c89 100644 --- a/blog-user/src/main/java/cn/celess/user/util/JwtUtil.java +++ b/blog-user/src/main/java/cn/celess/user/util/JwtUtil.java @@ -3,10 +3,9 @@ package cn.celess.user.util; import cn.celess.common.constant.ResponseEnum; import cn.celess.common.entity.User; import cn.celess.common.exception.BlogResponseException; +import cn.celess.common.util.EnvironmentUtil; import io.jsonwebtoken.*; import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; import java.time.Instant; import java.util.Date; @@ -18,7 +17,6 @@ import java.util.Map; * @Date: 2019/11/16 11:26 * @Description: JWT工具类 */ -@Component @Log4j2 public class JwtUtil { /** @@ -32,36 +30,31 @@ public class JwtUtil { private static final String CLAIM_KEY_USERNAME = "sub"; private static final String BEARER_PREFIX_UPPER = "Bearer"; private static final String BEARER_PREFIX_LOWER = "bearer"; - /** - * JWT 秘钥需自行设置不可泄露 - */ - @Value("${jwt.secret}") - private String SECRET; - public String generateToken(User user, boolean isRemember) { + public static String generateToken(User user, boolean isRemember) { Map claims = new HashMap<>(16); claims.put(CLAIM_KEY_USERNAME, user.getEmail()); return Jwts.builder() .setClaims(claims) .setExpiration(new Date(Instant.now().toEpochMilli() + (isRemember ? EXPIRATION_LONG_TIME : EXPIRATION_SHORT_TIME))) - .signWith(SignatureAlgorithm.HS512, SECRET) + .signWith(SignatureAlgorithm.HS512, EnvironmentUtil.getProperties("jwt.secret")) .compact(); } - public String updateTokenDate(String token) { - Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(getJwtString(token)).getBody(); + public static String updateTokenDate(String token) { + Claims claims = Jwts.parser().setSigningKey(EnvironmentUtil.getProperties("jwt.secret")).parseClaimsJws(getJwtString(token)).getBody(); return Jwts.builder() .setClaims(claims) .setExpiration(new Date(claims.getExpiration().getTime() + EXPIRATION_SHORT_TIME)) - .signWith(SignatureAlgorithm.HS512, SECRET) + .signWith(SignatureAlgorithm.HS512, EnvironmentUtil.getProperties("jwt.secret")) .compact(); } /** * 获取token是否过期 */ - public Boolean isTokenExpired(String token) { + public static Boolean isTokenExpired(String token) { Date expiration = getExpirationDateFromToken(getJwtString(token)); return expiration == null || expiration.before(new Date()); } @@ -69,7 +62,7 @@ public class JwtUtil { /** * 根据token获取username */ - public String getUsernameFromToken(String token) { + public static String getUsernameFromToken(String token) { Claims claims = getClaimsFromToken(getJwtString(token)); return claims == null ? null : claims.getSubject(); } @@ -77,7 +70,7 @@ public class JwtUtil { /** * 获取token的过期时间 */ - public Date getExpirationDateFromToken(String token) { + public static Date getExpirationDateFromToken(String token) { Claims claims = getClaimsFromToken(getJwtString(token)); return claims == null ? null : claims.getExpiration(); } @@ -85,11 +78,11 @@ public class JwtUtil { /** * 解析JWT */ - private Claims getClaimsFromToken(String token) { + private static Claims getClaimsFromToken(String token) { Claims claims = null; try { claims = Jwts.parser() - .setSigningKey(SECRET) + .setSigningKey(EnvironmentUtil.getProperties("jwt.secret")) .parseClaimsJws(getJwtString(token)) .getBody(); } catch (ExpiredJwtException e) { @@ -106,7 +99,7 @@ public class JwtUtil { return claims; } - private String getJwtString(String token) { + private static String getJwtString(String token) { if (token == null) return token; return token.replaceFirst(BEARER_PREFIX_UPPER, "").replace(BEARER_PREFIX_LOWER, ""); } diff --git a/blog-user/src/main/java/cn/celess/user/util/RedisUserUtil.java b/blog-user/src/main/java/cn/celess/user/util/RedisUserUtil.java index 9decbaa..065ea8f 100644 --- a/blog-user/src/main/java/cn/celess/user/util/RedisUserUtil.java +++ b/blog-user/src/main/java/cn/celess/user/util/RedisUserUtil.java @@ -21,8 +21,6 @@ public class RedisUserUtil { @Autowired RedisUtil redisUtil; @Autowired - JwtUtil jwtUtil; - @Autowired HttpServletRequest request; public User get() { @@ -39,7 +37,7 @@ public class RedisUserUtil { if (token == null || token.isEmpty()) { return null; } - String email = jwtUtil.getUsernameFromToken(token); + String email = JwtUtil.getUsernameFromToken(token); return new ObjectMapper().readValue(redisUtil.get(email + "-login"), User.class); } diff --git a/blog-user/src/test/java/cn/celess/user/util/JwtUtilTest.java b/blog-user/src/test/java/cn/celess/user/util/JwtUtilTest.java index 826740f..693f108 100644 --- a/blog-user/src/test/java/cn/celess/user/util/JwtUtilTest.java +++ b/blog-user/src/test/java/cn/celess/user/util/JwtUtilTest.java @@ -1,15 +1,14 @@ package cn.celess.user.util; import cn.celess.common.entity.User; +import cn.celess.common.util.EnvironmentUtil; import cn.celess.user.UserBaseTest; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; -import org.springframework.beans.factory.annotation.Value; -import javax.annotation.Resource; import java.time.Instant; import java.util.Date; @@ -18,20 +17,15 @@ import static org.junit.Assert.*; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JwtUtilTest extends UserBaseTest { - @Resource - JwtUtil jwtUtil; - @Value("${jwt.secret}") - private String secret; - @Test public void testGenerateToken() { User user = new User(); user.setEmail("a@celess.cn"); - String s = jwtUtil.generateToken(user, false); + String s = JwtUtil.generateToken(user, false); assertNotNull(s); String str = null; try { - str = jwtUtil.generateToken(null, false); + str = JwtUtil.generateToken(null, false); } catch (Exception e) { // ignore } @@ -43,38 +37,38 @@ public class JwtUtilTest extends UserBaseTest { String s = Jwts.builder() .setClaims(null) .setExpiration(new Date(Instant.now().toEpochMilli() + 1000)) - .signWith(SignatureAlgorithm.HS512, secret) + .signWith(SignatureAlgorithm.HS512, EnvironmentUtil.getProperties("jwt.secret")) .compact(); Thread.sleep(1010); - assertTrue(jwtUtil.isTokenExpired(s)); - assertFalse(jwtUtil.isTokenExpired(jwtUtil.generateToken(new User(), false))); + assertTrue(JwtUtil.isTokenExpired(s)); + assertFalse(JwtUtil.isTokenExpired(JwtUtil.generateToken(new User(), false))); } @Test public void testGetUsernameFromToken() { User user = new User(); user.setEmail("a@celess.cn"); - String s = jwtUtil.generateToken(user, false); - assertEquals(user.getEmail(), jwtUtil.getUsernameFromToken(s)); + String s = JwtUtil.generateToken(user, false); + assertEquals(user.getEmail(), JwtUtil.getUsernameFromToken(s)); user.setEmail("example@celess.cn"); - assertNotEquals(user.getEmail(), jwtUtil.getUsernameFromToken(s)); + assertNotEquals(user.getEmail(), JwtUtil.getUsernameFromToken(s)); } @Test public void testGetExpirationDateFromToken() { User user = new User(); user.setEmail("a@celess.cn"); - String s = jwtUtil.generateToken(user, false); - assertNotNull(jwtUtil.getExpirationDateFromToken(s)); + String s = JwtUtil.generateToken(user, false); + assertNotNull(JwtUtil.getExpirationDateFromToken(s)); } @Test public void updateTokenDate() { User user = new User(); user.setEmail("a@celess.cn"); - String s = jwtUtil.generateToken(user, false); - Date before = jwtUtil.getExpirationDateFromToken(s); - String s1 = jwtUtil.updateTokenDate(s); - assertTrue(jwtUtil.getExpirationDateFromToken(s1).getTime() - jwtUtil.getExpirationDateFromToken(s).getTime() > 0); + String s = JwtUtil.generateToken(user, false); + Date before = JwtUtil.getExpirationDateFromToken(s); + String s1 = JwtUtil.updateTokenDate(s); + assertTrue(JwtUtil.getExpirationDateFromToken(s1).getTime() - JwtUtil.getExpirationDateFromToken(s).getTime() > 0); } } \ No newline at end of file