创建基础包,完成Shiro封装
This commit is contained in:
34
.gitignore
vendored
Normal file
34
.gitignore
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
HELP.md
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
!**/src/main/**
|
||||||
|
!**/src/test/**
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
mvnw
|
||||||
|
mvnw.cmd
|
||||||
|
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
build/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
36
README.en.md
Normal file
36
README.en.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# common
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
|
||||||
|
|
||||||
|
#### Software Architecture
|
||||||
|
Software architecture description
|
||||||
|
|
||||||
|
#### Installation
|
||||||
|
|
||||||
|
1. xxxx
|
||||||
|
2. xxxx
|
||||||
|
3. xxxx
|
||||||
|
|
||||||
|
#### Instructions
|
||||||
|
|
||||||
|
1. xxxx
|
||||||
|
2. xxxx
|
||||||
|
3. xxxx
|
||||||
|
|
||||||
|
#### Contribution
|
||||||
|
|
||||||
|
1. Fork the repository
|
||||||
|
2. Create Feat_xxx branch
|
||||||
|
3. Commit your code
|
||||||
|
4. Create Pull Request
|
||||||
|
|
||||||
|
|
||||||
|
#### Gitee Feature
|
||||||
|
|
||||||
|
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
|
||||||
|
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
|
||||||
|
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
|
||||||
|
4. The most valuable open source project [GVP](https://gitee.com/gvp)
|
||||||
|
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
|
||||||
|
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
||||||
39
README.md
Normal file
39
README.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# common
|
||||||
|
|
||||||
|
#### 介绍
|
||||||
|
{**以下是码云平台说明,您可以替换此简介**
|
||||||
|
码云是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
|
||||||
|
无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
|
||||||
|
|
||||||
|
#### 软件架构
|
||||||
|
软件架构说明
|
||||||
|
|
||||||
|
|
||||||
|
#### 安装教程
|
||||||
|
|
||||||
|
1. xxxx
|
||||||
|
2. xxxx
|
||||||
|
3. xxxx
|
||||||
|
|
||||||
|
#### 使用说明
|
||||||
|
|
||||||
|
1. xxxx
|
||||||
|
2. xxxx
|
||||||
|
3. xxxx
|
||||||
|
|
||||||
|
#### 参与贡献
|
||||||
|
|
||||||
|
1. Fork 本仓库
|
||||||
|
2. 新建 Feat_xxx 分支
|
||||||
|
3. 提交代码
|
||||||
|
4. 新建 Pull Request
|
||||||
|
|
||||||
|
|
||||||
|
#### 码云特技
|
||||||
|
|
||||||
|
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
|
||||||
|
2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
|
||||||
|
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
|
||||||
|
4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
|
||||||
|
5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
|
||||||
|
6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
||||||
BIN
lib/Dm7JdbcDriver18.jar
Normal file
BIN
lib/Dm7JdbcDriver18.jar
Normal file
Binary file not shown.
171
pom.xml
Normal file
171
pom.xml
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>2.3.0.RELEASE</version>
|
||||||
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
<groupId>com.common.base</groupId>
|
||||||
|
<artifactId>base</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>common-base</name>
|
||||||
|
<description>基础包</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mybatis.spring.boot</groupId>
|
||||||
|
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||||
|
<version>2.1.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.aspectj</groupId>
|
||||||
|
<artifactId>aspectjrt</artifactId>
|
||||||
|
<version>1.8.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.aspectj</groupId>
|
||||||
|
<artifactId>aspectjweaver</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>fastjson</artifactId>
|
||||||
|
<version>1.2.59</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.xiaoymin</groupId>
|
||||||
|
<artifactId>knife4j-spring-boot-starter</artifactId>
|
||||||
|
<version>2.0.2</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.validation</groupId>
|
||||||
|
<artifactId>validation-api</artifactId>
|
||||||
|
<version>2.0.1.Final</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-spring</artifactId>
|
||||||
|
<version>1.3.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>3.10</version><!--$NO-MVN-MAN-VER$-->
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.6</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.mail</groupId>
|
||||||
|
<artifactId>mail</artifactId>
|
||||||
|
<version>1.4.7</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>tk.mybatis</groupId>
|
||||||
|
<artifactId>mapper-spring-boot-starter</artifactId>
|
||||||
|
<version>2.1.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>druid-spring-boot-starter</artifactId>
|
||||||
|
<version>1.1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.pagehelper</groupId>
|
||||||
|
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||||
|
<version>1.2.13</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-pool2</artifactId>
|
||||||
|
<version>2.6.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.junit.vintage</groupId>
|
||||||
|
<artifactId>junit-vintage-engine</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>common-base</finalName>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<webResources>
|
||||||
|
<resource>
|
||||||
|
<!-- 原路径 -->
|
||||||
|
<directory>${project.basedir}/lib/</directory>
|
||||||
|
<targetPath>WEB-INF/lib/</targetPath>
|
||||||
|
<includes>
|
||||||
|
<include>**/*.jar</include>
|
||||||
|
</includes>
|
||||||
|
</resource>
|
||||||
|
</webResources>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.mybatis.generator</groupId>
|
||||||
|
<artifactId>mybatis-generator-maven-plugin</artifactId>
|
||||||
|
<version>1.3.7</version>
|
||||||
|
<configuration>
|
||||||
|
<configurationFile>../common/src/main/resources/generatorConfig.xml</configurationFile>
|
||||||
|
<overwrite>true</overwrite>
|
||||||
|
<verbose>true</verbose>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
26
src/main/java/com/common/base/annotation/LogAnno.java
Normal file
26
src/main/java/com/common/base/annotation/LogAnno.java
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package com.common.base.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志注解
|
||||||
|
*
|
||||||
|
* @author lhc
|
||||||
|
*/
|
||||||
|
// 方法注解
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
// 运行时可见
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface LogAnno {
|
||||||
|
// 记录日志的操作类型
|
||||||
|
String operateType();
|
||||||
|
// 记录日志主键
|
||||||
|
String primaryKey() default "id";
|
||||||
|
// 记录日志表
|
||||||
|
String tableName() default "-";
|
||||||
|
|
||||||
|
boolean isBefore() default false;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.common.base.common;
|
||||||
|
|
||||||
|
import org.apache.shiro.authc.AuthenticationException;
|
||||||
|
import org.apache.shiro.authz.AuthorizationException;
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* @description 异常信息拦截类,如果程序运行过程中抛出异常,会将异常拦截下来,并返回前端一个包含异常信息的Json数据
|
||||||
|
*/
|
||||||
|
|
||||||
|
@ControllerAdvice
|
||||||
|
public class ControllerExceptionHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(Exception.class)
|
||||||
|
@ResponseBody
|
||||||
|
public ResultVO handleServiceException(
|
||||||
|
Exception e) {
|
||||||
|
if (e instanceof AuthorizationException) {
|
||||||
|
return ResultVO.getNoAuthorization();
|
||||||
|
} else if (e instanceof AuthenticationException) {
|
||||||
|
return ResultVO.getFailed("用户名或密码错误");
|
||||||
|
} else if (e instanceof RuntimeException) {
|
||||||
|
System.out.println("handleServiceException");
|
||||||
|
e.printStackTrace();
|
||||||
|
//封装错误信息
|
||||||
|
return ResultVO.getException(e);
|
||||||
|
} else {
|
||||||
|
return ResultVO.getException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//.......
|
||||||
|
}
|
||||||
15
src/main/java/com/common/base/common/Mapper.java
Normal file
15
src/main/java/com/common/base/common/Mapper.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package com.common.base.common;
|
||||||
|
|
||||||
|
import tk.mybatis.mapper.common.*;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* @description 调用tkmapper进行接口封装
|
||||||
|
* @param <T>
|
||||||
|
*/
|
||||||
|
public interface Mapper<T> extends
|
||||||
|
BaseMapper<T>,
|
||||||
|
ExampleMapper<T>,
|
||||||
|
RowBoundsMapper<T>,
|
||||||
|
Marker, ConditionMapper<T>, tk.mybatis.mapper.common.Mapper<T> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.common.base.common;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* @description 异常信息拦截类,如果程序运行过程中抛出异常,会将异常拦截下来,并返回前端一个包含异常信息的Json数据
|
||||||
|
*/
|
||||||
|
|
||||||
|
@RestControllerAdvice
|
||||||
|
public class RestControllerExceptionHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(Exception.class)
|
||||||
|
public ResultVO handleServiceException(
|
||||||
|
RuntimeException e){
|
||||||
|
System.out.println("handleServiceException");
|
||||||
|
e.printStackTrace();
|
||||||
|
//封装错误信息
|
||||||
|
return ResultVO.getException(e);
|
||||||
|
}
|
||||||
|
//.......
|
||||||
|
}
|
||||||
155
src/main/java/com/common/base/common/ResultVO.java
Normal file
155
src/main/java/com/common/base/common/ResultVO.java
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
package com.common.base.common;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lhc
|
||||||
|
* @description 返回结果VO对象
|
||||||
|
*/
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public class ResultVO<T> {
|
||||||
|
|
||||||
|
private static final Integer SUCCESS = 0;
|
||||||
|
private static final Integer FAILED = 1;
|
||||||
|
private static final Integer ERROR = 2;
|
||||||
|
private static final Integer UNLOG = 3;
|
||||||
|
private static final Integer NOAUTH = 4;
|
||||||
|
//("状态码 0成功 1失败 2服务器出错 3未登录 4没有权限")
|
||||||
|
private Integer code=SUCCESS;
|
||||||
|
|
||||||
|
//("返回信息")
|
||||||
|
@ApiModelProperty(example="ActionOK")
|
||||||
|
private String msg;
|
||||||
|
|
||||||
|
//("返回数据")
|
||||||
|
private T data;
|
||||||
|
|
||||||
|
private ResultVO() {
|
||||||
|
this.code = SUCCESS;
|
||||||
|
this.msg = "Action OK";
|
||||||
|
}
|
||||||
|
private ResultVO(T data) {
|
||||||
|
this.code = SUCCESS;
|
||||||
|
this.msg = "Action OK";
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResultVO(Integer code, String msg) {
|
||||||
|
this.code = code;
|
||||||
|
this.msg = msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResultVO(Integer code, String msg, T data) {
|
||||||
|
this.code = code;
|
||||||
|
this.msg = msg;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResultVO(Throwable exp){
|
||||||
|
this.code=ERROR;
|
||||||
|
this.msg=exp.getMessage();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 请求成功 状态码 1
|
||||||
|
*
|
||||||
|
* @param <T> 类型
|
||||||
|
* @return ResultVO
|
||||||
|
*/
|
||||||
|
public static <T> ResultVO getSuccess(T data) {
|
||||||
|
return new ResultVO<T>(data);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 请求成功 状态码 1
|
||||||
|
*
|
||||||
|
* @param <T> 类型
|
||||||
|
* @return ResultVO
|
||||||
|
*/
|
||||||
|
public static <T> ResultVO getSuccess() {
|
||||||
|
return new ResultVO<T>();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 请求成功 状态码 1
|
||||||
|
*
|
||||||
|
* @param msg 返回信息
|
||||||
|
* @param data 返回对象
|
||||||
|
* @param <T> 类型
|
||||||
|
* @return ResultVO
|
||||||
|
*/
|
||||||
|
public static <T> ResultVO getSuccess(String msg, T data) {
|
||||||
|
return new ResultVO<T>(SUCCESS, msg, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求失败 状态码 0
|
||||||
|
*
|
||||||
|
* @param msg 返回信息
|
||||||
|
* @param <T> 类型
|
||||||
|
* @return ResultVO
|
||||||
|
*/
|
||||||
|
public static <T> ResultVO getFailed(String msg) {
|
||||||
|
return new ResultVO<T>(FAILED, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求失败 状态 0
|
||||||
|
*
|
||||||
|
* @param msg 返回信息
|
||||||
|
* @param data 返回数据
|
||||||
|
* @param <T> 类型
|
||||||
|
* @return ResultVO
|
||||||
|
*/
|
||||||
|
public static <T> ResultVO getFailed(String msg, T data) {
|
||||||
|
return new ResultVO<T>(FAILED, msg, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户未登录
|
||||||
|
*
|
||||||
|
* @param <T> 类型
|
||||||
|
* @return ResultVO
|
||||||
|
*/
|
||||||
|
public static <T> ResultVO getNoLogin() {
|
||||||
|
return new ResultVO<T>(UNLOG, "用户未登录,请重新登录");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户没有操作权限
|
||||||
|
*
|
||||||
|
* @param <T> 类型
|
||||||
|
* @return ResultVO
|
||||||
|
*/
|
||||||
|
public static <T> ResultVO getNoAuthorization() {
|
||||||
|
return new ResultVO<T>(NOAUTH, "用户没有操作权限,请重新登录");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> ResultVO getException(Throwable exp) {
|
||||||
|
return new ResultVO<T>(exp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCode(Integer code) {
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMsg() {
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMsg(String msg) {
|
||||||
|
this.msg = msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(T data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
src/main/java/com/common/base/common/ServiceException.java
Normal file
27
src/main/java/com/common/base/common/ServiceException.java
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package com.common.base.common;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* @description 自定义异常类
|
||||||
|
*/
|
||||||
|
public class ServiceException extends RuntimeException {
|
||||||
|
|
||||||
|
public ServiceException() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||||
|
super(message, cause, enableSuppression, writableStackTrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
63
src/main/java/com/common/base/common/WebPatternlLog.java
Normal file
63
src/main/java/com/common/base/common/WebPatternlLog.java
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
package com.common.base.common;
|
||||||
|
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.After;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Before;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* 通过Aop拦截访问接口(Controller)的URL,参数,IP等信息
|
||||||
|
*/
|
||||||
|
@Aspect
|
||||||
|
@Component
|
||||||
|
public class WebPatternlLog {
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(WebPatternlLog.class);
|
||||||
|
|
||||||
|
//这个切点的表达式需要根据自己的项目来写
|
||||||
|
@Pointcut("execution(public * com.common.base.controller..*(..))")
|
||||||
|
public void log() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before("log()")
|
||||||
|
public void doBefore(JoinPoint joinPoint) {
|
||||||
|
//logger.info("aop doBefore..");
|
||||||
|
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
||||||
|
HttpServletRequest request = attributes.getRequest();
|
||||||
|
|
||||||
|
//url
|
||||||
|
logger.info("url={}", request.getRequestURI());
|
||||||
|
|
||||||
|
//method
|
||||||
|
logger.info("method={}", request.getMethod());
|
||||||
|
|
||||||
|
//ip
|
||||||
|
logger.info("ip={}", request.getRemoteAddr());
|
||||||
|
|
||||||
|
//类方法
|
||||||
|
logger.info("classMethod={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
|
||||||
|
|
||||||
|
//参数
|
||||||
|
Enumeration<String> paramter = request.getParameterNames();
|
||||||
|
while (paramter.hasMoreElements()) {
|
||||||
|
String str = (String) paramter.nextElement();
|
||||||
|
logger.info(str + "={}", request.getParameter(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@After("log()")
|
||||||
|
public void doAfter() {
|
||||||
|
//logger.info("aop doAfter");
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/main/java/com/common/base/config/GetHttpSession.java
Normal file
22
src/main/java/com/common/base/config/GetHttpSession.java
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package com.common.base.config;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
import javax.websocket.HandshakeResponse;
|
||||||
|
import javax.websocket.server.HandshakeRequest;
|
||||||
|
import javax.websocket.server.ServerEndpointConfig;
|
||||||
|
import javax.websocket.server.ServerEndpointConfig.Configurator;
|
||||||
|
/*
|
||||||
|
* 获取HttpSession
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class GetHttpSession extends Configurator {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void modifyHandshake(ServerEndpointConfig sec,
|
||||||
|
HandshakeRequest request, HandshakeResponse response) {
|
||||||
|
HttpSession httpSession=(HttpSession) request.getHttpSession();
|
||||||
|
sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
36
src/main/java/com/common/base/config/RedisConfig.java
Normal file
36
src/main/java/com/common/base/config/RedisConfig.java
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package com.common.base.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
||||||
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
|
||||||
|
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description redis配置类
|
||||||
|
* @author lhc
|
||||||
|
* @date 2020-06-15
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class RedisConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* springboot2.x 使用LettuceConnectionFactory 代替 RedisConnectionFactory
|
||||||
|
* application.yml配置基本信息后,springboot2.x RedisAutoConfiguration能够自动装配
|
||||||
|
* LettuceConnectionFactory 和 RedisConnectionFactory 及其 RedisTemplate
|
||||||
|
* @param redisConnectionFactory
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory){
|
||||||
|
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
|
||||||
|
redisTemplate.setKeySerializer(new StringRedisSerializer());
|
||||||
|
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
|
||||||
|
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
|
||||||
|
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
|
||||||
|
redisTemplate.setConnectionFactory(redisConnectionFactory);
|
||||||
|
return redisTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
57
src/main/java/com/common/base/config/SimpleCORSFilter.java
Normal file
57
src/main/java/com/common/base/config/SimpleCORSFilter.java
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package com.common.base.config;
|
||||||
|
|
||||||
|
import org.springframework.core.Ordered;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.servlet.*;
|
||||||
|
import javax.servlet.annotation.WebFilter;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跨域支持
|
||||||
|
|
||||||
|
*/
|
||||||
|
@WebFilter
|
||||||
|
@Component
|
||||||
|
@Order(Ordered.HIGHEST_PRECEDENCE)
|
||||||
|
public class SimpleCORSFilter implements Filter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroy() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
||||||
|
throws IOException, ServletException {
|
||||||
|
/*String[] whiteList = {"http://fwh.castscs.org.cn", "http://localhost"};
|
||||||
|
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
||||||
|
String myOrigin = httpServletRequest.getHeader("origin");
|
||||||
|
boolean isValid = false;
|
||||||
|
for( String ip : whiteList ) {
|
||||||
|
if( myOrigin != null && myOrigin.equals(ip) ){
|
||||||
|
isValid = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
||||||
|
String myOrigin = httpServletRequest.getHeader("origin");
|
||||||
|
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
|
||||||
|
httpServletResponse.setHeader("Access-Control-Allow-Origin", myOrigin);
|
||||||
|
httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
|
||||||
|
httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
|
||||||
|
httpServletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with, X-Access-Token");
|
||||||
|
// 是否支持cookie跨域
|
||||||
|
httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
|
||||||
|
chain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(FilterConfig arg0) throws ServletException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
9
src/main/java/com/common/base/config/WebMvcConfig.java
Normal file
9
src/main/java/com/common/base/config/WebMvcConfig.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package com.common.base.config;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.filter.FormContentFilter;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class WebMvcConfig extends FormContentFilter {
|
||||||
|
|
||||||
|
}
|
||||||
23
src/main/java/com/common/base/config/webSessionListener.java
Normal file
23
src/main/java/com/common/base/config/webSessionListener.java
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package com.common.base.config;
|
||||||
|
|
||||||
|
import javax.servlet.ServletRequestEvent;
|
||||||
|
import javax.servlet.ServletRequestListener;
|
||||||
|
import javax.servlet.annotation.WebListener;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
@WebListener
|
||||||
|
public class webSessionListener implements ServletRequestListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void requestInitialized(ServletRequestEvent sre) {
|
||||||
|
//将所有request请求都携带上httpSession
|
||||||
|
((HttpServletRequest) sre.getServletRequest()).getSession();
|
||||||
|
|
||||||
|
}
|
||||||
|
public webSessionListener() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void requestDestroyed(ServletRequestEvent arg0) {
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/main/java/com/common/base/dao/FtTokenDao.java
Normal file
16
src/main/java/com/common/base/dao/FtTokenDao.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package com.common.base.dao;
|
||||||
|
|
||||||
|
|
||||||
|
import com.common.base.common.Mapper;
|
||||||
|
import com.common.base.entity.FtToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (FtToken)表数据库访问层
|
||||||
|
*
|
||||||
|
* @author lhc
|
||||||
|
* @since 2020-02-11 20:26:15
|
||||||
|
*/
|
||||||
|
public interface FtTokenDao extends Mapper<FtToken> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
41
src/main/java/com/common/base/entity/FtToken.java
Normal file
41
src/main/java/com/common/base/entity/FtToken.java
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
package com.common.base.entity;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (FtToken)实体类
|
||||||
|
*
|
||||||
|
* @author lhc
|
||||||
|
* @since 2020-02-11 20:26:15
|
||||||
|
*/
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder(toBuilder = true)
|
||||||
|
@Data
|
||||||
|
public class FtToken implements Serializable {
|
||||||
|
private static final long serialVersionUID = 202774093136745829L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(
|
||||||
|
strategy = GenerationType.IDENTITY,
|
||||||
|
generator = "select TOKEN_ID.nextval from dual")
|
||||||
|
private String tokenId;
|
||||||
|
|
||||||
|
private String token;
|
||||||
|
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
private Date updateTime;
|
||||||
|
|
||||||
|
private Date expireTime;
|
||||||
|
|
||||||
|
}
|
||||||
138
src/main/java/com/common/base/shiro/AuthFilter.java
Normal file
138
src/main/java/com/common/base/shiro/AuthFilter.java
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
package com.common.base.shiro;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.shiro.authc.AuthenticationException;
|
||||||
|
import org.apache.shiro.authc.AuthenticationToken;
|
||||||
|
import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
|
||||||
|
import javax.servlet.ServletRequest;
|
||||||
|
import javax.servlet.ServletResponse;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* auth过滤器
|
||||||
|
*
|
||||||
|
* @Author lhc
|
||||||
|
*/
|
||||||
|
public class AuthFilter extends AuthenticatingFilter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成自定义token
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @param response
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
|
||||||
|
//获取请求token
|
||||||
|
String token = getRequestToken((HttpServletRequest) request);
|
||||||
|
if (StringUtils.isBlank(token)) {
|
||||||
|
HttpServletResponse httpResponse = (HttpServletResponse) response;
|
||||||
|
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
||||||
|
String myOrigin = httpServletRequest.getHeader("origin");
|
||||||
|
httpResponse.setContentType("application/json;charset=utf-8");
|
||||||
|
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
|
||||||
|
httpResponse.setHeader("Access-Control-Allow-Origin", myOrigin);
|
||||||
|
httpResponse.setCharacterEncoding("UTF-8");
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
result.put("code", 3);
|
||||||
|
result.put("msg", "未登陆");
|
||||||
|
String json = JSON.toJSONString(result);
|
||||||
|
httpResponse.getWriter().print(json);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new AuthToken(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 步骤1.所有请求全部拒绝访问
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @param response
|
||||||
|
* @param mappedValue
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
|
||||||
|
return ((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 步骤2,拒绝访问的请求,会调用onAccessDenied方法,onAccessDenied方法先获取 token,再调用executeLogin方法
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @param response
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
|
||||||
|
//获取请求token,如果token不存在,直接返回
|
||||||
|
String token = getRequestToken((HttpServletRequest) request);
|
||||||
|
if (StringUtils.isBlank(token)) {
|
||||||
|
HttpServletResponse httpResponse = (HttpServletResponse) response;
|
||||||
|
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
||||||
|
String myOrigin = httpServletRequest.getHeader("origin");
|
||||||
|
httpResponse.setContentType("application/json;charset=utf-8");
|
||||||
|
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
|
||||||
|
httpResponse.setHeader("Access-Control-Allow-Origin", myOrigin);
|
||||||
|
httpResponse.setCharacterEncoding("UTF-8");
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
result.put("code", 3);
|
||||||
|
result.put("msg", "未登陆");
|
||||||
|
String json = JSON.toJSONString(result);
|
||||||
|
httpResponse.getWriter().print(json);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return executeLogin(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登陆失败时候调用
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
|
||||||
|
//处理登录失败的异常
|
||||||
|
HttpServletResponse httpResponse = (HttpServletResponse) response;
|
||||||
|
httpResponse.setContentType("application/json;charset=utf-8");
|
||||||
|
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
|
||||||
|
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
||||||
|
String myOrigin = httpServletRequest.getHeader("origin");
|
||||||
|
httpResponse.setHeader("Access-Control-Allow-Origin", myOrigin);
|
||||||
|
httpResponse.setCharacterEncoding("UTF-8");
|
||||||
|
try {
|
||||||
|
//处理登录失败的异常
|
||||||
|
Throwable throwable = e.getCause() == null ? e : e.getCause();
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
result.put("code", 3);
|
||||||
|
result.put("msg", "未登陆");
|
||||||
|
String json = JSON.toJSONString(result);
|
||||||
|
httpResponse.getWriter().print(json);
|
||||||
|
} catch (IOException e1) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取请求的token
|
||||||
|
*/
|
||||||
|
private String getRequestToken(HttpServletRequest httpRequest) {
|
||||||
|
//从header中获取token
|
||||||
|
String token = httpRequest.getHeader("X-Access-Token");
|
||||||
|
//如果header中不存在token,则从参数中获取token
|
||||||
|
if (StringUtils.isBlank(token)) {
|
||||||
|
if (StringUtils.isBlank(token)) {
|
||||||
|
token = httpRequest.getParameter("token");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/main/java/com/common/base/shiro/AuthToken.java
Normal file
26
src/main/java/com/common/base/shiro/AuthToken.java
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package com.common.base.shiro;
|
||||||
|
|
||||||
|
import org.apache.shiro.authc.AuthenticationToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义AuthenticationToken类
|
||||||
|
* @Author lhc
|
||||||
|
*/
|
||||||
|
public class AuthToken implements AuthenticationToken {
|
||||||
|
|
||||||
|
private String token;
|
||||||
|
|
||||||
|
public AuthToken(String token) {
|
||||||
|
this.token = token;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getPrincipal() {
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getCredentials() {
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
}
|
||||||
81
src/main/java/com/common/base/shiro/CustomRealm.java
Normal file
81
src/main/java/com/common/base/shiro/CustomRealm.java
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
package com.common.base.shiro;
|
||||||
|
|
||||||
|
|
||||||
|
import com.common.base.entity.FtToken;
|
||||||
|
import com.common.base.shiro.service.ShiroService;
|
||||||
|
import com.common.base.shiro.service.SystemRealm;
|
||||||
|
import com.common.base.utils.RedisUtil;
|
||||||
|
import org.apache.shiro.authc.*;
|
||||||
|
import org.apache.shiro.authz.AuthorizationInfo;
|
||||||
|
import org.apache.shiro.realm.AuthorizingRealm;
|
||||||
|
import org.apache.shiro.subject.PrincipalCollection;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class CustomRealm extends AuthorizingRealm {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ShiroService shiroService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SystemRealm systemRealm;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
|
||||||
|
//1. 从 PrincipalCollection 中来获取登录用户的信息
|
||||||
|
Object user = principalCollection.getPrimaryPrincipal();
|
||||||
|
return systemRealm.setAuthoriztion(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
|
||||||
|
String accessToken = (String) token.getPrincipal();
|
||||||
|
String userId;
|
||||||
|
if (RedisUtil.isUseful) {
|
||||||
|
Map<Object,Object> hashMap = redisUtil.hmget(accessToken);
|
||||||
|
userId = (String) hashMap.get("userId");
|
||||||
|
if (userId == null) {
|
||||||
|
throw new IncorrectCredentialsException("token失效,请重新登录");
|
||||||
|
}
|
||||||
|
String tokenStr = (String) redisUtil.hget("session", String.valueOf(userId));
|
||||||
|
if (tokenStr==null||!tokenStr.equals(accessToken)) {
|
||||||
|
redisUtil.del(accessToken);
|
||||||
|
throw new IncorrectCredentialsException("token失效,请重新登录");
|
||||||
|
}
|
||||||
|
Date expireTime = (Date) hashMap.get("expireTime");
|
||||||
|
System.out.println(expireTime);
|
||||||
|
if (expireTime.getTime() < System.currentTimeMillis()) {
|
||||||
|
redisUtil.del(accessToken);
|
||||||
|
throw new IncorrectCredentialsException("token失效,请重新登录");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//1. 根据accessToken,查询用户信息
|
||||||
|
FtToken tokenEntity = shiroService.findByToken(accessToken);
|
||||||
|
userId = tokenEntity.getUserId();
|
||||||
|
//2. token失效
|
||||||
|
if (tokenEntity.getExpireTime().getTime() < System.currentTimeMillis()) {
|
||||||
|
throw new IncorrectCredentialsException("token失效,请重新登录");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//3. 调用数据库的方法, 从数据库中查询 username 对应的用户记录
|
||||||
|
Object user = shiroService.findByUserId(userId);
|
||||||
|
//4. 若用户不存在, 则可以抛出 UnknownAccountException 异常
|
||||||
|
if (user == null) {
|
||||||
|
throw new UnknownAccountException("用户不存在!");
|
||||||
|
}
|
||||||
|
//5. 根据用户的情况, 来构建 AuthenticationInfo 对象并返回. 通常使用的实现类为: SimpleAuthenticationInfo
|
||||||
|
return new SimpleAuthenticationInfo(user, accessToken, this.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supports(AuthenticationToken authenticationToken) {
|
||||||
|
return authenticationToken instanceof AuthToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
91
src/main/java/com/common/base/shiro/ShiroConfig.java
Normal file
91
src/main/java/com/common/base/shiro/ShiroConfig.java
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
package com.common.base.shiro;
|
||||||
|
|
||||||
|
import com.common.base.shiro.service.SystemRealm;
|
||||||
|
import com.common.base.utils.SpringContextUtil;
|
||||||
|
import org.apache.shiro.mgt.SecurityManager;
|
||||||
|
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
||||||
|
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
||||||
|
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
||||||
|
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
|
||||||
|
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.Filter;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class ShiroConfig {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
SystemRealm systemRealm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不加这个注解不生效,具体不详
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnMissingBean
|
||||||
|
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
|
||||||
|
DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
|
||||||
|
defaultAAP.setProxyTargetClass(true);
|
||||||
|
return defaultAAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将自己的验证方式加入容器
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public CustomRealm myShiroRealm() {
|
||||||
|
return new CustomRealm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 权限管理,配置主要是Realm的管理认证
|
||||||
|
*/
|
||||||
|
@Bean("securityManager")
|
||||||
|
public SecurityManager securityManager() {
|
||||||
|
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
|
||||||
|
securityManager.setRealm(myShiroRealm());
|
||||||
|
return securityManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter工厂,设置对应的过滤条件和跳转条件
|
||||||
|
*/
|
||||||
|
@Bean("shiroFilter")
|
||||||
|
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
|
||||||
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
||||||
|
shiroFilterFactoryBean.setSecurityManager(securityManager);
|
||||||
|
Map<String, Filter> filters = new HashMap<>();
|
||||||
|
filters.put("auth", new AuthFilter());
|
||||||
|
shiroFilterFactoryBean.setFilters(filters);
|
||||||
|
shiroFilterFactoryBean.setFilters(filters);
|
||||||
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(systemRealm.setShiroUrl());
|
||||||
|
return shiroFilterFactoryBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加入注解的使用,不加入这个注解不生效
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
|
||||||
|
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
|
||||||
|
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
|
||||||
|
return authorizationAttributeSourceAdvisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
|
||||||
|
return new LifecycleBeanPostProcessor();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.common.base.shiro.service;
|
||||||
|
|
||||||
|
|
||||||
|
import com.common.base.common.ResultVO;
|
||||||
|
import com.common.base.entity.FtToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lhc
|
||||||
|
*/
|
||||||
|
public interface ShiroService {
|
||||||
|
|
||||||
|
ResultVO createToken(String userId);
|
||||||
|
|
||||||
|
ResultVO logout(String accessToken);
|
||||||
|
|
||||||
|
FtToken findByToken(String accessToken);
|
||||||
|
|
||||||
|
Object findByUserId(String userId);
|
||||||
|
}
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
package com.common.base.shiro.service;
|
||||||
|
|
||||||
|
import com.common.base.common.ResultVO;
|
||||||
|
import com.common.base.common.ServiceException;
|
||||||
|
import com.common.base.dao.FtTokenDao;
|
||||||
|
import com.common.base.entity.FtToken;
|
||||||
|
import com.common.base.utils.RedisUtil;
|
||||||
|
import com.common.base.utils.TokenProccessor;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import tk.mybatis.mapper.entity.Example;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lhc
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class ShiroServiceImpl implements ShiroService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户失效时间
|
||||||
|
*/
|
||||||
|
private static int EXPIRE;
|
||||||
|
|
||||||
|
@Value("${login-time-out}")
|
||||||
|
public void setHost(int hours) {
|
||||||
|
ShiroServiceImpl.EXPIRE = hours * 3600 * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
FtTokenDao tokenMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
RedisUtil redisUtil;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
SystemRealm systemRealm;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
/** 重点!!
|
||||||
|
* 生成一个token
|
||||||
|
*@param [userId]
|
||||||
|
*@return Result
|
||||||
|
*/
|
||||||
|
public ResultVO createToken(String userId) {
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
TokenProccessor tokenProccessor = TokenProccessor.getInstance();
|
||||||
|
//生成一个token
|
||||||
|
String token = tokenProccessor.makeToken();
|
||||||
|
//当前时间
|
||||||
|
Date now = new Date();
|
||||||
|
//过期时间
|
||||||
|
Date expireTime = new Date(now.getTime() + EXPIRE);
|
||||||
|
FtToken tokenEntity = new FtToken();
|
||||||
|
// 是否使用redis存入token
|
||||||
|
if (RedisUtil.isUseful) {
|
||||||
|
boolean flag = redisUtil.hset("session", String.valueOf(userId), token,EXPIRE / 1000);
|
||||||
|
if (flag) {
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("userId", userId);
|
||||||
|
map.put("expireTime",expireTime);
|
||||||
|
flag = redisUtil.hmset(token, map, EXPIRE / 1000);
|
||||||
|
if (!flag) {
|
||||||
|
throw new ServiceException("登陆失败");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ServiceException("登陆失败");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tokenEntity.setUserId(userId);
|
||||||
|
//判断是否生成过token
|
||||||
|
tokenEntity = tokenMapper.selectOne(tokenEntity);
|
||||||
|
if (tokenEntity == null) {
|
||||||
|
tokenEntity = new FtToken();
|
||||||
|
tokenEntity.setUserId(userId);
|
||||||
|
tokenEntity.setToken(token);
|
||||||
|
tokenEntity.setUpdateTime(now);
|
||||||
|
tokenEntity.setExpireTime(expireTime);
|
||||||
|
//保存token
|
||||||
|
tokenMapper.insertSelective(tokenEntity);
|
||||||
|
} else {
|
||||||
|
tokenEntity.setToken(token);
|
||||||
|
tokenEntity.setUpdateTime(now);
|
||||||
|
tokenEntity.setExpireTime(expireTime);
|
||||||
|
//更新token
|
||||||
|
int i = tokenMapper.updateByPrimaryKey(tokenEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//返回token给前端
|
||||||
|
result.put("token", token);
|
||||||
|
result.put("expire", expireTime);
|
||||||
|
return ResultVO.getSuccess(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResultVO logout(String accessToken) {
|
||||||
|
if (RedisUtil.isUseful) {
|
||||||
|
Map<Object,Object> map = redisUtil.hmget(accessToken);
|
||||||
|
Integer userId = (Integer) map.get("userId");
|
||||||
|
redisUtil.del(accessToken);
|
||||||
|
redisUtil.hdel("session", String.valueOf(userId));
|
||||||
|
return ResultVO.getSuccess();
|
||||||
|
} else {
|
||||||
|
//生成一个token
|
||||||
|
TokenProccessor tokenProccessor = TokenProccessor.getInstance();
|
||||||
|
//生成一个token
|
||||||
|
String token = tokenProccessor.makeToken();
|
||||||
|
//修改token
|
||||||
|
FtToken tokenEntity = new FtToken();
|
||||||
|
tokenEntity.setToken(token);
|
||||||
|
Example example = new Example(FtToken.class);
|
||||||
|
example.createCriteria().andEqualTo("token", accessToken);
|
||||||
|
int i = tokenMapper.updateByExampleSelective(tokenEntity, example);
|
||||||
|
if (i == 1) {
|
||||||
|
return ResultVO.getSuccess();
|
||||||
|
} else {
|
||||||
|
throw new ServiceException("退出失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FtToken findByToken(String accessToken) {
|
||||||
|
FtToken osToken = new FtToken();
|
||||||
|
osToken.setToken(accessToken);
|
||||||
|
return tokenMapper.selectOne(osToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object findByUserId(String userId) {
|
||||||
|
return systemRealm.findByUserId(userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ServiceLoader<ShiroService> loader = ServiceLoader.load(ShiroService.class);
|
||||||
|
Iterator<ShiroService> iterator = loader.iterator();
|
||||||
|
iterator.next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.common.base.shiro.service;
|
||||||
|
|
||||||
|
public class ShiroType {
|
||||||
|
|
||||||
|
public static final String AUTH = "auth";
|
||||||
|
public static final String ANON = "anon";
|
||||||
|
}
|
||||||
41
src/main/java/com/common/base/shiro/service/SystemRealm.java
Normal file
41
src/main/java/com/common/base/shiro/service/SystemRealm.java
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
package com.common.base.shiro.service;
|
||||||
|
|
||||||
|
|
||||||
|
import com.common.base.entity.FtToken;
|
||||||
|
import org.apache.shiro.authz.SimpleAuthorizationInfo;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lhc
|
||||||
|
* @date 2020-07-28
|
||||||
|
* @descirption 系统realm权限设置接口
|
||||||
|
*/
|
||||||
|
public interface SystemRealm {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取权限注入接口
|
||||||
|
* @param user 用户信息
|
||||||
|
* @return shiro权限注入对象
|
||||||
|
*/
|
||||||
|
SimpleAuthorizationInfo setAuthoriztion(Object user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户信息
|
||||||
|
* @param userId 用户标识
|
||||||
|
* @return 用户信息
|
||||||
|
*/
|
||||||
|
Object findByUserId(String userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置Shiro访问的url
|
||||||
|
* @return urlMap
|
||||||
|
*/
|
||||||
|
LinkedHashMap<String, String> setShiroUrl();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置Shiro的token
|
||||||
|
* @return token
|
||||||
|
*/
|
||||||
|
FtToken setShiroToken();
|
||||||
|
}
|
||||||
84
src/main/java/com/common/base/utils/DateUtil.java
Normal file
84
src/main/java/com/common/base/utils/DateUtil.java
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import java.time.*;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class DateUtil {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期格式化成字符串
|
||||||
|
* @param date
|
||||||
|
* @param format
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String DateFormat(Date date,String format) {
|
||||||
|
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
|
||||||
|
LocalDateTime date1 = date2LocalDateTime(date);
|
||||||
|
return date1.format(dtf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串格式化成日期
|
||||||
|
*/
|
||||||
|
public static Date StringFormat(String string,String format) {
|
||||||
|
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
|
||||||
|
LocalDate localDate = LocalDate.parse(string,dtf);
|
||||||
|
return localDate2Date(localDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Date转换为LocalDateTime
|
||||||
|
* @param date
|
||||||
|
*/
|
||||||
|
public static LocalDateTime date2LocalDateTime(Date date){
|
||||||
|
Instant instant = date.toInstant();//An instantaneous point on the time-line.(时间线上的一个瞬时点。)
|
||||||
|
ZoneId zoneId = ZoneId.systemDefault();//A time-zone ID, such as {@code Europe/Paris}.(时区)
|
||||||
|
return instant.atZone(zoneId).toLocalDateTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LocalDateTime转换为Date
|
||||||
|
* @param localDateTime
|
||||||
|
*/
|
||||||
|
public static Date localDateTime2Date( LocalDateTime localDateTime){
|
||||||
|
ZoneId zoneId = ZoneId.systemDefault();
|
||||||
|
ZonedDateTime zdt = localDateTime.atZone(zoneId);//Combines this date-time with a time-zone to create a ZonedDateTime.
|
||||||
|
return Date.from(zdt.toInstant());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* localDate转Date
|
||||||
|
*/
|
||||||
|
public static Date localDate2Date(LocalDate localDate) {
|
||||||
|
ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
|
||||||
|
Instant instant1 = zonedDateTime.toInstant();
|
||||||
|
return Date.from(instant1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Date 转 localDate
|
||||||
|
*/
|
||||||
|
public static LocalDate date2LocalDate(Date date) {
|
||||||
|
Instant instant = date.toInstant();
|
||||||
|
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
|
||||||
|
return zdt.toLocalDate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字符串中的月份
|
||||||
|
* @param str
|
||||||
|
* @param format
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int getStringMonth(String str,String format) {
|
||||||
|
Date date=StringFormat(str, format);
|
||||||
|
Calendar cal=Calendar.getInstance();
|
||||||
|
cal.setTime(date);
|
||||||
|
return cal.get(Calendar.MONTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
320
src/main/java/com/common/base/utils/EncryptUtil.java
Normal file
320
src/main/java/com/common/base/utils/EncryptUtil.java
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.KeyGenerator;
|
||||||
|
import javax.crypto.Mac;
|
||||||
|
import javax.crypto.SecretKey;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
|
public class EncryptUtil {
|
||||||
|
public static final String MD5 = "MD5";
|
||||||
|
public static final String SHA1 = "SHA1";
|
||||||
|
public static final String HmacMD5 = "HmacMD5";
|
||||||
|
public static final String HmacSHA1 = "HmacSHA1";
|
||||||
|
public static final String DES = "DES";
|
||||||
|
public static final String AES = "AES";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编码格式;默认使用uft-8
|
||||||
|
*/
|
||||||
|
public String charset = "utf-8";
|
||||||
|
/**
|
||||||
|
* DES
|
||||||
|
*/
|
||||||
|
public int keysizeDES = 0;
|
||||||
|
/**
|
||||||
|
* AES
|
||||||
|
*/
|
||||||
|
public int keysizeAES = 128;
|
||||||
|
|
||||||
|
public static EncryptUtil me;
|
||||||
|
|
||||||
|
private EncryptUtil() {
|
||||||
|
//单例
|
||||||
|
}
|
||||||
|
|
||||||
|
//双重锁
|
||||||
|
public static EncryptUtil getInstance() {
|
||||||
|
if (me == null) {
|
||||||
|
synchronized (EncryptUtil.class) {
|
||||||
|
if (me == null) {
|
||||||
|
me = new EncryptUtil();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return me;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用MessageDigest进行单向加密(无密码)
|
||||||
|
*
|
||||||
|
* @param res 被加密的文本
|
||||||
|
* @param algorithm 加密算法名称
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String messageDigest(String res, String algorithm) {
|
||||||
|
try {
|
||||||
|
MessageDigest md = MessageDigest.getInstance(algorithm);
|
||||||
|
byte[] resBytes = charset == null ? res.getBytes() : res.getBytes(charset);
|
||||||
|
return base64(md.digest(resBytes));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用KeyGenerator进行单向/双向加密(可设密码)
|
||||||
|
*
|
||||||
|
* @param res 被加密的原文
|
||||||
|
* @param algorithm 加密使用的算法名称
|
||||||
|
* @param key 加密使用的秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String keyGeneratorMac(String res, String algorithm, String key) {
|
||||||
|
try {
|
||||||
|
SecretKey sk = null;
|
||||||
|
if (key == null) {
|
||||||
|
KeyGenerator kg = KeyGenerator.getInstance(algorithm);
|
||||||
|
sk = kg.generateKey();
|
||||||
|
} else {
|
||||||
|
byte[] keyBytes = charset == null ? key.getBytes() : key.getBytes(charset);
|
||||||
|
sk = new SecretKeySpec(keyBytes, algorithm);
|
||||||
|
}
|
||||||
|
Mac mac = Mac.getInstance(algorithm);
|
||||||
|
mac.init(sk);
|
||||||
|
byte[] result = mac.doFinal(res.getBytes());
|
||||||
|
return base64(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用KeyGenerator双向加密,DES/AES,注意这里转化为字符串的时候是将2进制转为16进制格式的字符串,不是直接转,因为会出错
|
||||||
|
*
|
||||||
|
* @param res 加密的原文
|
||||||
|
* @param algorithm 加密使用的算法名称
|
||||||
|
* @param key 加密的秘钥
|
||||||
|
* @param keysize
|
||||||
|
* @param isEncode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String keyGeneratorES(String res, String algorithm, String key, int keysize, boolean isEncode) {
|
||||||
|
try {
|
||||||
|
KeyGenerator kg = KeyGenerator.getInstance(algorithm);
|
||||||
|
if (keysize == 0) {
|
||||||
|
byte[] keyBytes = charset == null ? key.getBytes() : key.getBytes(charset);
|
||||||
|
kg.init(new SecureRandom(keyBytes));
|
||||||
|
} else if (key == null) {
|
||||||
|
kg.init(keysize);
|
||||||
|
} else {
|
||||||
|
byte[] keyBytes = charset == null ? key.getBytes() : key.getBytes(charset);
|
||||||
|
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
|
||||||
|
secureRandom.setSeed(keyBytes);
|
||||||
|
kg.init(keysize, secureRandom);
|
||||||
|
}
|
||||||
|
SecretKey sk = kg.generateKey();
|
||||||
|
SecretKeySpec sks = new SecretKeySpec(sk.getEncoded(), algorithm);
|
||||||
|
Cipher cipher = Cipher.getInstance(algorithm);
|
||||||
|
if (isEncode) {
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, sks);
|
||||||
|
byte[] resBytes = charset == null ? res.getBytes() : res.getBytes(charset);
|
||||||
|
return parseByte2HexStr(cipher.doFinal(resBytes));
|
||||||
|
} else {
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, sks);
|
||||||
|
return new String(cipher.doFinal(parseHexStr2Byte(res)));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String base64(byte[] res) {
|
||||||
|
return Base64.encode(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将二进制转换成16进制
|
||||||
|
*/
|
||||||
|
public static String parseByte2HexStr(byte buf[]) {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < buf.length; i++) {
|
||||||
|
String hex = Integer.toHexString(buf[i] & 0xFF);
|
||||||
|
if (hex.length() == 1) {
|
||||||
|
hex = '0' + hex;
|
||||||
|
}
|
||||||
|
sb.append(hex.toUpperCase());
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将16进制转换为二进制
|
||||||
|
*/
|
||||||
|
public static byte[] parseHexStr2Byte(String hexStr) {
|
||||||
|
if (hexStr.length() < 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
byte[] result = new byte[hexStr.length() / 2];
|
||||||
|
for (int i = 0; i < hexStr.length() / 2; i++) {
|
||||||
|
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
|
||||||
|
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
|
||||||
|
result[i] = (byte) (high * 16 + low);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* md5加密算法进行加密(不可逆)
|
||||||
|
*
|
||||||
|
* @param res 需要加密的原文
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String MD5(String res) {
|
||||||
|
return messageDigest(res, MD5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* md5加密算法进行加密(不可逆)
|
||||||
|
*
|
||||||
|
* @param res 需要加密的原文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String MD5(String res, String key) {
|
||||||
|
return keyGeneratorMac(res, HmacMD5, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用SHA1加密算法进行加密(不可逆)
|
||||||
|
*
|
||||||
|
* @param res 需要加密的原文
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String SHA1(String res) {
|
||||||
|
return messageDigest(res, SHA1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用SHA1加密算法进行加密(不可逆)
|
||||||
|
*
|
||||||
|
* @param res 需要加密的原文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String SHA1(String res, String key) {
|
||||||
|
return keyGeneratorMac(res, HmacSHA1, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用DES加密算法进行加密(可逆)
|
||||||
|
*
|
||||||
|
* @param res 需要加密的原文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String DESencode(String res, String key) {
|
||||||
|
return keyGeneratorES(res, DES, key, keysizeDES, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对使用DES加密算法的密文进行解密(可逆)
|
||||||
|
*
|
||||||
|
* @param res 需要解密的密文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String DESdecode(String res, String key) {
|
||||||
|
return keyGeneratorES(res, DES, key, keysizeDES, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用AES加密算法经行加密(可逆)
|
||||||
|
*
|
||||||
|
* @param res 需要加密的密文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String AESencode(String res, String key) {
|
||||||
|
return keyGeneratorES(res, AES, key, keysizeAES, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对使用AES加密算法的密文进行解密
|
||||||
|
*
|
||||||
|
* @param res 需要解密的密文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String AESdecode(String res, String key) {
|
||||||
|
return keyGeneratorES(res, AES, key, keysizeAES, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用异或进行加密
|
||||||
|
*
|
||||||
|
* @param res 需要加密的密文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String XORencode(String res, String key) {
|
||||||
|
byte[] bs = res.getBytes();
|
||||||
|
for (int i = 0; i < bs.length; i++) {
|
||||||
|
bs[i] = (byte) ((bs[i]) ^ key.hashCode());
|
||||||
|
}
|
||||||
|
return parseByte2HexStr(bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用异或进行解密
|
||||||
|
*
|
||||||
|
* @param res 需要解密的密文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String XORdecode(String res, String key) {
|
||||||
|
byte[] bs = parseHexStr2Byte(res);
|
||||||
|
for (int i = 0; i < bs.length; i++) {
|
||||||
|
bs[i] = (byte) ((bs[i]) ^ key.hashCode());
|
||||||
|
}
|
||||||
|
return new String(bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 直接使用异或(第一调用加密,第二次调用解密)
|
||||||
|
*
|
||||||
|
* @param res 密文
|
||||||
|
* @param key 秘钥
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int XOR(int res, String key) {
|
||||||
|
return res ^ key.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用Base64进行加密
|
||||||
|
*
|
||||||
|
* @param res 密文
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String Base64Encode(String res) {
|
||||||
|
return Base64.encode(res.getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用Base64进行解密
|
||||||
|
*
|
||||||
|
* @param res
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String Base64Decode(String res) {
|
||||||
|
return new String(Base64.decode(res));
|
||||||
|
}
|
||||||
|
}
|
||||||
86
src/main/java/com/common/base/utils/HttpClient.java
Normal file
86
src/main/java/com/common/base/utils/HttpClient.java
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.springframework.http.HttpEntity;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class HttpClient {
|
||||||
|
|
||||||
|
|
||||||
|
//连接超时时间
|
||||||
|
private static final int CONNECTION_TIME_OUT = 30000;
|
||||||
|
|
||||||
|
//读取超时时间
|
||||||
|
private static final int READ_TIME_OUT = 30000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* post方法接口
|
||||||
|
* @param targetUrl---访问的接口网址
|
||||||
|
* @param map----携带的参数
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Map<String,Object> postMethod(String targetUrl, Map<String,Object> map){
|
||||||
|
//兑换带ticket的url
|
||||||
|
String urlPath = targetUrl;
|
||||||
|
// 发送请求
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(map));
|
||||||
|
JSONArray jsonArray1 = new JSONArray();
|
||||||
|
Map<String, Object> map2 = HttpClient.getCasUtils(jsonObject, jsonArray1, "");
|
||||||
|
RestTemplate restTemplate = (RestTemplate) map2.get("restTemplate");
|
||||||
|
HttpEntity<String> httprequest = (HttpEntity<String>) map2.get("httprequest");
|
||||||
|
String response = restTemplate.postForObject(urlPath, httprequest, String.class);
|
||||||
|
JSONObject jsonObject1 = JSON.parseObject(response);
|
||||||
|
Map<String, Object> resultMap = JSONObject.toJavaObject(jsonObject1, Map.class);
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get方法
|
||||||
|
* @param targetUrl---目标地址
|
||||||
|
* @param itemMap----传入参数
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Map<String,Object> getMethod(String targetUrl,Map<String,Object> itemMap){
|
||||||
|
String url = targetUrl;
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(itemMap));
|
||||||
|
JSONArray jsonArray = new JSONArray();
|
||||||
|
Map<String, Object> map = HttpClient.getCasUtils(jsonObject,jsonArray,"");
|
||||||
|
RestTemplate restTemplate = (RestTemplate) map.get("restTemplate");
|
||||||
|
String response=restTemplate.getForEntity(url,String.class).getBody();
|
||||||
|
JSONObject result = JSON.parseObject(response);
|
||||||
|
Map<String, Object> resultMap = JSONObject.toJavaObject(result, Map.class);
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String,Object> getCasUtils(JSONObject jsonObject, JSONArray jsonArray, String str){
|
||||||
|
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
|
||||||
|
requestFactory.setConnectTimeout(CONNECTION_TIME_OUT);
|
||||||
|
requestFactory.setReadTimeout(READ_TIME_OUT);
|
||||||
|
RestTemplate restTemplate = new RestTemplate(requestFactory);
|
||||||
|
// 参数
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
|
||||||
|
headers.setContentType(type);
|
||||||
|
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
|
||||||
|
HttpEntity<String> httprequest= null;
|
||||||
|
if (jsonObject.isEmpty()&&!jsonArray.isEmpty()) {
|
||||||
|
httprequest = new HttpEntity<String>(jsonArray.toJSONString(), headers);
|
||||||
|
} else if (jsonArray.isEmpty() && !jsonObject.isEmpty()) {
|
||||||
|
httprequest = new HttpEntity<String>(jsonObject.toJSONString(), headers);
|
||||||
|
} else {
|
||||||
|
httprequest = new HttpEntity<String>(str, headers);
|
||||||
|
}
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("restTemplate", restTemplate);
|
||||||
|
map.put("httprequest", httprequest);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
}
|
||||||
23
src/main/java/com/common/base/utils/ListUtil.java
Normal file
23
src/main/java/com/common/base/utils/ListUtil.java
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
|
||||||
|
import com.common.base.common.ServiceException;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class ListUtil {
|
||||||
|
|
||||||
|
public static Map<String,Object> getValue(String value, List<Map<String,Object>> list,String key) {
|
||||||
|
Optional<Map<String, Object>> objectMap = list
|
||||||
|
.stream()
|
||||||
|
.filter(r -> (Integer) r.get(key) == Integer.parseInt(value))
|
||||||
|
.findFirst();
|
||||||
|
if (objectMap.isPresent()) {
|
||||||
|
return objectMap.get();
|
||||||
|
} else {
|
||||||
|
throw new ServiceException("key值不存在");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/main/java/com/common/base/utils/MD5Util.java
Normal file
19
src/main/java/com/common/base/utils/MD5Util.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import org.springframework.util.DigestUtils;
|
||||||
|
|
||||||
|
public class MD5Util {
|
||||||
|
|
||||||
|
public static String setMd5(String password){
|
||||||
|
return DigestUtils.md5DigestAsHex(password.getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isEqual(String password, String md5) {
|
||||||
|
String str = DigestUtils.md5DigestAsHex(password.getBytes());
|
||||||
|
if (md5.equals(str)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/main/java/com/common/base/utils/MailAuthenticator.java
Normal file
21
src/main/java/com/common/base/utils/MailAuthenticator.java
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import javax.mail.Authenticator;
|
||||||
|
import javax.mail.PasswordAuthentication;
|
||||||
|
|
||||||
|
public class MailAuthenticator extends Authenticator{
|
||||||
|
String userName=null;
|
||||||
|
String password=null;
|
||||||
|
|
||||||
|
public MailAuthenticator(){
|
||||||
|
}
|
||||||
|
public MailAuthenticator(String username, String password) {
|
||||||
|
this.userName = username;
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected PasswordAuthentication getPasswordAuthentication(){
|
||||||
|
return new PasswordAuthentication(userName, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
98
src/main/java/com/common/base/utils/MailBean.java
Normal file
98
src/main/java/com/common/base/utils/MailBean.java
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public class MailBean {
|
||||||
|
// 发送邮件的服务器的IP和端口
|
||||||
|
private String mailServerHost;
|
||||||
|
private String mailServerPort = "25";
|
||||||
|
// 邮件发送者的地址
|
||||||
|
private String fromAddress;
|
||||||
|
// 邮件接收者的地址
|
||||||
|
private List<String> toAddress;
|
||||||
|
// 登陆邮件发送服务器的用户名和密码
|
||||||
|
private String userName;
|
||||||
|
private String password;
|
||||||
|
// 是否需要身份验证
|
||||||
|
private boolean validate = false;
|
||||||
|
// 邮件主题
|
||||||
|
private String subject;
|
||||||
|
// 邮件的文本内容
|
||||||
|
private String content;
|
||||||
|
// 邮件附件的文件名
|
||||||
|
private List<String> attachFileNames;
|
||||||
|
/**
|
||||||
|
* 获得邮件会话属性
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Properties getProperties(){
|
||||||
|
Properties p = new Properties();
|
||||||
|
p.put("mail.smtp.host", this.mailServerHost);
|
||||||
|
p.put("mail.smtp.port", this.mailServerPort);
|
||||||
|
p.put("mail.smtp.auth", validate ? "true" : "false");
|
||||||
|
p.put("mail.mime.address.strict", "false");
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
public String getMailServerHost() {
|
||||||
|
return mailServerHost;
|
||||||
|
}
|
||||||
|
public void setMailServerHost(String mailServerHost) {
|
||||||
|
this.mailServerHost = mailServerHost;
|
||||||
|
}
|
||||||
|
public String getMailServerPort() {
|
||||||
|
return mailServerPort;
|
||||||
|
}
|
||||||
|
public void setMailServerPort(String mailServerPort) {
|
||||||
|
this.mailServerPort = mailServerPort;
|
||||||
|
}
|
||||||
|
public String getFromAddress() {
|
||||||
|
return fromAddress;
|
||||||
|
}
|
||||||
|
public void setFromAddress(String fromAddress) {
|
||||||
|
this.fromAddress = fromAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getToAddress() {
|
||||||
|
return toAddress;
|
||||||
|
}
|
||||||
|
public void setToAddress(List<String> toAddress) {
|
||||||
|
this.toAddress = toAddress;
|
||||||
|
}
|
||||||
|
public String getUserName() {
|
||||||
|
return userName;
|
||||||
|
}
|
||||||
|
public void setUserName(String userName) {
|
||||||
|
this.userName = userName;
|
||||||
|
}
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
public boolean isValidate() {
|
||||||
|
return validate;
|
||||||
|
}
|
||||||
|
public void setValidate(boolean validate) {
|
||||||
|
this.validate = validate;
|
||||||
|
}
|
||||||
|
public String getSubject() {
|
||||||
|
return subject;
|
||||||
|
}
|
||||||
|
public void setSubject(String subject) {
|
||||||
|
this.subject = subject;
|
||||||
|
}
|
||||||
|
public String getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
public void setContent(String content) {
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
public List<String> getAttachFileNames() {
|
||||||
|
return attachFileNames;
|
||||||
|
}
|
||||||
|
public void setAttachFileNames(List<String> attachFileNames) {
|
||||||
|
this.attachFileNames = attachFileNames;
|
||||||
|
}
|
||||||
|
}
|
||||||
142
src/main/java/com/common/base/utils/MailOperate.java
Normal file
142
src/main/java/com/common/base/utils/MailOperate.java
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
|
||||||
|
import javax.activation.DataHandler;
|
||||||
|
import javax.activation.FileDataSource;
|
||||||
|
import javax.mail.*;
|
||||||
|
import javax.mail.internet.*;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public class MailOperate {
|
||||||
|
/**
|
||||||
|
* 以文本格式发送邮件
|
||||||
|
* @param mailInfo 待发送的邮件的信息
|
||||||
|
*/
|
||||||
|
public boolean sendTextMail(MailBean mailInfo) {
|
||||||
|
// 判断是否需要身份认证
|
||||||
|
MailAuthenticator authenticator = null;
|
||||||
|
Properties pro = mailInfo.getProperties();
|
||||||
|
if (mailInfo.isValidate()) {
|
||||||
|
// 如果需要身份认证,则创建一个密码验证器
|
||||||
|
authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
|
||||||
|
}
|
||||||
|
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
|
||||||
|
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
|
||||||
|
try {
|
||||||
|
// 根据session创建一个邮件消息
|
||||||
|
Message mailMessage = new MimeMessage(sendMailSession);
|
||||||
|
// 创建邮件发送者地址
|
||||||
|
Address from = new InternetAddress(mailInfo.getFromAddress());
|
||||||
|
// 设置邮件消息的发送者
|
||||||
|
mailMessage.setFrom(from);
|
||||||
|
// 创建邮件的接收者地址,并设置到邮件消息中
|
||||||
|
List<String> toAddress=null;
|
||||||
|
if(mailInfo.getToAddress().size()>1){
|
||||||
|
toAddress=mailInfo.getToAddress();
|
||||||
|
Address[] address =new InternetAddress[toAddress.size()];
|
||||||
|
for (int i = 0; i < toAddress.size(); i++) {
|
||||||
|
address[i]=new InternetAddress(toAddress.get(i));
|
||||||
|
}
|
||||||
|
mailMessage.setRecipients(Message.RecipientType.TO,address);
|
||||||
|
}else{
|
||||||
|
toAddress=mailInfo.getToAddress();
|
||||||
|
Address to = new InternetAddress(toAddress.get(0));
|
||||||
|
// Message.RecipientType.TO属性表示接收者的类型为TO
|
||||||
|
mailMessage.setRecipient(Message.RecipientType.TO,to);
|
||||||
|
}
|
||||||
|
// 设置邮件消息的主题
|
||||||
|
mailMessage.setSubject(mailInfo.getSubject());
|
||||||
|
// 设置邮件消息发送的时间
|
||||||
|
mailMessage.setSentDate(new Date());
|
||||||
|
// 设置邮件消息的主要内容
|
||||||
|
String mailContent = mailInfo.getContent();
|
||||||
|
mailMessage.setText(mailContent);
|
||||||
|
// 发送邮件
|
||||||
|
Transport.send(mailMessage);
|
||||||
|
return true;
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
// ex.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 以HTML格式发送邮件
|
||||||
|
* @param mailInfo 待发送的邮件信息
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public static boolean sendHtmlMail(MailBean mailInfo) throws UnsupportedEncodingException{
|
||||||
|
// 判断是否需要身份认证
|
||||||
|
MailAuthenticator authenticator = null;
|
||||||
|
Properties pro = mailInfo.getProperties();
|
||||||
|
//如果需要身份认证,则创建一个密码验证器
|
||||||
|
if (mailInfo.isValidate()) {
|
||||||
|
authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
|
||||||
|
}
|
||||||
|
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
|
||||||
|
Session sendMailSession = Session.getInstance(pro,authenticator);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 根据session创建一个邮件消息
|
||||||
|
Message mailMessage = new MimeMessage(sendMailSession);
|
||||||
|
// 创建邮件发送者地址
|
||||||
|
Address from = new InternetAddress(mailInfo.getFromAddress());
|
||||||
|
// 设置邮件消息的发送者
|
||||||
|
mailMessage.setFrom(from);
|
||||||
|
// 创建邮件的接收者地址,并设置到邮件消息中
|
||||||
|
List<String> toAddress=null;
|
||||||
|
if(mailInfo.getToAddress().size()>1){
|
||||||
|
toAddress=mailInfo.getToAddress();
|
||||||
|
Address[] address =new InternetAddress[toAddress.size()];
|
||||||
|
for (int i = 0; i < toAddress.size(); i++) {
|
||||||
|
address[i]=new InternetAddress(toAddress.get(i));
|
||||||
|
}
|
||||||
|
mailMessage.setRecipients(Message.RecipientType.TO,address);
|
||||||
|
}else{
|
||||||
|
toAddress=mailInfo.getToAddress();
|
||||||
|
Address to = new InternetAddress(toAddress.get(0));
|
||||||
|
// Message.RecipientType.TO属性表示接收者的类型为TO
|
||||||
|
mailMessage.setRecipient(Message.RecipientType.TO,to);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置邮件消息的主题
|
||||||
|
mailMessage.setSubject(mailInfo.getSubject());
|
||||||
|
// 设置邮件消息发送的时间
|
||||||
|
mailMessage.setSentDate(new Date());
|
||||||
|
// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
|
||||||
|
Multipart mainPart = new MimeMultipart();
|
||||||
|
// 创建一个包含HTML内容的MimeBodyPart
|
||||||
|
BodyPart html = new MimeBodyPart();
|
||||||
|
// 设置HTML内容
|
||||||
|
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
|
||||||
|
mainPart.addBodyPart(html);
|
||||||
|
if(mailInfo.getAttachFileNames()!=null){
|
||||||
|
List<String> attachFileNames = mailInfo.getAttachFileNames();
|
||||||
|
for (String path : attachFileNames) {
|
||||||
|
html=new MimeBodyPart();
|
||||||
|
FileDataSource fds=new FileDataSource(path); //得到数据源
|
||||||
|
html.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPart
|
||||||
|
//此处是为了解决附件中文名乱码的问题
|
||||||
|
String fileName= MimeUtility.encodeText(fds.getName());
|
||||||
|
html.setFileName(fileName); //得到文件名同样至入BodyPart
|
||||||
|
mainPart.addBodyPart(html);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将MiniMultipart对象设置为邮件内容
|
||||||
|
mailMessage.setContent(mainPart);
|
||||||
|
// 发送邮件
|
||||||
|
Transport.send(mailMessage);
|
||||||
|
return true;
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
18
src/main/java/com/common/base/utils/RandomUtil.java
Normal file
18
src/main/java/com/common/base/utils/RandomUtil.java
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class RandomUtil {
|
||||||
|
|
||||||
|
|
||||||
|
public static String getrandom() {
|
||||||
|
StringBuilder code = new StringBuilder();
|
||||||
|
Random random = new Random();
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
int r = random.nextInt(10);
|
||||||
|
code.append(r);
|
||||||
|
}
|
||||||
|
return code.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
584
src/main/java/com/common/base/utils/RedisUtil.java
Normal file
584
src/main/java/com/common/base/utils/RedisUtil.java
Normal file
@@ -0,0 +1,584 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
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.data.redis.core.RedisTemplate;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Redis工具类
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public final class RedisUtil {
|
||||||
|
|
||||||
|
// url
|
||||||
|
public static boolean isUseful;
|
||||||
|
|
||||||
|
// 通过yml文件获取host
|
||||||
|
@Value("${isRedisLogin}")
|
||||||
|
public void setHost(boolean isUseful) {
|
||||||
|
RedisUtil.isUseful = isUseful;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RedisUtil.class);
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 指定缓存失效时间
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param time 时间(秒)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean expire(String key, long time) {
|
||||||
|
try {
|
||||||
|
if (time > 0) {
|
||||||
|
redisTemplate.expire(key, time, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据key 获取过期时间
|
||||||
|
*
|
||||||
|
* @param key 键 不能为null
|
||||||
|
* @return 时间(秒) 返回0代表为永久有效
|
||||||
|
*/
|
||||||
|
public long getExpire(String key) {
|
||||||
|
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断key是否存在
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @return true 存在 false不存在
|
||||||
|
*/
|
||||||
|
public boolean hasKey(String key) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.hasKey(key);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除缓存
|
||||||
|
*
|
||||||
|
* @param key 可以传一个值 或多个
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void del(String... key) {
|
||||||
|
if (key != null && key.length > 0) {
|
||||||
|
if (key.length == 1) {
|
||||||
|
redisTemplate.delete(key[0]);
|
||||||
|
} else {
|
||||||
|
redisTemplate.delete(CollectionUtils.arrayToList(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ============================String=============================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 普通缓存获取
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @return 值
|
||||||
|
*/
|
||||||
|
public Object get(String key) {
|
||||||
|
return key == null ? null : redisTemplate.opsForValue().get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 普通缓存放入
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param value 值
|
||||||
|
* @return true成功 false失败
|
||||||
|
*/
|
||||||
|
public boolean set(String key, Object value) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForValue().set(key, value);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 普通缓存放入并设置时间
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param value 值
|
||||||
|
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
|
||||||
|
* @return true成功 false 失败
|
||||||
|
*/
|
||||||
|
public boolean set(String key, Object value, long time) {
|
||||||
|
try {
|
||||||
|
if (time > 0) {
|
||||||
|
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
|
||||||
|
} else {
|
||||||
|
set(key, value);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 递增
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param delta 要增加几(大于0)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public long incr(String key, long delta) {
|
||||||
|
if (delta < 0) {
|
||||||
|
throw new RuntimeException("递增因子必须大于0");
|
||||||
|
}
|
||||||
|
return redisTemplate.opsForValue().increment(key, delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 递减
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param delta 要减少几(小于0)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public long decr(String key, long delta) {
|
||||||
|
if (delta < 0) {
|
||||||
|
throw new RuntimeException("递减因子必须大于0");
|
||||||
|
}
|
||||||
|
return redisTemplate.opsForValue().increment(key, -delta);
|
||||||
|
}
|
||||||
|
// ================================Map=================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HashGet
|
||||||
|
*
|
||||||
|
* @param key 键 不能为null
|
||||||
|
* @param item 项 不能为null
|
||||||
|
* @return 值
|
||||||
|
*/
|
||||||
|
public Object hget(String key, String item) {
|
||||||
|
return redisTemplate.opsForHash().get(key, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取hashKey对应的所有键值
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @return 对应的多个键值
|
||||||
|
*/
|
||||||
|
public Map<Object, Object> hmget(String key) {
|
||||||
|
return redisTemplate.opsForHash().entries(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HashSet
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param map 对应多个键值
|
||||||
|
* @return true 成功 false 失败
|
||||||
|
*/
|
||||||
|
public boolean hmset(String key, Map<String, Object> map) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForHash().putAll(key, map);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HashSet 并设置时间
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param map 对应多个键值
|
||||||
|
* @param time 时间(秒)
|
||||||
|
* @return true成功 false失败
|
||||||
|
*/
|
||||||
|
public boolean hmset(String key, Map<String, Object> map, long time) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForHash().putAll(key, map);
|
||||||
|
if (time > 0) {
|
||||||
|
expire(key, time);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向一张hash表中放入数据,如果不存在将创建
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param item 项
|
||||||
|
* @param value 值
|
||||||
|
* @return true 成功 false失败
|
||||||
|
*/
|
||||||
|
public boolean hset(String key, String item, Object value) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForHash().put(key, item, value);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向一张hash表中放入数据,如果不存在将创建
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param item 项
|
||||||
|
* @param value 值
|
||||||
|
* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
|
||||||
|
* @return true 成功 false失败
|
||||||
|
*/
|
||||||
|
public boolean hset(String key, String item, Object value, long time) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForHash().put(key, item, value);
|
||||||
|
if (time > 0) {
|
||||||
|
expire(key, time);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除hash表中的值
|
||||||
|
*
|
||||||
|
* @param key 键 不能为null
|
||||||
|
* @param item 项 可以使多个 不能为null
|
||||||
|
*/
|
||||||
|
public void hdel(String key, Object... item) {
|
||||||
|
redisTemplate.opsForHash().delete(key, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断hash表中是否有该项的值
|
||||||
|
*
|
||||||
|
* @param key 键 不能为null
|
||||||
|
* @param item 项 不能为null
|
||||||
|
* @return true 存在 false不存在
|
||||||
|
*/
|
||||||
|
public boolean hHasKey(String key, String item) {
|
||||||
|
return redisTemplate.opsForHash().hasKey(key, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hash递增 如果不存在,就会创建一个 并把新增后的值返回
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param item 项
|
||||||
|
* @param by 要增加几(大于0)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public double hincr(String key, String item, double by) {
|
||||||
|
return redisTemplate.opsForHash().increment(key, item, by);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hash递减
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param item 项
|
||||||
|
* @param by 要减少记(小于0)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public double hdecr(String key, String item, double by) {
|
||||||
|
return redisTemplate.opsForHash().increment(key, item, -by);
|
||||||
|
}
|
||||||
|
// ============================set=============================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据key获取Set中的所有值
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Set<Object> sGet(String key) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.opsForSet().members(key);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据value从一个set中查询,是否存在
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param value 值
|
||||||
|
* @return true 存在 false不存在
|
||||||
|
*/
|
||||||
|
public boolean sHasKey(String key, Object value) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.opsForSet().isMember(key, value);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将数据放入set缓存
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param values 值 可以是多个
|
||||||
|
* @return 成功个数
|
||||||
|
*/
|
||||||
|
public long sSet(String key, Object... values) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.opsForSet().add(key, values);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将set数据放入缓存
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param time 时间(秒)
|
||||||
|
* @param values 值 可以是多个
|
||||||
|
* @return 成功个数
|
||||||
|
*/
|
||||||
|
public long sSetAndTime(String key, long time, Object... values) {
|
||||||
|
try {
|
||||||
|
Long count = redisTemplate.opsForSet().add(key, values);
|
||||||
|
if (time > 0) {
|
||||||
|
expire(key, time);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取set缓存的长度
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public long sGetSetSize(String key) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.opsForSet().size(key);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除值为value的
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param values 值 可以是多个
|
||||||
|
* @return 移除的个数
|
||||||
|
*/
|
||||||
|
public long setRemove(String key, Object... values) {
|
||||||
|
try {
|
||||||
|
Long count = redisTemplate.opsForSet().remove(key, values);
|
||||||
|
return count;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ===============================list=================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取list缓存的内容
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param start 开始
|
||||||
|
* @param end 结束 0 到 -1代表所有值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<Object> lGet(String key, long start, long end) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.opsForList().range(key, start, end);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取list缓存的长度
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public long lGetListSize(String key) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.opsForList().size(key);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过索引 获取list中的值
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Object lGetIndex(String key, long index) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.opsForList().index(key, index);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将list放入缓存
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param value 值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean lSet(String key, Object value) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForList().rightPush(key, value);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将list放入缓存
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param value 值
|
||||||
|
* @param time 时间(秒)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean lSet(String key, Object value, long time) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForList().rightPush(key, value);
|
||||||
|
if (time > 0) {
|
||||||
|
expire(key, time);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将list放入缓存
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param value 值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean lSet(String key, List<Object> value) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForList().rightPushAll(key, value);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将list放入缓存
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param value 值
|
||||||
|
* @param time 时间(秒)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean lSet(String key, List<Object> value, long time) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForList().rightPushAll(key, value);
|
||||||
|
if (time > 0) {
|
||||||
|
expire(key, time);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据索引修改list中的某条数据
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param index 索引
|
||||||
|
* @param value 值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean lUpdateIndex(String key, long index, Object value) {
|
||||||
|
try {
|
||||||
|
redisTemplate.opsForList().set(key, index, value);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除N个值为value
|
||||||
|
*
|
||||||
|
* @param key 键
|
||||||
|
* @param count 移除多少个
|
||||||
|
* @param value 值
|
||||||
|
* @return 移除的个数
|
||||||
|
*/
|
||||||
|
public long lRemove(String key, long count, Object value) {
|
||||||
|
try {
|
||||||
|
return redisTemplate.opsForList().remove(key, count, value);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
11
src/main/java/com/common/base/utils/RegexUtil.java
Normal file
11
src/main/java/com/common/base/utils/RegexUtil.java
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class RegexUtil {
|
||||||
|
|
||||||
|
public static boolean isChinese(String str) {
|
||||||
|
String pattern = "^([\\u4E00-\\u9FA5])*$";
|
||||||
|
return Pattern.matches(pattern, str);
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/main/java/com/common/base/utils/SpringContextUtil.java
Normal file
26
src/main/java/com/common/base/utils/SpringContextUtil.java
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
public class SpringContextUtil {
|
||||||
|
private static ApplicationContext applicationContext;
|
||||||
|
//获取上下文
|
||||||
|
public static ApplicationContext getApplicationContext() {
|
||||||
|
return applicationContext;
|
||||||
|
}
|
||||||
|
//设置上下文
|
||||||
|
public static void setApplicationContext(ApplicationContext applicationContext) {
|
||||||
|
SpringContextUtil.applicationContext = applicationContext;
|
||||||
|
}
|
||||||
|
//通过名字获取上下文中的bean
|
||||||
|
public static Object getBean(String name){
|
||||||
|
return applicationContext.getBean(name);
|
||||||
|
}
|
||||||
|
//通过类型获取上下文中的bean
|
||||||
|
public static Object getBean(Class<?> requiredType){
|
||||||
|
return applicationContext.getBean(requiredType);
|
||||||
|
}
|
||||||
|
}
|
||||||
33
src/main/java/com/common/base/utils/TokenProccessor.java
Normal file
33
src/main/java/com/common/base/utils/TokenProccessor.java
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成Token的工具类
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TokenProccessor {
|
||||||
|
|
||||||
|
private TokenProccessor(){}
|
||||||
|
|
||||||
|
private static final TokenProccessor instance = new TokenProccessor();
|
||||||
|
|
||||||
|
public static TokenProccessor getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成Token
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String makeToken() {
|
||||||
|
String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + "";
|
||||||
|
EncryptUtil encryptUtil = EncryptUtil.getInstance();
|
||||||
|
String str = encryptUtil.MD5(token);
|
||||||
|
str = str.replaceAll("/", "");
|
||||||
|
str = str.replaceAll("\\+", "");
|
||||||
|
str = str.replaceAll("=", "");
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
46
src/main/java/com/common/base/utils/UserInfoUtil.java
Normal file
46
src/main/java/com/common/base/utils/UserInfoUtil.java
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import com.common.base.entity.FtToken;
|
||||||
|
import com.common.base.shiro.service.ShiroService;
|
||||||
|
import org.apache.shiro.SecurityUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class UserInfoUtil<T> {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
ShiroService shiroService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过request返回用户信息
|
||||||
|
* @param request request
|
||||||
|
* @return 用户类型
|
||||||
|
*/
|
||||||
|
public T getUserInfoByRequest(HttpServletRequest request) {
|
||||||
|
String token = request.getHeader("X-Access-Token");
|
||||||
|
if (StringUtils.isEmpty(token)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
FtToken ftToken = shiroService.findByToken(token);
|
||||||
|
Date expireData= ftToken.getExpireTime();
|
||||||
|
Date date = new Date();
|
||||||
|
if (date.getTime() > expireData.getTime()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (T) shiroService.findByUserId(ftToken.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前用户信息
|
||||||
|
* @param <T> 用户实体类泛型
|
||||||
|
* @return 返回结果
|
||||||
|
*/
|
||||||
|
public static <T> T getUserInfo(){
|
||||||
|
return (T)SecurityUtils.getSubject().getPrincipal();
|
||||||
|
}
|
||||||
|
}
|
||||||
18
src/main/java/com/common/base/utils/XssClass.java
Normal file
18
src/main/java/com/common/base/utils/XssClass.java
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package com.common.base.utils;
|
||||||
|
|
||||||
|
import static org.thymeleaf.util.StringUtils.split;
|
||||||
|
|
||||||
|
public class XssClass {
|
||||||
|
|
||||||
|
public static boolean sqlInj(String str){
|
||||||
|
String injStr = "'|and|exec|insert|select|delete|update|"+
|
||||||
|
"count|*|%|chr|mid|master|truncate|char|declare|;|or|+|,|<script>";
|
||||||
|
String[] injStra = split(injStr,"|");
|
||||||
|
for (String s : injStra) {
|
||||||
|
if (str.contains(s)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
11
src/main/resources/mapping/FtTokenDao.xml
Normal file
11
src/main/resources/mapping/FtTokenDao.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.common.base.dao.FtTokenDao">
|
||||||
|
<resultMap type="com.common.base.entity.FtToken" id="FtTokenMap">
|
||||||
|
<result property="tokenId" column="TOKEN_ID" jdbcType="INTEGER"/>
|
||||||
|
<result property="token" column="TOKEN" jdbcType="VARCHAR"/>
|
||||||
|
<result property="userId" column="USER_ID" jdbcType="INTEGER"/>
|
||||||
|
<result property="updateTime" column="UPDATE_TIME" jdbcType="TIMESTAMP"/>
|
||||||
|
<result property="expireTime" column="EXPIRE_TIME" jdbcType="TIMESTAMP"/>
|
||||||
|
</resultMap>
|
||||||
|
</mapper>
|
||||||
Reference in New Issue
Block a user