commit
9b77b796cf
39 changed files with 3801 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||||||
|
/.classpath |
||||||
|
/.project |
||||||
|
/.settings |
||||||
|
/bin/ |
||||||
|
/logs |
||||||
|
/target/ |
@ -0,0 +1,87 @@ |
|||||||
|
<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 http://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.0.2.RELEASE</version> |
||||||
|
</parent> |
||||||
|
<groupId>com.mengyxu.core</groupId> |
||||||
|
<artifactId>mengyxu_core</artifactId> |
||||||
|
<version>0.0.1</version> |
||||||
|
<name>mengyxu_core</name> |
||||||
|
<description>mengyxu-core</description> |
||||||
|
<packaging>jar</packaging> |
||||||
|
|
||||||
|
<properties> |
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
||||||
|
<mybatis-spring-boot.version>1.3.2</mybatis-spring-boot.version> |
||||||
|
<log4j.version>1.2.17</log4j.version> |
||||||
|
<fastjson.version>1.2.46</fastjson.version> |
||||||
|
<apache.poi.version>4.0.1</apache.poi.version> |
||||||
|
<dom4j.version>2.0.0</dom4j.version> |
||||||
|
</properties> |
||||||
|
|
||||||
|
<dependencies> |
||||||
|
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-web</artifactId> |
||||||
|
<exclusions> |
||||||
|
<exclusion> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-logging</artifactId> |
||||||
|
</exclusion> |
||||||
|
</exclusions> |
||||||
|
</dependency> |
||||||
|
<!-- log4j2 --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-log4j2</artifactId> |
||||||
|
</dependency> |
||||||
|
<!-- SpringBoot 的测试依赖 --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-test</artifactId> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<!-- spring-boot整合mybatis --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.mybatis.spring.boot</groupId> |
||||||
|
<artifactId>mybatis-spring-boot-starter</artifactId> |
||||||
|
<version>${mybatis-spring-boot.version}</version> |
||||||
|
</dependency> |
||||||
|
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.projectlombok</groupId> |
||||||
|
<artifactId>lombok</artifactId> |
||||||
|
</dependency> |
||||||
|
<!-- fastjson --> |
||||||
|
<dependency> |
||||||
|
<groupId>com.alibaba</groupId> |
||||||
|
<artifactId>fastjson</artifactId> |
||||||
|
<version>${fastjson.version}</version> |
||||||
|
</dependency> |
||||||
|
<!-- httpclient --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.httpcomponents</groupId> |
||||||
|
<artifactId>httpclient</artifactId> |
||||||
|
</dependency> |
||||||
|
<!-- poi-ooxml --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.poi</groupId> |
||||||
|
<artifactId>poi-ooxml</artifactId> |
||||||
|
<version>${apache.poi.version}</version> |
||||||
|
</dependency> |
||||||
|
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.dom4j</groupId> |
||||||
|
<artifactId>dom4j</artifactId> |
||||||
|
<version>${dom4j.version}</version> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
</dependencies> |
||||||
|
|
||||||
|
</project> |
@ -0,0 +1,63 @@ |
|||||||
|
package com.mengyxu.core.exception; |
||||||
|
|
||||||
|
import java.sql.SQLException; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.dao.DuplicateKeyException; |
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice; |
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler; |
||||||
|
import org.springframework.web.bind.annotation.ResponseBody; |
||||||
|
|
||||||
|
import com.mengyxu.core.pojo.com.AjaxResponse; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月4日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
@ControllerAdvice |
||||||
|
public class ControllerExceptionHandler { |
||||||
|
|
||||||
|
@ResponseBody |
||||||
|
@ExceptionHandler(CoreException.class) |
||||||
|
public AjaxResponse handlerSprtException(CoreException e) { |
||||||
|
log.warn(e.getMessage()); |
||||||
|
return new AjaxResponse(false, e.getMessage()); |
||||||
|
} |
||||||
|
|
||||||
|
@ResponseBody |
||||||
|
@ExceptionHandler(DuplicateKeyException.class) |
||||||
|
public AjaxResponse handlerDuplicateKeyException(DuplicateKeyException e) { |
||||||
|
return new AjaxResponse(false, "数据已存在,请勿重复添加"); |
||||||
|
} |
||||||
|
|
||||||
|
@ResponseBody |
||||||
|
@ExceptionHandler(SQLException.class) |
||||||
|
public AjaxResponse handlerSqlException(SQLException e) { |
||||||
|
log.warn(e.getMessage()); |
||||||
|
return new AjaxResponse(false, "数据库访问出错!"); |
||||||
|
} |
||||||
|
|
||||||
|
@ResponseBody |
||||||
|
@ExceptionHandler(NullPointerException.class) |
||||||
|
public AjaxResponse handlerNullPointerException(NullPointerException e) { |
||||||
|
log.warn(e.getMessage()); |
||||||
|
return new AjaxResponse(false, "操作失败,缺少必要参数!"); |
||||||
|
} |
||||||
|
|
||||||
|
@ResponseBody |
||||||
|
@ExceptionHandler(Exception.class) |
||||||
|
public Map<String, Object> handlerException(Exception e) { |
||||||
|
log.error("请求失败!",e); |
||||||
|
Map<String, Object> map = new HashMap<>(); |
||||||
|
map.put("success", false); |
||||||
|
map.put("message", "操作失败,参数错误!"); |
||||||
|
map.put("error", e.getMessage()); |
||||||
|
return map; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package com.mengyxu.core.exception; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
@Getter |
||||||
|
public class CoreException extends Exception{ |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
private String errCode; |
||||||
|
private String errDesc; |
||||||
|
|
||||||
|
|
||||||
|
public CoreException(Throwable e){ |
||||||
|
super(e); |
||||||
|
} |
||||||
|
|
||||||
|
public CoreException(String msg){ |
||||||
|
super(msg); |
||||||
|
} |
||||||
|
|
||||||
|
public CoreException(String msg, Throwable e){ |
||||||
|
super(msg, e); |
||||||
|
} |
||||||
|
|
||||||
|
public CoreException(String code, String msg){ |
||||||
|
this(msg); |
||||||
|
this.errCode = code; |
||||||
|
} |
||||||
|
|
||||||
|
public CoreException(String code, String msg, Throwable e){ |
||||||
|
this(msg, e); |
||||||
|
this.errCode = code; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,78 @@ |
|||||||
|
package com.mengyxu.core.golbal; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Map.Entry; |
||||||
|
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling; |
||||||
|
import org.springframework.scheduling.annotation.Scheduled; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.com.Cache; |
||||||
|
import com.mengyxu.core.utils.DateUtil; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年9月19日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
@EnableScheduling |
||||||
|
@Component |
||||||
|
public class GlobalBuffer { |
||||||
|
private static final Map<String, Cache> CACHES_MAP = new HashMap<>(); |
||||||
|
private static int KEY_PREFIX_SEQ = 0; |
||||||
|
|
||||||
|
@Scheduled(cron = "${quartz.cron.clean.global:0 */10 * * * ?}") |
||||||
|
public void job() { |
||||||
|
log.info("清理已过期失效的缓存"); |
||||||
|
GlobalBuffer.cleanCache(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static Map<String, Cache> getBuffer(){ |
||||||
|
return CACHES_MAP; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized String getSeq() { |
||||||
|
return StringUtil.lpad(KEY_PREFIX_SEQ++ + "", "0", 10); |
||||||
|
} |
||||||
|
|
||||||
|
public static void addCache(String key,Cache cache) { |
||||||
|
CACHES_MAP.put(key, cache); |
||||||
|
} |
||||||
|
|
||||||
|
public static Cache getCache(String key) { |
||||||
|
Cache cache = CACHES_MAP.get(key); |
||||||
|
if(Cache.isEmpty(cache)) { |
||||||
|
CACHES_MAP.remove(key); |
||||||
|
return null; |
||||||
|
} |
||||||
|
return cache; |
||||||
|
} |
||||||
|
|
||||||
|
public static void removeCache(String key) { |
||||||
|
CACHES_MAP.remove(key); |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized void cleanCache() { |
||||||
|
Iterator<Entry<String, Cache>> iter = CACHES_MAP.entrySet().iterator(); |
||||||
|
while (iter.hasNext()){ |
||||||
|
Cache cache = iter.next().getValue(); |
||||||
|
if(cache == null || cache.getValue() == null) { |
||||||
|
iter.remove(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void setLoseTime(String key, String loseTime) throws CoreException { |
||||||
|
Long time = DateUtil.parse(loseTime, DateUtil.FORMAT19_LINE_YYYYMMDDHHMMSS).getTime(); |
||||||
|
Cache.setLoseTime(getCache(key), time); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package com.mengyxu.core.golbal; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.boot.system.ApplicationHome; |
||||||
|
import org.springframework.util.DigestUtils; |
||||||
|
|
||||||
|
public class GlobalConstant { |
||||||
|
|
||||||
|
public static final String RESOURCES_ROOT_PATH; |
||||||
|
public static final String JAR_RESOURCES_PATH; |
||||||
|
public static final String JAR_DOWNLOAD_PATH; |
||||||
|
public static final String FILE_DOWNLOAD_PATH; |
||||||
|
|
||||||
|
public static final String DEFAULT_PASSWORD = DigestUtils.md5DigestAsHex("888888".getBytes()); |
||||||
|
public static final String CODE_KEY_PREFIX = "login-code-"; |
||||||
|
public static final String TIKEN_KEY_PREFIX = "login-token-"; |
||||||
|
public static final String LOGIN_COOKIE_NAME = "UMLoginToken"; |
||||||
|
|
||||||
|
|
||||||
|
public static final String ENCODING_UTF8 = "UTF-8"; |
||||||
|
|
||||||
|
public static final Map<Integer, String> YYS_TYPES = new HashMap<>(); |
||||||
|
static{ |
||||||
|
RESOURCES_ROOT_PATH = GlobalConstant.class.getClassLoader().getResource("").getPath(); |
||||||
|
FILE_DOWNLOAD_PATH = RESOURCES_ROOT_PATH + "/file/"; |
||||||
|
|
||||||
|
ApplicationHome h = new ApplicationHome(GlobalConstant.class); |
||||||
|
File jarF = h.getSource(); |
||||||
|
JAR_RESOURCES_PATH = jarF.getParentFile().toString(); |
||||||
|
JAR_DOWNLOAD_PATH = JAR_RESOURCES_PATH + "/file/"; |
||||||
|
|
||||||
|
YYS_TYPES.put(0, "移动"); |
||||||
|
YYS_TYPES.put(1, "联通"); |
||||||
|
YYS_TYPES.put(2, "电信"); |
||||||
|
} |
||||||
|
|
||||||
|
private GlobalConstant(){ |
||||||
|
//Add a private constructor to hide the implicit public one.
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package com.mengyxu.core.http; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月25日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class HttpResult { |
||||||
|
|
||||||
|
// 响应的状态码
|
||||||
|
private int code; |
||||||
|
|
||||||
|
// 响应的响应体
|
||||||
|
private String body; |
||||||
|
|
||||||
|
public HttpResult(int code, String body) { |
||||||
|
super(); |
||||||
|
this.code = code; |
||||||
|
this.body = body; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,235 @@ |
|||||||
|
package com.mengyxu.core.http; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.apache.http.NameValuePair; |
||||||
|
import org.apache.http.client.CookieStore; |
||||||
|
import org.apache.http.client.config.RequestConfig; |
||||||
|
import org.apache.http.client.entity.UrlEncodedFormEntity; |
||||||
|
import org.apache.http.client.methods.CloseableHttpResponse; |
||||||
|
import org.apache.http.client.methods.HttpGet; |
||||||
|
import org.apache.http.client.methods.HttpPost; |
||||||
|
import org.apache.http.client.utils.URIBuilder; |
||||||
|
import org.apache.http.entity.StringEntity; |
||||||
|
import org.apache.http.impl.client.BasicCookieStore; |
||||||
|
import org.apache.http.impl.client.CloseableHttpClient; |
||||||
|
import org.apache.http.impl.client.HttpClientBuilder; |
||||||
|
import org.apache.http.impl.client.HttpClients; |
||||||
|
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; |
||||||
|
import org.apache.http.impl.cookie.BasicClientCookie; |
||||||
|
import org.apache.http.message.BasicNameValuePair; |
||||||
|
import org.apache.http.util.EntityUtils; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月25日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
@SuppressWarnings("all") |
||||||
|
public class HttpService { |
||||||
|
private static final String ENCODING_UTF8 = "UTF-8"; |
||||||
|
|
||||||
|
private static final PoolingHttpClientConnectionManager cm; |
||||||
|
|
||||||
|
private static final RequestConfig config; |
||||||
|
|
||||||
|
private static CookieStore cookieStore = new BasicCookieStore(); |
||||||
|
|
||||||
|
static{ |
||||||
|
cm = new PoolingHttpClientConnectionManager(); |
||||||
|
cm.setMaxTotal(200); |
||||||
|
cm.setDefaultMaxPerRoute(20); |
||||||
|
|
||||||
|
config = RequestConfig.custom().setConnectTimeout(100000) |
||||||
|
.setConnectionRequestTimeout(50000).setSocketTimeout(100000) |
||||||
|
.setStaleConnectionCheckEnabled(true).build(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 设置请求所携带cookie |
||||||
|
* @param cookies |
||||||
|
*/ |
||||||
|
public static void setCookies(Map<String, String> cookies) { |
||||||
|
cookieStore = new BasicCookieStore(); |
||||||
|
if(cookies != null) { |
||||||
|
for (String key : cookies.keySet()) { |
||||||
|
String value = cookies.get(key); |
||||||
|
BasicClientCookie clientCookie = new BasicClientCookie(key, value); |
||||||
|
clientCookie.setVersion(0); |
||||||
|
clientCookie.setSecure(false); |
||||||
|
clientCookie.setDomain("."); |
||||||
|
clientCookie.setPath("/"); |
||||||
|
cookieStore.addCookie(clientCookie); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 带参数的get请求 |
||||||
|
* |
||||||
|
* @param url |
||||||
|
* @param map |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static HttpResult doGet(String url, Map<String, Object> param) { |
||||||
|
try { |
||||||
|
// 1.创建URIBuilder
|
||||||
|
URIBuilder uriBuilder = new URIBuilder(url); |
||||||
|
|
||||||
|
// 2.设置请求参数
|
||||||
|
if (param != null) { |
||||||
|
// 遍历请求参数
|
||||||
|
for (Map.Entry<String, Object> entry : param.entrySet()) { |
||||||
|
// 封装请求参数
|
||||||
|
uriBuilder.setParameter(entry.getKey(), entry.getValue().toString()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 3.创建请求对象httpGet
|
||||||
|
HttpGet httpGet = new HttpGet(uriBuilder.build()); |
||||||
|
httpGet.setConfig(config); |
||||||
|
// 4.使用httpClient发起请求
|
||||||
|
CloseableHttpResponse response = HttpClients.custom().setDefaultCookieStore(cookieStore).setConnectionManager(cm).build() |
||||||
|
.execute(httpGet); |
||||||
|
|
||||||
|
// 5.解析返回结果,封装返回对象httpResult
|
||||||
|
return getResult(response); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("http request failed",e); |
||||||
|
return new HttpResult(500, "http request failed"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 不带参数的get |
||||||
|
* |
||||||
|
* @param url |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static HttpResult doGet(String url) { |
||||||
|
return doGet(url, null); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 带参数的post请求 |
||||||
|
* |
||||||
|
* @param url |
||||||
|
* @param map |
||||||
|
* @return |
||||||
|
* @ |
||||||
|
*/ |
||||||
|
public static HttpResult doPost(String url, Map<String, Object> param) { |
||||||
|
try { |
||||||
|
// 1. 声明httppost
|
||||||
|
HttpPost httpPost = new HttpPost(url); |
||||||
|
httpPost.setHeader("Accept", "application/json"); |
||||||
|
httpPost.setHeader("Content-Type", "application/json"); |
||||||
|
String charSet = "UTF-8"; |
||||||
|
|
||||||
|
// 2.封装请求参数,请求数据是表单
|
||||||
|
if (param != null) { |
||||||
|
// 声明封装表单数据的容器
|
||||||
|
List<NameValuePair> parameters = new ArrayList<NameValuePair>(); |
||||||
|
for (Map.Entry<String, Object> entry : param.entrySet()) { |
||||||
|
// 封装请求参数到容器中
|
||||||
|
parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString())); |
||||||
|
} |
||||||
|
|
||||||
|
// 创建表单的Entity对象
|
||||||
|
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, ENCODING_UTF8); |
||||||
|
|
||||||
|
// 3. 把封装好的表单实体对象设置到HttpPost对象
|
||||||
|
httpPost.setEntity(entity); |
||||||
|
} |
||||||
|
|
||||||
|
// 4. 使用Httpclient发起请求
|
||||||
|
CloseableHttpResponse response = HttpClients.custom().setDefaultCookieStore(cookieStore).setConnectionManager(cm).build() |
||||||
|
.execute(httpPost); |
||||||
|
|
||||||
|
return getResult(response); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("http request failed",e); |
||||||
|
return new HttpResult(500, "http request failed"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* json格式参数的post请求 |
||||||
|
* |
||||||
|
* @param url 请求地址 |
||||||
|
* @param params json格式参数 |
||||||
|
* @return |
||||||
|
* @ |
||||||
|
*/ |
||||||
|
public static HttpResult postWithJson(String url, String params, Map<String, String> headers) { |
||||||
|
try { |
||||||
|
// 1. 声明httppost
|
||||||
|
HttpPost httpPost = new HttpPost(url); |
||||||
|
httpPost.setHeader("Accept", "application/json"); |
||||||
|
httpPost.setHeader("Content-Type", "application/json"); |
||||||
|
String charSet = "UTF-8"; |
||||||
|
StringEntity entity = new StringEntity(params, charSet); |
||||||
|
httpPost.setEntity(entity); |
||||||
|
|
||||||
|
//设置http请求头
|
||||||
|
if(headers != null) { |
||||||
|
for (String key : headers.keySet()) { |
||||||
|
httpPost.setHeader(key, headers.get(key)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 4. 使用Httpclient发起请求
|
||||||
|
CloseableHttpResponse response = HttpClients.custom().setConnectionManager(cm).build().execute(httpPost); |
||||||
|
|
||||||
|
// 5. 解析返回数据,封装HttpResult
|
||||||
|
return getResult(response); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("http request failed",e); |
||||||
|
return new HttpResult(500, "http request failed"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static HttpResult getResult(CloseableHttpResponse response) throws IOException { |
||||||
|
// 状态码
|
||||||
|
int code = response.getStatusLine().getStatusCode(); |
||||||
|
|
||||||
|
// 响应体内容
|
||||||
|
String body = null; |
||||||
|
if (response.getEntity() != null) { |
||||||
|
body = EntityUtils.toString(response.getEntity(), ENCODING_UTF8); |
||||||
|
} |
||||||
|
|
||||||
|
return new HttpResult(code, body); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 不带参数的post请求 |
||||||
|
* |
||||||
|
* @param url |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static HttpResult doPost(String url) { |
||||||
|
return doPost(url, null); |
||||||
|
} |
||||||
|
|
||||||
|
public static void doPostAsync(final String url, final Map<String, Object> param){ |
||||||
|
new Thread(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
try { |
||||||
|
doPost(url, param); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
}).start(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
package com.mengyxu.core.pojo; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
import com.mengyxu.core.pojo.com.Cache; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月13日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Data |
||||||
|
@SuppressWarnings("all") |
||||||
|
public class BufferResult { |
||||||
|
|
||||||
|
private String key; |
||||||
|
private boolean effective; |
||||||
|
private String loseTime; |
||||||
|
private Object value; |
||||||
|
|
||||||
|
public BufferResult(String key, Cache cache) { |
||||||
|
this.key = key; |
||||||
|
this.effective = !Cache.isEmpty(cache); |
||||||
|
this.loseTime = cache.getLoseTime(); |
||||||
|
this.value = cache.getValue(); |
||||||
|
if(value instanceof Map) { |
||||||
|
Map map = (Map) value; |
||||||
|
Set keySet = map.keySet(); |
||||||
|
if(!keySet.isEmpty() && keySet.toArray()[0] instanceof Integer) { |
||||||
|
Map<String, Object> newMap = new HashMap<>(); |
||||||
|
for (Object mapKey : keySet) { |
||||||
|
newMap.put(mapKey.toString(), map.get(mapKey)); |
||||||
|
} |
||||||
|
this.value = newMap; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.mengyxu.core.pojo.base; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月10日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class BaseCountBean { |
||||||
|
|
||||||
|
private long total; |
||||||
|
private long disTotal; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package com.mengyxu.core.pojo.base; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年10月17日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class BasePageParam extends BasePojo { |
||||||
|
|
||||||
|
@JSONField(serialize=false) |
||||||
|
private Integer page; |
||||||
|
@JSONField(serialize=false) |
||||||
|
private Integer size; |
||||||
|
@JSONField(serialize=false) |
||||||
|
private Integer limitStart; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.mengyxu.core.pojo.base; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月24日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class BasePeriod extends BasePageParam { |
||||||
|
|
||||||
|
private String startTime; |
||||||
|
private String endTime; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package com.mengyxu.core.pojo.base; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import com.mengyxu.core.utils.DateUtil; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年9月20日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Data |
||||||
|
public class BasePojo { |
||||||
|
|
||||||
|
private String time; |
||||||
|
|
||||||
|
public String getTime() { |
||||||
|
if(!StringUtil.isEmpty(time)) { |
||||||
|
return time; |
||||||
|
} |
||||||
|
return DateUtil.format(new Date(), DateUtil.FORMAT19_LINE_YYYYMMDDHHMMSS); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package com.mengyxu.core.pojo.base; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年10月17日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public abstract class BaseTree<T> { |
||||||
|
|
||||||
|
private String id;//编号
|
||||||
|
private String name;//名称
|
||||||
|
private String desc;//说明
|
||||||
|
|
||||||
|
private List<T> children; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.mengyxu.core.pojo.com; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月26日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Data |
||||||
|
public class AjaxResponse { |
||||||
|
private boolean success; |
||||||
|
private String message; |
||||||
|
private Object data; |
||||||
|
|
||||||
|
public AjaxResponse(boolean success, String message) { |
||||||
|
this.success = success; |
||||||
|
this.message = message; |
||||||
|
} |
||||||
|
|
||||||
|
public AjaxResponse() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public AjaxResponse(boolean success, String message, Object data) { |
||||||
|
this.success = success; |
||||||
|
this.message = message; |
||||||
|
this.data = data; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
package com.mengyxu.core.pojo.com; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import com.mengyxu.core.utils.DateUtil; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月26日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public class Cache { |
||||||
|
|
||||||
|
private Object value; |
||||||
|
private Long timeout; |
||||||
|
private Long loseTime; |
||||||
|
|
||||||
|
public <T> Cache(T value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
public <T> Cache(T value, long timeout) { |
||||||
|
this.value = value; |
||||||
|
this.timeout = timeout; |
||||||
|
this.loseTime = System.currentTimeMillis() + timeout*1000; |
||||||
|
} |
||||||
|
|
||||||
|
public <T> T getValue() { |
||||||
|
if(loseTime != null && System.currentTimeMillis() > loseTime) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return (T)value; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLoseTime() { |
||||||
|
if(loseTime == null) { |
||||||
|
return "永不失效"; |
||||||
|
} |
||||||
|
return DateUtil.format(new Date(loseTime), DateUtil.FORMAT19_LINE_YYYYMMDDHHMMSS); |
||||||
|
} |
||||||
|
|
||||||
|
public void refresh() { |
||||||
|
if(timeout != null) { |
||||||
|
this.loseTime = System.currentTimeMillis() + timeout*1000; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isEmpty(Cache cache) { |
||||||
|
return cache == null || cache.getValue() == null; |
||||||
|
} |
||||||
|
|
||||||
|
public static void setLoseTime(Cache cache,Long loseTime) { |
||||||
|
cache.loseTime = loseTime; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package com.mengyxu.core.pojo.com; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月26日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Data |
||||||
|
public class Entry<K,V> implements Serializable{ |
||||||
|
private static final long serialVersionUID = 8389699482773678138L; |
||||||
|
private K key; |
||||||
|
private V value; |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.mengyxu.core.pojo.com; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月26日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class PageResult<E>{ |
||||||
|
private List<E> rows; // 每页记录集合
|
||||||
|
private String status; |
||||||
|
private Long total; |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package com.mengyxu.core.pojo.com; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.core.pojo.base.BaseTree; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月26日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class VueTreeSlt extends BaseTree<VueTreeSlt> { |
||||||
|
|
||||||
|
private String label; |
||||||
|
private Integer level; |
||||||
|
|
||||||
|
public List<VueTreeSlt> getChildren(){ |
||||||
|
List<VueTreeSlt> children = super.getChildren(); |
||||||
|
if(children == null || children.isEmpty()) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return children; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
package com.mengyxu.core.pojo.special; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年5月8日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class XmlTag { |
||||||
|
|
||||||
|
private String name; |
||||||
|
private Map<String, String> attrs; |
||||||
|
private String value; |
||||||
|
private List<XmlTag> nodes; |
||||||
|
private boolean editable; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.mengyxu.core.promise; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年11月22日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface ExcelParser<T> { |
||||||
|
|
||||||
|
public List<String[]> parseToArray(T obj); |
||||||
|
|
||||||
|
public List<T> parseToObj(List<String[]> list, Object param) throws CoreException; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,63 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
import java.util.Base64; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.golbal.GlobalConstant; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月25日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class Base64Util { |
||||||
|
|
||||||
|
/** |
||||||
|
* 解密 |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static String decodeToString(String str) throws CoreException { |
||||||
|
return decodeToString(str, GlobalConstant.ENCODING_UTF8); |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] decode(String str) { |
||||||
|
return Base64.getDecoder().decode(str); |
||||||
|
} |
||||||
|
|
||||||
|
public static String decodeToString(String str, String encoding) throws CoreException{ |
||||||
|
try { |
||||||
|
byte[] decode = decode(str); |
||||||
|
return new String(decode, encoding); |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
throw new CoreException("Unsupport encoding [" + encoding +"]", e); |
||||||
|
}catch (IllegalArgumentException e) { |
||||||
|
throw new CoreException("It's not the Base64 encoding string."); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 加密 |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static String encode(String str) throws CoreException { |
||||||
|
return encode(str.getBytes()); |
||||||
|
} |
||||||
|
|
||||||
|
public static String encode(byte[] bytes) { |
||||||
|
return Base64.getEncoder().encodeToString(bytes); |
||||||
|
} |
||||||
|
|
||||||
|
public static String encode(String str, String encoding) throws CoreException { |
||||||
|
try { |
||||||
|
return encode(str.getBytes(encoding)); |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
throw new CoreException("Unsupport encoding [" + encoding +"]", e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private Base64Util(){} |
||||||
|
} |
@ -0,0 +1,316 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年1月6日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class ByteUtil { |
||||||
|
/** |
||||||
|
* 转换short为byte |
||||||
|
* |
||||||
|
* @param b |
||||||
|
* @param s |
||||||
|
* 需要转换的short |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
public static void putShort(byte b[], short s, int index) { |
||||||
|
b[index + 1] = (byte) (s >> 8); |
||||||
|
b[index + 0] = (byte) (s >> 0); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 转换无符号short为byte |
||||||
|
* |
||||||
|
* @param b |
||||||
|
* @param i 需要转换的short |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
public static void putUnsignedShort(byte b[], int i, int index) { |
||||||
|
short s = (short) i; |
||||||
|
b[index + 1] = (byte) (s >> 0); |
||||||
|
b[index + 0] = (byte) (s >> 8); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 通过byte数组取到short |
||||||
|
* |
||||||
|
* @param b |
||||||
|
* @param index |
||||||
|
* 第几位开始取 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static short getShort(byte[] b, int index) { |
||||||
|
return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过byte数组取到无符号short |
||||||
|
* |
||||||
|
* @param b |
||||||
|
* @param index 第几位开始取 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static int getUnsignedShort(byte[] b, int index) { |
||||||
|
short s = (short) ((b[index + 0] << 8) | b[index + 1] & 0xff); |
||||||
|
return Short.toUnsignedInt(s); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 转换int为byte数组 |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param x |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
public static void putInt(byte[] bb, int x, int index) { |
||||||
|
bb[index + 3] = (byte) (x >> 24); |
||||||
|
bb[index + 2] = (byte) (x >> 16); |
||||||
|
bb[index + 1] = (byte) (x >> 8); |
||||||
|
bb[index + 0] = (byte) (x >> 0); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 转换无符号int为byte数组 |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param l |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
public static void putUnsignedInt(byte[] bb, long l, int index) { |
||||||
|
int x = (int) l; |
||||||
|
bb[index + 0] = (byte) (x >> 24); |
||||||
|
bb[index + 1] = (byte) (x >> 16); |
||||||
|
bb[index + 2] = (byte) (x >> 8); |
||||||
|
bb[index + 3] = (byte) (x >> 0); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 通过byte数组取到int |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param index |
||||||
|
* 第几位开始 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static int getInt(byte[] bb, int index) { |
||||||
|
return (int) ((((bb[index + 3] & 0xff) << 24) | ((bb[index + 2] & 0xff) << 16) | ((bb[index + 1] & 0xff) << 8) |
||||||
|
| ((bb[index + 0] & 0xff) << 0))); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过byte数组取到无符号int |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param index 第几位开始 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static long getUnsignedInt(byte[] bb, int index) { |
||||||
|
int i = (int) ((((bb[index + 0] & 0xff) << 24) | ((bb[index + 1] & 0xff) << 16) | ((bb[index + 2] & 0xff) << 8) |
||||||
|
| ((bb[index + 3] & 0xff) << 0))); |
||||||
|
return Integer.toUnsignedLong(i); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 转换long型为byte数组 |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param x |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
public static void putLong(byte[] bb, long x, int index) { |
||||||
|
bb[index + 7] = (byte) (x >> 56); |
||||||
|
bb[index + 6] = (byte) (x >> 48); |
||||||
|
bb[index + 5] = (byte) (x >> 40); |
||||||
|
bb[index + 4] = (byte) (x >> 32); |
||||||
|
bb[index + 3] = (byte) (x >> 24); |
||||||
|
bb[index + 2] = (byte) (x >> 16); |
||||||
|
bb[index + 1] = (byte) (x >> 8); |
||||||
|
bb[index + 0] = (byte) (x >> 0); |
||||||
|
} |
||||||
|
public static void putLongNet(byte[] bb, long x, int index) { |
||||||
|
bb[index + 0] = (byte) (x >> 56); |
||||||
|
bb[index + 1] = (byte) (x >> 48); |
||||||
|
bb[index + 2] = (byte) (x >> 40); |
||||||
|
bb[index + 3] = (byte) (x >> 32); |
||||||
|
bb[index + 4] = (byte) (x >> 24); |
||||||
|
bb[index + 5] = (byte) (x >> 16); |
||||||
|
bb[index + 6] = (byte) (x >> 8); |
||||||
|
bb[index + 7] = (byte) (x >> 0); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 通过byte数组取到long |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param index |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static long getLong(byte[] bb, int index) { |
||||||
|
return ((((long) bb[index + 7] & 0xff) << 56) | (((long) bb[index + 6] & 0xff) << 48) |
||||||
|
| (((long) bb[index + 5] & 0xff) << 40) | (((long) bb[index + 4] & 0xff) << 32) |
||||||
|
| (((long) bb[index + 3] & 0xff) << 24) | (((long) bb[index + 2] & 0xff) << 16) |
||||||
|
| (((long) bb[index + 1] & 0xff) << 8) | (((long) bb[index + 0] & 0xff) << 0)); |
||||||
|
} |
||||||
|
public static long getLongNet(byte[] bb, int index) { |
||||||
|
return ((((long) bb[index + 0] & 0xff) << 56) | (((long) bb[index + 1] & 0xff) << 48) |
||||||
|
| (((long) bb[index + 2] & 0xff) << 40) | (((long) bb[index + 3] & 0xff) << 32) |
||||||
|
| (((long) bb[index + 4] & 0xff) << 24) | (((long) bb[index + 5] & 0xff) << 16) |
||||||
|
| (((long) bb[index + 6] & 0xff) << 8) | (((long) bb[index + 7] & 0xff) << 0)); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 字符到字节转换 |
||||||
|
* |
||||||
|
* @param ch |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static void putChar(byte[] bb, char ch, int index) { |
||||||
|
int temp = (int) ch; |
||||||
|
// byte[] b = new byte[2];
|
||||||
|
for (int i = 0; i < 2; i ++ ) { |
||||||
|
bb[index + i] = new Integer(temp & 0xff).byteValue(); // 将最高位保存在最低位
|
||||||
|
temp = temp >> 8; // 向右移8位
|
||||||
|
} |
||||||
|
} |
||||||
|
public static void putCharNet(byte[] bb, char ch, int index) { |
||||||
|
int temp = (int) ch; |
||||||
|
// byte[] b = new byte[2];
|
||||||
|
for (int i = 1; i >=0; i -- ) { |
||||||
|
bb[index + i] = new Integer(temp & 0xff).byteValue(); // 将最高位保存在最低位
|
||||||
|
temp = temp >> 8; // 向右移8位
|
||||||
|
} |
||||||
|
} |
||||||
|
/** |
||||||
|
* 字节到字符转换 |
||||||
|
* |
||||||
|
* @param b |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static char getChar(byte[] b, int index) { |
||||||
|
int s = 0; |
||||||
|
if (b[index + 1] > 0) |
||||||
|
s += b[index + 1]; |
||||||
|
else |
||||||
|
s += 256 + b[index + 0]; |
||||||
|
s *= 256; |
||||||
|
if (b[index + 0] > 0) |
||||||
|
s += b[index + 1]; |
||||||
|
else |
||||||
|
s += 256 + b[index + 0]; |
||||||
|
char ch = (char) s; |
||||||
|
return ch; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* float转换byte |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param x |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
public static void putFloat(byte[] bb, float x, int index) { |
||||||
|
// byte[] b = new byte[4];
|
||||||
|
int l = Float.floatToIntBits(x); |
||||||
|
for (int i = 0; i < 4; i++) { |
||||||
|
bb[index + i] = new Integer(l).byteValue(); |
||||||
|
l = l >> 8; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过byte数组取得float |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param index |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static float getFloat(byte[] b, int index) { |
||||||
|
int l; |
||||||
|
l = b[index + 0]; |
||||||
|
l &= 0xff; |
||||||
|
l |= ((long) b[index + 1] << 8); |
||||||
|
l &= 0xffff; |
||||||
|
l |= ((long) b[index + 2] << 16); |
||||||
|
l &= 0xffffff; |
||||||
|
l |= ((long) b[index + 3] << 24); |
||||||
|
return Float.intBitsToFloat(l); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* double转换byte |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param x |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
public static void putDouble(byte[] bb, double x, int index) { |
||||||
|
// byte[] b = new byte[8];
|
||||||
|
long l = Double.doubleToLongBits(x); |
||||||
|
for (int i = 0; i < 4; i++) { |
||||||
|
bb[index + i] = new Long(l).byteValue(); |
||||||
|
l = l >> 8; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过byte数组取得float |
||||||
|
* |
||||||
|
* @param bb |
||||||
|
* @param index |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static double getDouble(byte[] b, int index) { |
||||||
|
long l; |
||||||
|
l = b[0]; |
||||||
|
l &= 0xff; |
||||||
|
l |= ((long) b[1] << 8); |
||||||
|
l &= 0xffff; |
||||||
|
l |= ((long) b[2] << 16); |
||||||
|
l &= 0xffffff; |
||||||
|
l |= ((long) b[3] << 24); |
||||||
|
l &= 0xffffffffl; |
||||||
|
l |= ((long) b[4] << 32); |
||||||
|
l &= 0xffffffffffl; |
||||||
|
l |= ((long) b[5] << 40); |
||||||
|
l &= 0xffffffffffffl; |
||||||
|
l |= ((long) b[6] << 48); |
||||||
|
l &= 0xffffffffffffffl; |
||||||
|
l |= ((long) b[7] << 56); |
||||||
|
return Double.longBitsToDouble(l); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* IPV4地址转换无符号byte数组 |
||||||
|
* |
||||||
|
* @param b |
||||||
|
* @param ip |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
public static void putIpv4(byte[] b, String ip, int index) { |
||||||
|
if (StringUtil.isEmpty(ip)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
String[] arr = ip.split("\\."); |
||||||
|
if (arr.length != 4) { |
||||||
|
return; |
||||||
|
} |
||||||
|
for (int i = 0; i < arr.length; i++) { |
||||||
|
short s = Short.parseShort(arr[i]); |
||||||
|
b[i + index] = (byte) s; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过无符号byte数组取得IPV4地址 |
||||||
|
* |
||||||
|
* @param b |
||||||
|
* @param index |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getIpv4(byte[] b, int index) { |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
for (int i = 0; i < 4; i++) { |
||||||
|
int s = Byte.toUnsignedInt(b[index + i]); |
||||||
|
sb.append(s).append("."); |
||||||
|
} |
||||||
|
return sb.substring(0, sb.length() - 1); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,234 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.text.DateFormat; |
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.text.ParseException; |
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.Calendar; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.Locale; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月17日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class DateUtil { |
||||||
|
public static final String FORMAT10_LINE_DDMMYYYY = "dd-MM-yyyy"; |
||||||
|
public static final String FORMAT10_LINE_MMDDYYYY = "MM-dd-yyyy"; |
||||||
|
public static final String FORMAT10_LINE_YYYYMMDD = "yyyy-MM-dd"; |
||||||
|
|
||||||
|
public static final String FORMAT10_SLASH_DDMMYYYY = "dd/MM/yyyy"; |
||||||
|
public static final String FORMAT10_SLASH_MMDDYYYY = "MM/dd/yyyy"; |
||||||
|
public static final String FORMAT10_SLASH_YYYYMMDD = "yyyy/MM/dd"; |
||||||
|
|
||||||
|
public static final String FORMAT19_LINE_YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss"; |
||||||
|
|
||||||
|
public static final String FORMAT8_DDMMYYYY = "ddMMyyyy"; |
||||||
|
public static final String FORMAT8_MMDDYYYY = "MMddyyyy"; |
||||||
|
public static final String FORMAT8_YYYYMMDD = "yyyyMMdd"; |
||||||
|
|
||||||
|
public static final String FORMAT3_YYM = "yy年M月"; |
||||||
|
public static final String FORMAT2_MD = "M月d日"; |
||||||
|
public static final String FORMAT2_DH = "d日H时"; |
||||||
|
|
||||||
|
public static final String FORMAT10_YYYYMMDDHH = "yyyyMMddHH"; |
||||||
|
|
||||||
|
public static final String FORMAT6_YYYYMM = "yyyyMM"; |
||||||
|
public static final String FORMAT8_YYYYMM = "yyyy年MM月"; |
||||||
|
|
||||||
|
public static final String FORMAT14_YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; |
||||||
|
public static final String FORMAT_GMT_8 = "EEE MMM dd yyyy HH:mm:ss 'GMT+0800(中国标准时间)'"; |
||||||
|
|
||||||
|
public static final String FORMAT20_LINE_YYYYMMDDTHHMMSS = "yyyy-MM-dd'T'HH:mm:ss"; |
||||||
|
|
||||||
|
|
||||||
|
private DateUtil(){ |
||||||
|
//Add a private constructor to hide the implicit public one.
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* Convert a date string from <code>srcPattern</code> to <code>destPattern</code>。 |
||||||
|
* </p> |
||||||
|
* @param dateStr |
||||||
|
* @param srcPattern |
||||||
|
* @param destPattern |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static String convert(String dateStr, String srcPattern, String destPattern) throws CoreException{ |
||||||
|
if (dateStr == null){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
Date date = parse(dateStr, srcPattern); |
||||||
|
return format(date, destPattern); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Format a date with specific String pattern. |
||||||
|
* @param date |
||||||
|
* @param pattern |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String format(Date date, String pattern){ |
||||||
|
DateFormat formatter = new SimpleDateFormat(pattern); |
||||||
|
|
||||||
|
return formatter.format(date); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Format a date with specific String pattern. |
||||||
|
* @param date |
||||||
|
* @param pattern |
||||||
|
* @Param locale |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String format(Date date, String pattern, Locale locale){ |
||||||
|
DateFormat formatter = new SimpleDateFormat(pattern, locale); |
||||||
|
|
||||||
|
return formatter.format(date); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Parse a string to a date with pattern. |
||||||
|
* @param src |
||||||
|
* @param pattern |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static Date parse(String src, String pattern) throws CoreException{ |
||||||
|
DateFormat formatter = new SimpleDateFormat(pattern); |
||||||
|
try { |
||||||
|
return formatter.parse(src); |
||||||
|
} catch (ParseException e) { |
||||||
|
String message = "Connect convert to date. Unexpected pattern [{0}] for value [{1}]."; |
||||||
|
throw new CoreException(MessageFormat.format(message, pattern, src), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static int compare(String src, String dest, String pattern) throws CoreException{ |
||||||
|
Date srcDate = parse(src, pattern); |
||||||
|
Date destDate = parse(dest, pattern); |
||||||
|
|
||||||
|
return srcDate.compareTo(destDate); |
||||||
|
} |
||||||
|
|
||||||
|
public static long diff(String src, String dest, String pattern) throws CoreException{ |
||||||
|
Date srcDate = parse(src, pattern); |
||||||
|
Date destDate = parse(dest, pattern); |
||||||
|
|
||||||
|
return (destDate.getTime()-srcDate.getTime())/(1000*60*60*24); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static int diff(Date srcDate, Date destDate) throws CoreException{ |
||||||
|
Calendar src = Calendar.getInstance(); |
||||||
|
src.setTime(srcDate); |
||||||
|
|
||||||
|
Calendar dest = Calendar.getInstance(); |
||||||
|
dest.setTime(destDate); |
||||||
|
|
||||||
|
if (src.get(Calendar.YEAR) == dest.get(Calendar.YEAR)){ |
||||||
|
return dest.get(Calendar.DAY_OF_YEAR) - src.get(Calendar.DAY_OF_YEAR); |
||||||
|
} else { |
||||||
|
int srcYear = src.get(Calendar.YEAR); |
||||||
|
|
||||||
|
Calendar tmp = Calendar.getInstance(); |
||||||
|
tmp.setTimeInMillis(dest.getTimeInMillis()); |
||||||
|
tmp.set(Calendar.YEAR, srcYear); |
||||||
|
|
||||||
|
int diff = tmp.get(Calendar.DAY_OF_YEAR) - src.get(Calendar.DAY_OF_YEAR); |
||||||
|
diff += (destDate.getTime()-tmp.getTimeInMillis())/(1000*60*60*24L); |
||||||
|
|
||||||
|
return diff; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return today with pattern. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String today(String pattern) { |
||||||
|
return format(new Date(), pattern); |
||||||
|
} |
||||||
|
|
||||||
|
public static Date dayAdd(int offset) { |
||||||
|
return dayAdd(new Date(), offset); |
||||||
|
} |
||||||
|
public static Date dayAdd(Date date, int offset) { |
||||||
|
Calendar calendar = Calendar.getInstance(); |
||||||
|
calendar.setTime(date); |
||||||
|
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + offset); |
||||||
|
return calendar.getTime(); |
||||||
|
} |
||||||
|
public static String dayAdd(String pattern, int offset){ |
||||||
|
Date date = dayAdd(offset); |
||||||
|
return format(date, pattern); |
||||||
|
} |
||||||
|
public static String dayAdd(String src, String pattern, int offset) throws CoreException { |
||||||
|
Date date = dayAdd(parse(src, pattern), offset); |
||||||
|
return format(date, pattern); |
||||||
|
} |
||||||
|
|
||||||
|
public static Date hourAdd(Date date, int offset){ |
||||||
|
Calendar calendar = Calendar.getInstance(); |
||||||
|
calendar.setTime(date); |
||||||
|
calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + offset); |
||||||
|
return calendar.getTime(); |
||||||
|
} |
||||||
|
public static Date hourAdd(int offset){ |
||||||
|
return hourAdd(new Date(), offset); |
||||||
|
} |
||||||
|
public static String hourAdd(String pattern, int offset){ |
||||||
|
Date date = hourAdd(offset); |
||||||
|
return format(date, pattern); |
||||||
|
} |
||||||
|
public static String hourAdd(String src, String pattern, int offset) throws CoreException { |
||||||
|
Date date = hourAdd(parse(src, pattern), offset); |
||||||
|
return format(date, pattern); |
||||||
|
} |
||||||
|
|
||||||
|
public static Date monthAdd(Date date, int offset){ |
||||||
|
Calendar calendar = Calendar.getInstance(); |
||||||
|
calendar.setTime(date); |
||||||
|
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + offset); |
||||||
|
calendar.set(Calendar.DAY_OF_MONTH, calendar.getMinimum(Calendar.DATE)); |
||||||
|
return calendar.getTime(); |
||||||
|
} |
||||||
|
public static Date monthAdd(int offset){ |
||||||
|
return monthAdd(new Date(), offset); |
||||||
|
} |
||||||
|
public static String monthAdd(String pattern, int offset) { |
||||||
|
Date date = monthAdd(offset); |
||||||
|
return format(date, pattern); |
||||||
|
} |
||||||
|
public static String monthAdd(String src, String pattern, int offset) throws CoreException { |
||||||
|
Date date = monthAdd(parse(src, pattern), offset); |
||||||
|
return format(date, pattern); |
||||||
|
} |
||||||
|
|
||||||
|
public static String getFirstDay(Date month, String destPattern){ |
||||||
|
Calendar calendar = Calendar.getInstance(); |
||||||
|
calendar.setTime(month); |
||||||
|
calendar.set(Calendar.DAY_OF_MONTH, calendar.getMinimum(Calendar.DATE)); |
||||||
|
return format(calendar.getTime(), destPattern); |
||||||
|
} |
||||||
|
public static String getFirstDay(String month, String srcPattern, String destPattern) throws CoreException{ |
||||||
|
return getFirstDay(parse(month, srcPattern),destPattern); |
||||||
|
} |
||||||
|
public static String getLastDay(Date month, String pattern){ |
||||||
|
Calendar calendar = Calendar.getInstance(); |
||||||
|
calendar.setTime(month); |
||||||
|
calendar.set(Calendar.DAY_OF_MONTH, calendar.getMaximum(Calendar.DATE)); |
||||||
|
return format(calendar.getTime(), pattern); |
||||||
|
} |
||||||
|
public static String getLastDay(String month, String srcPattern, String destPattern) throws CoreException{ |
||||||
|
return getLastDay(parse(month, srcPattern),destPattern); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,173 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream; |
||||||
|
import java.io.File; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
||||||
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem; |
||||||
|
import org.apache.poi.ss.usermodel.Cell; |
||||||
|
import org.apache.poi.ss.usermodel.CellType; |
||||||
|
import org.apache.poi.ss.usermodel.Row; |
||||||
|
import org.apache.poi.ss.usermodel.Sheet; |
||||||
|
import org.apache.poi.ss.usermodel.Workbook; |
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
||||||
|
import org.springframework.web.multipart.MultipartFile; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.promise.ExcelParser; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年11月22日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
@SuppressWarnings("all") |
||||||
|
public class ExcelUtil { |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 将数据转换为Excel表格,并将Excel表格转为字节数组返回 |
||||||
|
* @param template 模版路径 |
||||||
|
* @param data 源数据 |
||||||
|
* @param parser 数据转换工具 |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static byte[] parseToExcelByteArray(String template, List<? extends Object> data, ExcelParser parser) throws CoreException { |
||||||
|
Workbook book = parserToExcel(template, data, parser); |
||||||
|
try( |
||||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream(); |
||||||
|
) { |
||||||
|
book.write(bos); |
||||||
|
return bos.toByteArray(); |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("将Excel转为字节数组失败",e); |
||||||
|
throw new CoreException("将Excel转为字节数组失败"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将数据转换为Excel表格并返回 |
||||||
|
* @param template 模版路径 |
||||||
|
* @param data 源数据 |
||||||
|
* @param parser 数据转换工具 |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static Workbook parserToExcel(String template, List<? extends Object> data, ExcelParser parser) { |
||||||
|
Workbook book = loadTemplate(template); |
||||||
|
Sheet sheet = book.getSheetAt(0); |
||||||
|
int index = 1; |
||||||
|
for (Object obj : data) { |
||||||
|
List<String[]> result = parser.parseToArray(obj); |
||||||
|
for (String[] arr : result) { |
||||||
|
Row row = sheet.createRow(index++); |
||||||
|
for (int i = 0; i < arr.length; i++) { |
||||||
|
row.createCell(i).setCellValue(arr[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return book; |
||||||
|
} |
||||||
|
|
||||||
|
private static HSSFWorkbook loadTemplate(String template) { |
||||||
|
File file = new File(template); |
||||||
|
if(file.exists()) { |
||||||
|
try { |
||||||
|
return new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(file))); |
||||||
|
} catch (IOException e) { |
||||||
|
log.warn("读取Excel模版失败:"+template,e); |
||||||
|
} |
||||||
|
} |
||||||
|
return new HSSFWorkbook(); |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> List<T> readExcelAsBeanList(MultipartFile file, ExcelParser parser) throws CoreException{ |
||||||
|
return readExcelAsBeanList(file, parser, null); |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> List<T> readExcelAsBeanList(MultipartFile file, ExcelParser parser, Object param) throws CoreException{ |
||||||
|
List<String[]> list = readExcel(file); |
||||||
|
return parser.parseToObj(list,param); |
||||||
|
} |
||||||
|
|
||||||
|
public static List<String[]> readExcel(MultipartFile file) throws CoreException{ |
||||||
|
Workbook book = loadExcel(file); |
||||||
|
Sheet sheet = book.getSheetAt(0); |
||||||
|
if(sheet == null || sheet.getLastRowNum() < 1) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
int rowLen = sheet.getLastRowNum(); |
||||||
|
List<String[]> list = new ArrayList<>(); |
||||||
|
for (int i = 1; i <= rowLen; i++) { |
||||||
|
Row row = sheet.getRow(i); |
||||||
|
if(row == null) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
short cellLen = row.getLastCellNum(); |
||||||
|
if(cellLen <= 0) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
String[] arr = new String[cellLen]; |
||||||
|
for (int j = 0; j < cellLen; j++) { |
||||||
|
Cell cell = row.getCell(j); |
||||||
|
if(cell != null) { |
||||||
|
cell.setCellType(CellType.STRING); |
||||||
|
arr[j] = cell.getStringCellValue(); |
||||||
|
} |
||||||
|
} |
||||||
|
if(StringUtil.isAllEmpty(arr)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
list.add(arr); |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
public static Workbook loadExcel(MultipartFile file) throws CoreException{ |
||||||
|
Workbook book = null; |
||||||
|
try { |
||||||
|
InputStream is = file.getInputStream(); |
||||||
|
String name = file.getOriginalFilename(); |
||||||
|
if(isExcel2003(name)) { |
||||||
|
book = new HSSFWorkbook(is); |
||||||
|
}else if(isExcel2007(name)){ |
||||||
|
book = new XSSFWorkbook(is); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("读取Excel失败",e); |
||||||
|
throw new CoreException("导入失败,读取文件出错!",e); |
||||||
|
} |
||||||
|
if(book == null) { |
||||||
|
throw new CoreException("导入失败,不支持的文件类型!"); |
||||||
|
} |
||||||
|
return book; |
||||||
|
} |
||||||
|
|
||||||
|
/*** |
||||||
|
* |
||||||
|
* @param 判断文件类型是不是2003版本 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static boolean isExcel2003(String filePath) { |
||||||
|
return filePath.matches("^.+\\.(?i)(xls)$"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param 判断文件类型是不是2007版本 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static boolean isExcel2007(String filePath) { |
||||||
|
return filePath.matches("^.+\\.(?i)(xlsx)$"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,448 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.io.BufferedInputStream; |
||||||
|
import java.io.BufferedOutputStream; |
||||||
|
import java.io.BufferedReader; |
||||||
|
import java.io.BufferedWriter; |
||||||
|
import java.io.File; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileNotFoundException; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.io.OutputStreamWriter; |
||||||
|
import java.nio.file.Files; |
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Scanner; |
||||||
|
import java.util.zip.ZipEntry; |
||||||
|
import java.util.zip.ZipInputStream; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.golbal.GlobalConstant; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年11月22日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
public class FileUtil { |
||||||
|
private static final long MAX_SIZE_READ_CONTENT = 10 * 1024L * 1024L; |
||||||
|
public static final String ZIP = "zip"; |
||||||
|
public static final String RAR = "rar"; |
||||||
|
|
||||||
|
public static BufferedReader readFile(String filePath) { |
||||||
|
File file = new File(filePath); |
||||||
|
return readFile(file); |
||||||
|
} |
||||||
|
|
||||||
|
public static BufferedReader readFile(File file) { |
||||||
|
try { |
||||||
|
if (file.exists()){ |
||||||
|
return new BufferedReader(new InputStreamReader((new FileInputStream(file)), "UTF-8")); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("Read file error.", e); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] read(String filePath) { |
||||||
|
File file = new File(filePath); |
||||||
|
return read(file); |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] read(File file) { |
||||||
|
if (file.exists()){ |
||||||
|
try( |
||||||
|
InputStream in = new FileInputStream(file); |
||||||
|
) { |
||||||
|
byte[] body = new byte[in.available()]; |
||||||
|
in.read(body); |
||||||
|
return body; |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("Read file error.", e); |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Read file and return content in string; |
||||||
|
* @param file |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static String readFileToString(File file) throws CoreException{ |
||||||
|
if (file.exists() && file.length() > MAX_SIZE_READ_CONTENT) { |
||||||
|
throw new CoreException(MessageFormat.format("File [{0}] is larger than 10M!", file.getAbsolutePath())); |
||||||
|
} |
||||||
|
|
||||||
|
StringBuilder builder = new StringBuilder(); |
||||||
|
String line = null; |
||||||
|
|
||||||
|
try( |
||||||
|
BufferedReader reader = readFile(file); |
||||||
|
){ |
||||||
|
if (reader == null){ |
||||||
|
log.error(MessageFormat.format("Read file [{0}] failed! ", file.getAbsolutePath())); |
||||||
|
return null; |
||||||
|
} |
||||||
|
while ((line = reader.readLine()) != null){ |
||||||
|
builder.append(line); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
log.error(MessageFormat.format("Read file [{0}] failed! ", file.getAbsolutePath())); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
return builder.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @see readFileToString |
||||||
|
* @param filePath |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static String readFileToString(String filePath) throws CoreException{ |
||||||
|
return readFileToString(new File(filePath)); |
||||||
|
} |
||||||
|
|
||||||
|
public static Scanner scannerFile(String filePath) { |
||||||
|
File file = new File(filePath); |
||||||
|
|
||||||
|
return scannerFile(file); |
||||||
|
} |
||||||
|
|
||||||
|
public static Scanner scannerFile(File file) { |
||||||
|
try { |
||||||
|
if (file.exists()){ |
||||||
|
return new Scanner((new FileInputStream(file)), "UTF-8"); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("Scanner file error.", e); |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Loop and return the file list for the root path. |
||||||
|
* @param root |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static List<File> listFiles(File root) { |
||||||
|
List<File> fileList = new ArrayList<>(); |
||||||
|
File[] configs = root.listFiles(); |
||||||
|
if (configs != null) { |
||||||
|
for (File f : configs) { |
||||||
|
addFileList(fileList, f); |
||||||
|
} |
||||||
|
} |
||||||
|
return fileList; |
||||||
|
} |
||||||
|
|
||||||
|
private static void addFileList(List<File> results, File file) { |
||||||
|
if (file.isFile()) { |
||||||
|
results.add(file); |
||||||
|
|
||||||
|
} else if (file.isDirectory()) { |
||||||
|
results.addAll(listFiles(file)); |
||||||
|
} else { |
||||||
|
log.error("Skip " + file + " is not a valid file."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean mkdir(String dirPath){ |
||||||
|
File dir = new File(dirPath); |
||||||
|
|
||||||
|
if (!dir.exists()) { |
||||||
|
return dir.mkdirs(); |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Write a file with BufferedOutputStream. |
||||||
|
* No close method called in this method for parameter 'os'. |
||||||
|
* The caller should be close it itself. |
||||||
|
* @param file |
||||||
|
* @param os |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static void write(File file, OutputStream os) throws CoreException{ |
||||||
|
BufferedOutputStream bos = new BufferedOutputStream(os); |
||||||
|
|
||||||
|
try ( |
||||||
|
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); |
||||||
|
) { |
||||||
|
byte[] buffered = new byte[1024 * 256]; |
||||||
|
int len = 0; |
||||||
|
int count = 0; |
||||||
|
while((len = bis.read(buffered)) != -1){ |
||||||
|
bos.write(buffered, 0, len); |
||||||
|
|
||||||
|
if (++count % 100 == 0){ |
||||||
|
bos.flush(); |
||||||
|
} |
||||||
|
} |
||||||
|
bos.flush(); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new CoreException(e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Write the content line by line to the file. |
||||||
|
* @param filePath |
||||||
|
* @param contentList |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static File writeToFile(String fullFileName, List<String> contentList) throws CoreException{ |
||||||
|
if (contentList == null || contentList.isEmpty()){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
return writeToFile(fullFileName, contentList.toArray(new String[]{})); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Write the content line by line to the file. |
||||||
|
* @param filePath |
||||||
|
* @param contentList |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static File writeToFile(String fullFileName, String... lines) throws CoreException{ |
||||||
|
if (lines == null || lines.length == 0){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
File newFile = new File(fullFileName); |
||||||
|
File parent = newFile.getParentFile(); |
||||||
|
if(!parent.exists()){ |
||||||
|
parent.mkdirs(); |
||||||
|
} |
||||||
|
|
||||||
|
try ( |
||||||
|
//It will be auto closed at the end with try-with-resources structure.
|
||||||
|
BufferedWriter bufferedWriter = new BufferedWriter( |
||||||
|
new OutputStreamWriter(new FileOutputStream(newFile, true), GlobalConstant.ENCODING_UTF8)); |
||||||
|
){ |
||||||
|
for (String content : lines) { |
||||||
|
bufferedWriter.write(content); |
||||||
|
bufferedWriter.newLine(); |
||||||
|
} |
||||||
|
bufferedWriter.flush(); |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("FileUtil.writeToFile(): IOException:"+e.getMessage()); |
||||||
|
throw new CoreException("FileUtil.writeForExistFile(): IOException:",e); |
||||||
|
} |
||||||
|
|
||||||
|
return newFile; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Write the content of inputStream to the file. |
||||||
|
* @param filePath |
||||||
|
* @param inputStream |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static void writeToFile(String fullFileName, InputStream is) throws CoreException{ |
||||||
|
File newFile = new File(fullFileName); |
||||||
|
File parent = newFile.getParentFile(); |
||||||
|
if(!parent.exists()){ |
||||||
|
parent.mkdirs(); |
||||||
|
} |
||||||
|
try ( |
||||||
|
FileOutputStream fos = new FileOutputStream(newFile); |
||||||
|
){ |
||||||
|
byte[] buffered = new byte[1024 * 256]; |
||||||
|
int len = 0; |
||||||
|
int count = 0; |
||||||
|
while((len = is.read(buffered)) != -1){ |
||||||
|
fos.write(buffered, 0, len); |
||||||
|
|
||||||
|
if (++count % 100 == 0){ |
||||||
|
fos.flush(); |
||||||
|
} |
||||||
|
} |
||||||
|
fos.flush(); |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("FileUtil.writeToFile(): IOException:"+e.getMessage()); |
||||||
|
throw new CoreException("FileUtil.writeForExistFile(): IOException:",e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove suffix for a file name. |
||||||
|
* @param fileName |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String removeSuffix(String fileName){ |
||||||
|
String dest = fileName; |
||||||
|
|
||||||
|
if (fileName.lastIndexOf('.') > 0){ |
||||||
|
dest = fileName.substring(0, fileName.lastIndexOf('.')); |
||||||
|
} |
||||||
|
|
||||||
|
return dest; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Copy a file to b file. |
||||||
|
* @param src |
||||||
|
* @param dest |
||||||
|
* @return True for successfully. False for failed or empty parameter. |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
public static boolean copy(File src, File dest) throws CoreException{ |
||||||
|
if (src == null || dest == null){ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
try ( |
||||||
|
OutputStream os = new FileOutputStream(dest); |
||||||
|
){ |
||||||
|
write(src, os); |
||||||
|
} catch (IOException e) { |
||||||
|
String msg = MessageFormat.format("Cannot copy file from [{0}] to [{1}]", src.getAbsolutePath(), dest.getAbsolutePath()); |
||||||
|
throw new CoreException(msg); |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
private FileUtil(){ |
||||||
|
//A private constructor to hide the implicit public one.
|
||||||
|
} |
||||||
|
public static void decompression(File srcFile, File dstFile) throws CoreException{ |
||||||
|
String fileType = getTypeByStream(srcFile); |
||||||
|
if(ZIP.equals(fileType)){ |
||||||
|
unzip(srcFile,dstFile); |
||||||
|
} |
||||||
|
} |
||||||
|
public static void unzip(File srcFile, File dstFile) throws CoreException { |
||||||
|
if (srcFile.exists()) { |
||||||
|
if (!dstFile.getParentFile().exists()) { |
||||||
|
// 创建文件父目录
|
||||||
|
dstFile.getParentFile().mkdirs(); |
||||||
|
} |
||||||
|
|
||||||
|
try ( |
||||||
|
ZipInputStream zis = new ZipInputStream(new FileInputStream(srcFile)); |
||||||
|
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dstFile)); |
||||||
|
){ |
||||||
|
ZipEntry entry = null; |
||||||
|
while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) { |
||||||
|
// 写入文件
|
||||||
|
int read = 0; |
||||||
|
byte[] buffer = new byte[1024 * 10]; |
||||||
|
while ((read = zis.read(buffer, 0, buffer.length)) != -1) { |
||||||
|
bos.write(buffer, 0, read); |
||||||
|
} |
||||||
|
bos.flush(); |
||||||
|
} |
||||||
|
zis.closeEntry(); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new CoreException(e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
/** |
||||||
|
* 根据文件流读取文件真实类型 |
||||||
|
* |
||||||
|
* @param is |
||||||
|
* @return |
||||||
|
* @throws FileNotFoundException |
||||||
|
*/ |
||||||
|
public static String getTypeByStream(File f) throws CoreException { |
||||||
|
byte[] b = new byte[4]; |
||||||
|
try (FileInputStream is = new FileInputStream(f);) { |
||||||
|
is.read(b, 0, b.length); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new CoreException(e); |
||||||
|
} |
||||||
|
|
||||||
|
String hexString = bytesToHexString(b); |
||||||
|
|
||||||
|
if (hexString == null){ |
||||||
|
throw new CoreException("Unknown file type."); |
||||||
|
} |
||||||
|
|
||||||
|
String type = hexString.toUpperCase(); |
||||||
|
if (type.contains("52617221")) { |
||||||
|
return RAR; |
||||||
|
} else if (type.contains("504B0304")) { |
||||||
|
return ZIP; |
||||||
|
} |
||||||
|
return type; |
||||||
|
} |
||||||
|
/** |
||||||
|
* byte数组转换成16进制字符串 |
||||||
|
* |
||||||
|
* @param src |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String bytesToHexString(byte[] src) { |
||||||
|
StringBuilder stringBuilder = new StringBuilder(); |
||||||
|
if (src == null || src.length <= 0) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
for (int i = 0; i < src.length; i++) { |
||||||
|
int v = src[i] & 0xFF; |
||||||
|
String hv = Integer.toHexString(v); |
||||||
|
if (hv.length() < 2) { |
||||||
|
stringBuilder.append(0); |
||||||
|
} |
||||||
|
stringBuilder.append(hv); |
||||||
|
} |
||||||
|
return stringBuilder.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param files |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static boolean deleteFiles(File...files){ |
||||||
|
if (files == null || files.length == 0){ |
||||||
|
log.warn("No parameter [files] provided!"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
boolean deleteResult = true; |
||||||
|
for (File file : files) { |
||||||
|
if (file != null) { |
||||||
|
try { |
||||||
|
Files.deleteIfExists(file.toPath()); |
||||||
|
} catch (IOException e) { |
||||||
|
log.warn(">(o_o)<~ Cannot delete temporary file: " + file.getAbsolutePath()); |
||||||
|
deleteResult = false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return deleteResult; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isAvailableDir(String filePath){ |
||||||
|
return isAvailableDir(new File(filePath)); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isAvailableDir(File dirFile){ |
||||||
|
return dirFile.exists() && dirFile.isDirectory(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,190 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月25日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class IDNumUtil { |
||||||
|
|
||||||
|
/** |
||||||
|
* 18位二代身份证号码的正则表达式 |
||||||
|
*/ |
||||||
|
private static final String REGEX_ID_NO_18 = "^" |
||||||
|
+ "\\d{6}" // 6位地区码
|
||||||
|
+ "(18|19|([23]\\d))\\d{2}" // 年YYYY
|
||||||
|
+ "((0[1-9])|(10|11|12))" // 月MM
|
||||||
|
+ "(([0-2][1-9])|10|20|30|31)" // 日DD
|
||||||
|
+ "\\d{3}" // 3位顺序码
|
||||||
|
+ "[0-9Xx]" // 校验码
|
||||||
|
+ "$"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 17位二代身份证本体码的正则表达式 |
||||||
|
*/ |
||||||
|
private static final String REGEX_MASTER_NUMBER = "^" |
||||||
|
+ "\\d{6}" // 6位地区码
|
||||||
|
+ "(18|19|([23]\\d))\\d{2}" // 年YYYY
|
||||||
|
+ "((0[1-9])|(10|11|12))" // 月MM
|
||||||
|
+ "(([0-2][1-9])|10|20|30|31)" // 日DD
|
||||||
|
+ "\\d{3}" // 3位顺序码
|
||||||
|
+ "$"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 15位一代身份证号码的正则表达式 |
||||||
|
*/ |
||||||
|
private static final String REGEX_ID_NO_15 = "^" |
||||||
|
+ "\\d{6}" // 6位地区码
|
||||||
|
+ "\\d{2}" // 年YYYY
|
||||||
|
+ "((0[1-9])|(10|11|12))" // 月MM
|
||||||
|
+ "(([0-2][1-9])|10|20|30|31)" // 日DD
|
||||||
|
+ "\\d{3}"// 3位顺序码
|
||||||
|
+ "$"; |
||||||
|
|
||||||
|
private IDNumUtil() { |
||||||
|
//Add a private constructor to hide the implicit public one.
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 校验身份证号码,适用于18位的二代身份证号码 |
||||||
|
* @param IDNo18 身份证号码 |
||||||
|
* @return true - 校验通过<br> |
||||||
|
* false - 校验不通过 |
||||||
|
*/ |
||||||
|
public static boolean checkIDNo(String IDNo18) { |
||||||
|
// 校验身份证号码的长度
|
||||||
|
if (!checkStrLength(IDNo18, 18)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
// 匹配身份证号码的正则表达式
|
||||||
|
if (!regexMatch(IDNo18, REGEX_ID_NO_18)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
// 校验身份证号码的验证码
|
||||||
|
return validateCheckNumber(IDNo18); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 校验字符串长度 |
||||||
|
* |
||||||
|
* @param inputString 字符串 |
||||||
|
* @param len 预期长度 |
||||||
|
* @return true - 校验通过<br> |
||||||
|
* false - 校验不通过 |
||||||
|
*/ |
||||||
|
private static boolean checkStrLength(String inputString, int len) { |
||||||
|
if (inputString == null || inputString.length() != len) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 匹配正则表达式 |
||||||
|
* |
||||||
|
* @param inputString 字符串 |
||||||
|
* @param regex 正则表达式 |
||||||
|
* @return true - 校验通过<br> |
||||||
|
* false - 校验不通过 |
||||||
|
*/ |
||||||
|
private static boolean regexMatch(String inputString, String regex) { |
||||||
|
return inputString.matches(regex); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 校验码校验,适用于18位的二代身份证号码 |
||||||
|
* |
||||||
|
* @param IDNo18 身份证号码 |
||||||
|
* @return true - 校验通过<br> |
||||||
|
* false - 校验不通过 |
||||||
|
*/ |
||||||
|
private static boolean validateCheckNumber(String IDNo18) { |
||||||
|
// 加权因子
|
||||||
|
int[] W = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; |
||||||
|
char[] IDNoArray = IDNo18.toCharArray(); |
||||||
|
int sum = 0; |
||||||
|
for (int i = 0; i < W.length; i++) { |
||||||
|
sum += Integer.parseInt(String.valueOf(IDNoArray[i])) * W[i]; |
||||||
|
} |
||||||
|
// 校验位是X,则表示10
|
||||||
|
if (IDNoArray[17] == 'X' || IDNoArray[17] == 'x') { |
||||||
|
sum += 10; |
||||||
|
} else { |
||||||
|
sum += Integer.parseInt(String.valueOf(IDNoArray[17])); |
||||||
|
} |
||||||
|
// 如果除11模1,则校验通过
|
||||||
|
return sum % 11 == 1; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 计算身份证号码的校验码 |
||||||
|
* |
||||||
|
* @param masterNumber 本体码 |
||||||
|
* @return 身份证号码 |
||||||
|
* @throws IllegalArgumentException |
||||||
|
* 如果本体码为空或长度不为17位或不满足本体码组成规则 |
||||||
|
* <i>6位地址码+ |
||||||
|
* 出生年月日YYYYMMDD+3位顺序码</i> |
||||||
|
*/ |
||||||
|
public static String computeIDNoCheckNumber(String masterNumber) { |
||||||
|
// 校验本体码的长度
|
||||||
|
if (!checkStrLength(masterNumber, 17)) { |
||||||
|
throw new IllegalArgumentException(); |
||||||
|
} |
||||||
|
// 匹配本体码的正则表达式
|
||||||
|
if (!regexMatch(masterNumber, REGEX_MASTER_NUMBER)) { |
||||||
|
throw new IllegalArgumentException(); |
||||||
|
} |
||||||
|
// 计算校验码
|
||||||
|
String checkNumber = computeCheckNumber(masterNumber); |
||||||
|
// 返回本体码+校验码=完整的身份证号码
|
||||||
|
return masterNumber + checkNumber; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 计算校验码,适用于18位的二代身份证号码 |
||||||
|
* |
||||||
|
* @param masterNumber 本体码 |
||||||
|
* @return 校验码 |
||||||
|
*/ |
||||||
|
private static String computeCheckNumber(String masterNumber) { |
||||||
|
// 加权因子
|
||||||
|
int[] W = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; |
||||||
|
char[] masterNumberArray = masterNumber.toCharArray(); |
||||||
|
int sum = 0; |
||||||
|
for (int i = 0; i < W.length; i++) { |
||||||
|
sum += Integer.parseInt(String.valueOf(masterNumberArray[i])) * W[i]; |
||||||
|
} |
||||||
|
// 根据同余定理得到的校验码数组
|
||||||
|
String[] checkNumberArray = { "1", "0", "X", "9", "8", "7", "6", "5", "4", |
||||||
|
"3", "2" }; |
||||||
|
// 得到校验码
|
||||||
|
String checkNumber = checkNumberArray[sum % 11]; |
||||||
|
// 返回校验码
|
||||||
|
return checkNumber; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 15位一代身份证号码升级18位二代身份证号码 |
||||||
|
* |
||||||
|
* @param IDNo15 15位的一代身份证号码 |
||||||
|
* @return 18位的二代身份证号码 |
||||||
|
*/ |
||||||
|
public static String updateIDNo15to18(String IDNo15) { |
||||||
|
// 校验身份证号码的长度
|
||||||
|
if (!checkStrLength(IDNo15, 15)) { |
||||||
|
throw new IllegalArgumentException(); |
||||||
|
} |
||||||
|
// 匹配身份证号码的正则表达式
|
||||||
|
if (!regexMatch(IDNo15, REGEX_ID_NO_15)) { |
||||||
|
throw new IllegalArgumentException(); |
||||||
|
} |
||||||
|
// 得到本体码,因一代身份证皆为19XX年生人,年份中增加19,组成4位
|
||||||
|
String masterNumber = IDNo15.substring(0, 6) + "19" + IDNo15.substring(6); |
||||||
|
// 计算校验码
|
||||||
|
String checkNumber = computeCheckNumber(masterNumber); |
||||||
|
// 返回本体码+校验码=完整的身份证号码
|
||||||
|
return masterNumber + checkNumber; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.TypeReference; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月25日 |
||||||
|
* |
||||||
|
* 处理json数据的工具类 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class JsonUtil { |
||||||
|
|
||||||
|
private JsonUtil(){ |
||||||
|
//Add a private constructor to hide the implicit public one.
|
||||||
|
} |
||||||
|
|
||||||
|
public static Map<String, String> toStringMap(String jsonStr){ |
||||||
|
return JSON.parseObject(jsonStr,new TypeReference<Map<String, String>>(){} ); |
||||||
|
} |
||||||
|
|
||||||
|
public static List<Map<String, String>> toStirngMapList(String jsonStr){ |
||||||
|
return JSON.parseObject(jsonStr, new TypeReference<List<Map<String,String>>>(){}); |
||||||
|
} |
||||||
|
|
||||||
|
public static Map<String,List<Map<String, String>>> toMapStirngMapList(String jsonStr){ |
||||||
|
return JSON.parseObject(jsonStr, new TypeReference<Map<String,List<Map<String, String>>>>(){}); |
||||||
|
} |
||||||
|
|
||||||
|
public static List<String> toStringList(String jsonStr){ |
||||||
|
return JSON.parseObject(jsonStr, new TypeReference<List<String>>(){}); |
||||||
|
} |
||||||
|
|
||||||
|
public static List<Integer> toIntegerList(String jsonStr){ |
||||||
|
return JSON.parseObject(jsonStr, new TypeReference<List<Integer>>(){}); |
||||||
|
} |
||||||
|
|
||||||
|
public static<T> List<T> toEntityList(Class<T> clazz, String jsonStr){ |
||||||
|
return JSON.parseArray(jsonStr, clazz); |
||||||
|
} |
||||||
|
|
||||||
|
public static<T> T toEntity(Class<T> clazz, String jsonStr){ |
||||||
|
return JSON.parseObject(jsonStr, clazz); |
||||||
|
} |
||||||
|
|
||||||
|
public static<T,E> Map<T, E> toEntiryMap(String jsonStr){ |
||||||
|
return JSON.parseObject(jsonStr, new TypeReference<Map<T, E>>(){}); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,159 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年6月10日 |
||||||
|
* |
||||||
|
* 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具 |
||||||
|
*/ |
||||||
|
public class LocationUtil { |
||||||
|
|
||||||
|
static int B_DIV_SCALE = 15; |
||||||
|
static BigDecimal x_pi = new BigDecimal("3.14159265358979324").multiply(new BigDecimal("3000")).divide(new BigDecimal("180"), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP); |
||||||
|
// π
|
||||||
|
static BigDecimal pi = new BigDecimal("3.1415926535897932384626"); |
||||||
|
// 长半轴
|
||||||
|
static BigDecimal a = new BigDecimal("6378245"); |
||||||
|
// 扁率
|
||||||
|
static BigDecimal ee = new BigDecimal("0.00669342162296594323"); |
||||||
|
static BigDecimal b_1 = new BigDecimal("-1"); |
||||||
|
static BigDecimal b_2 = new BigDecimal("10"); |
||||||
|
static BigDecimal b_3 = new BigDecimal("2"); |
||||||
|
static BigDecimal b_4 = new BigDecimal("105"); |
||||||
|
static BigDecimal b_5 = new BigDecimal("3"); |
||||||
|
static BigDecimal b_6 = new BigDecimal("35"); |
||||||
|
static BigDecimal b_7 = new BigDecimal("160"); |
||||||
|
static BigDecimal b_8 = new BigDecimal("1"); |
||||||
|
static BigDecimal b_9 = new BigDecimal("150"); |
||||||
|
static BigDecimal b_10 = new BigDecimal("180"); |
||||||
|
|
||||||
|
static BigDecimal b_11 = new BigDecimal("0.00002"); |
||||||
|
static BigDecimal b_12 = new BigDecimal("0.000003"); |
||||||
|
static BigDecimal b_13 = new BigDecimal("0.0065"); |
||||||
|
static BigDecimal b_14 = new BigDecimal("0.006"); |
||||||
|
|
||||||
|
/** |
||||||
|
* WGS坐标转百度坐标系(BD-09) |
||||||
|
* |
||||||
|
* @param lng WGS84坐标系的经度 |
||||||
|
* @param lat WGS84坐标系的纬度 |
||||||
|
* @return 百度坐标数组 |
||||||
|
*/ |
||||||
|
public static double[] wgs84tobd09(double lng, double lat) { |
||||||
|
double[] gcj = wgs84togcj02(lng, lat); |
||||||
|
double[] bd09 = gcj02tobd09(gcj[0], gcj[1]); |
||||||
|
return bd09; |
||||||
|
} |
||||||
|
public static String[] wgs84tobd09(String lng, String lat) { |
||||||
|
double lon = Double.parseDouble(lng); |
||||||
|
double lt = Double.parseDouble(lat); |
||||||
|
double[] arr = wgs84tobd09(lon, lt); |
||||||
|
return new String[] {arr[0] + "", arr[1] + ""}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 火星坐标系(GCJ-02)转百度坐标系(BD-09) |
||||||
|
* |
||||||
|
* @param lng 火星坐标经度 |
||||||
|
* @param lat 火星坐标纬度 |
||||||
|
* @return 百度坐标数组 |
||||||
|
* @see 谷歌、高德——>百度 |
||||||
|
*/ |
||||||
|
public static double[] gcj02tobd09(double lng, double lat) { |
||||||
|
BigDecimal b_lng = new BigDecimal(lng); |
||||||
|
BigDecimal b_lat = new BigDecimal(lat); |
||||||
|
BigDecimal z = new BigDecimal(Math.sqrt(b_lng.multiply(b_lng).add(b_lat.multiply(b_lat)).doubleValue())).add(b_11.multiply(new BigDecimal(Math.sin(b_lat.multiply(x_pi).doubleValue())))); |
||||||
|
BigDecimal theta = new BigDecimal(Math.atan2(b_lat.doubleValue(), b_lng.doubleValue())).add(b_12.multiply(new BigDecimal(Math.cos(b_lng.multiply(x_pi).doubleValue())))); |
||||||
|
BigDecimal bd_lng = z.multiply(new BigDecimal(Math.cos(theta.doubleValue()))).add(b_13); |
||||||
|
// z * Math.cos(theta) + 0.0065;
|
||||||
|
BigDecimal bd_lat = z.multiply(new BigDecimal(Math.sin(theta.doubleValue()))).add(b_14); |
||||||
|
return new double[]{bd_lng.doubleValue(), bd_lat.doubleValue()}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* WGS84转GCJ02(火星坐标系) |
||||||
|
* |
||||||
|
* @param lng WGS84坐标系的经度 |
||||||
|
* @param lat WGS84坐标系的纬度 |
||||||
|
* @return 火星坐标数组 |
||||||
|
*/ |
||||||
|
public static double[] wgs84togcj02(double lng, double lat) { |
||||||
|
BigDecimal b_lng = new BigDecimal(lng + ""); |
||||||
|
BigDecimal b_lat = new BigDecimal(lat + ""); |
||||||
|
if (out_of_china(b_lng, b_lat)) { |
||||||
|
return new double[]{b_lng.doubleValue(), b_lat.doubleValue()}; |
||||||
|
} |
||||||
|
BigDecimal dlat = transformlat(b_lng.subtract(b_4), b_lat.subtract(b_6)); |
||||||
|
BigDecimal dlng = transformlng(b_lng.subtract(b_4), b_lat.subtract(b_6)); |
||||||
|
BigDecimal radlat = b_lat.divide(b_10, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi); |
||||||
|
BigDecimal magic = new BigDecimal(Math.sin(radlat.doubleValue())); |
||||||
|
magic = b_8.subtract(ee.multiply(magic).multiply(magic)); |
||||||
|
BigDecimal sqrtmagic = new BigDecimal(Math.sqrt(magic.doubleValue())); |
||||||
|
dlat = (dlat.multiply(b_10)).divide((a.multiply(b_8.subtract(ee))).divide((magic.multiply(sqrtmagic)), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP); |
||||||
|
dlng = (dlng.multiply(b_10)).divide((a.divide(sqrtmagic, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(Math.cos(radlat.doubleValue())).multiply(pi))), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP); |
||||||
|
BigDecimal mglat = b_lat.add(dlat); |
||||||
|
BigDecimal mglng = b_lng.add(dlng); |
||||||
|
return new double[]{mglng.doubleValue(), mglat.doubleValue()}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 纬度转换 |
||||||
|
* |
||||||
|
* @param lng |
||||||
|
* @param lat |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private static BigDecimal transformlat(BigDecimal lng, BigDecimal lat) { |
||||||
|
BigDecimal bet = b_1.multiply(b_2).multiply(b_2) |
||||||
|
.add(b_3.multiply(lng)) |
||||||
|
.add(b_5.multiply(lat)) |
||||||
|
.add(b_3.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(lat).multiply(lat)) |
||||||
|
.add(b_8.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(lng).multiply(lat)) |
||||||
|
.add(b_3.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(Math.sqrt(Math.abs(lng.doubleValue()))))); |
||||||
|
bet = bet.add((b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(b_3.multiply(b_5).multiply(lng).multiply(pi).doubleValue()))) |
||||||
|
.add(b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(b_3.multiply(lng).multiply(pi).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP)); |
||||||
|
bet = bet.add((b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(lat.multiply(pi).doubleValue()))) |
||||||
|
.add(b_3.multiply(b_3).multiply(b_2).multiply(new BigDecimal(Math.sin(lat.divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP)); |
||||||
|
bet = bet.add((b_7.multiply(new BigDecimal(Math.sin(lat.divide(b_5.multiply(b_3).multiply(b_3), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue()))) |
||||||
|
.add(b_7.multiply(b_3).multiply(new BigDecimal(Math.sin(lat.multiply(pi).divide(b_5.multiply(b_2), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP)); |
||||||
|
return bet; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 经度转换 |
||||||
|
* |
||||||
|
* @param lng |
||||||
|
* @param lat |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private static BigDecimal transformlng(BigDecimal lng, BigDecimal lat) { |
||||||
|
BigDecimal bet = b_2.multiply(b_2).multiply(b_5).add(lng).add(b_3.multiply(lat)).add(b_8.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(lng).multiply(lng)) |
||||||
|
.add(b_8.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(lng).multiply(lat)).add(b_8.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(Math.sqrt(Math.abs(lng.doubleValue()))))); |
||||||
|
bet = bet.add((b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(b_3.multiply(b_5).multiply(lng).multiply(pi).doubleValue()))) |
||||||
|
.add(b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(b_3.multiply(lng).multiply(pi).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP)); |
||||||
|
bet = bet.add((b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(lng.multiply(pi).doubleValue()))) |
||||||
|
.add(b_3.multiply(b_3).multiply(b_2).multiply(new BigDecimal(Math.sin(lng.divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP)); |
||||||
|
bet = bet.add((b_9.multiply(new BigDecimal(Math.sin(lng.divide(b_3.multiply(b_3).multiply(b_5), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue()))) |
||||||
|
.add(b_9.multiply(b_3).multiply(new BigDecimal(Math.sin(lng.divide(b_5.multiply(b_2), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue())))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP))); |
||||||
|
return bet; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断是否在国内,不在国内不做偏移 |
||||||
|
* |
||||||
|
* @param lng |
||||||
|
* @param lat |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private static boolean out_of_china(BigDecimal lng, BigDecimal lat) { |
||||||
|
if (lng.compareTo(new BigDecimal("73.66")) < 0 || lng.compareTo(new BigDecimal("135.05")) > 0) { |
||||||
|
return true; |
||||||
|
} else if (lat.compareTo(new BigDecimal("3.86")) < 0 || lat.compareTo(new BigDecimal("53.55")) > 0) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月27日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class MsgUtil { |
||||||
|
|
||||||
|
private MsgUtil(){ |
||||||
|
//Add a private constructor to hide the implicit public one.
|
||||||
|
} |
||||||
|
|
||||||
|
public static String sendMessageCode(String phoneNum) throws CoreException{ |
||||||
|
return StringUtil.getStringNum(6); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,290 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.security.Key; |
||||||
|
import java.security.KeyFactory; |
||||||
|
import java.security.KeyPair; |
||||||
|
import java.security.KeyPairGenerator; |
||||||
|
import java.security.NoSuchAlgorithmException; |
||||||
|
import java.security.PrivateKey; |
||||||
|
import java.security.PublicKey; |
||||||
|
import java.security.Signature; |
||||||
|
import java.security.interfaces.RSAPrivateKey; |
||||||
|
import java.security.interfaces.RSAPublicKey; |
||||||
|
import java.security.spec.PKCS8EncodedKeySpec; |
||||||
|
import java.security.spec.X509EncodedKeySpec; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import javax.crypto.Cipher; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年6月10日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
public class RSAUtil { |
||||||
|
/** |
||||||
|
* 定义加密方式 |
||||||
|
*/ |
||||||
|
private final static String KEY_RSA = "RSA"; |
||||||
|
/** |
||||||
|
* 定义签名算法 |
||||||
|
*/ |
||||||
|
private final static String KEY_RSA_SIGNATURE = "MD5withRSA"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 定义公钥算法 |
||||||
|
*/ |
||||||
|
private final static String KEY_RSA_PUBLICKEY = "RSAPublicKey"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 定义私钥算法 |
||||||
|
*/ |
||||||
|
private final static String KEY_RSA_PRIVATEKEY = "RSAPrivateKey"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 用私钥对信息生成数字签名 |
||||||
|
* @param data 加密数据 |
||||||
|
* @param privateKey 私钥 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String sign(byte[] data, String privateKey) { |
||||||
|
String str = ""; |
||||||
|
try { |
||||||
|
//转码16进制字符串
|
||||||
|
byte[] bytes = StringToByteKey(privateKey); |
||||||
|
// 构造PKCS8EncodedKeySpec对象
|
||||||
|
X509EncodedKeySpec pkcs = new X509EncodedKeySpec(bytes); |
||||||
|
// 指定的加密算法
|
||||||
|
KeyFactory factory = KeyFactory.getInstance(KEY_RSA); |
||||||
|
// 取私钥对象
|
||||||
|
PrivateKey key = factory.generatePrivate(pkcs); |
||||||
|
// 用私钥对信息生成数字签名
|
||||||
|
Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE); |
||||||
|
signature.initSign(key); |
||||||
|
signature.update(data); |
||||||
|
str = byteToStringKey(signature.sign()); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("Sign failed", e); |
||||||
|
} |
||||||
|
return str; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 校验数字签名 |
||||||
|
* @param data 加密数据 |
||||||
|
* @param publicKey 公钥 |
||||||
|
* @param sign 数字签名 |
||||||
|
* @return 校验成功返回true,失败返回false |
||||||
|
*/ |
||||||
|
public static boolean verify(byte[] data, String publicKey, String sign) { |
||||||
|
boolean flag = false; |
||||||
|
try { |
||||||
|
// 解密由base64编码的公钥
|
||||||
|
byte[] bytes = StringToByteKey(publicKey); |
||||||
|
// 构造X509EncodedKeySpec对象
|
||||||
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); |
||||||
|
// 指定的加密算法
|
||||||
|
KeyFactory factory = KeyFactory.getInstance(KEY_RSA); |
||||||
|
// 取公钥对象
|
||||||
|
PublicKey key = factory.generatePublic(keySpec); |
||||||
|
// 用公钥验证数字签名
|
||||||
|
Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE); |
||||||
|
signature.initVerify(key); |
||||||
|
signature.update(data); |
||||||
|
flag = signature.verify(StringToByteKey(sign)); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("Verify failed", e); |
||||||
|
} |
||||||
|
return flag; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 公钥解密 |
||||||
|
* @param data 加密数据 |
||||||
|
* @param key 公钥 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String decryptByPublicKey(String data, String key) { |
||||||
|
try { |
||||||
|
//解码公钥
|
||||||
|
byte[] pubKey = Base64Util.decode(key); |
||||||
|
// 取得公钥
|
||||||
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKey); |
||||||
|
KeyFactory factory = KeyFactory.getInstance(KEY_RSA); |
||||||
|
PublicKey publicKey = factory.generatePublic(keySpec); |
||||||
|
// 对数据解密
|
||||||
|
Cipher cipher = Cipher.getInstance(factory.getAlgorithm()); |
||||||
|
cipher.init(Cipher.DECRYPT_MODE, publicKey); |
||||||
|
byte[] result = cipher.doFinal(Base64Util.decode(data)); |
||||||
|
if(result != null) { |
||||||
|
return new String(result); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("decryptByPublicKey fail-",e); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 公钥加密 |
||||||
|
* @param data 待加密数据 |
||||||
|
* @param key 公钥 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String encryptByPublicKey(String data, String key) { |
||||||
|
try { |
||||||
|
byte[] pubKey = Base64Util.decode(key); |
||||||
|
// 取得公钥
|
||||||
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKey); |
||||||
|
KeyFactory factory = KeyFactory.getInstance(KEY_RSA); |
||||||
|
PublicKey publicKey = factory.generatePublic(keySpec); |
||||||
|
// 对数据加密
|
||||||
|
Cipher cipher = Cipher.getInstance(factory.getAlgorithm()); |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey); |
||||||
|
byte[] result = cipher.doFinal(data.getBytes()); |
||||||
|
if(result != null) { |
||||||
|
return Base64Util.encode(result); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("encryptByPublicKey failed-",e); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 私钥解密 |
||||||
|
* @param data 加密数据 |
||||||
|
* @param key 私钥 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static byte[] decryptByPrivateKey(byte[] data, String key) { |
||||||
|
byte[] result = null; |
||||||
|
try { |
||||||
|
// 对私钥解密
|
||||||
|
byte[] bytes = StringToByteKey(key); |
||||||
|
// 取得私钥
|
||||||
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); |
||||||
|
KeyFactory factory = KeyFactory.getInstance(KEY_RSA); |
||||||
|
PrivateKey privateKey = factory.generatePrivate(keySpec); |
||||||
|
// 对数据解密
|
||||||
|
Cipher cipher = Cipher.getInstance(factory.getAlgorithm()); |
||||||
|
cipher.init(Cipher.DECRYPT_MODE, privateKey); |
||||||
|
result = cipher.doFinal(data); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("decryptByPrivateKey failed", e); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 私钥加密 |
||||||
|
* @param data 待加密数据 |
||||||
|
* @param key 私钥 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static byte[] encryptByPrivateKey(byte[] data, String key) { |
||||||
|
byte[] result = null; |
||||||
|
try { |
||||||
|
byte[] bytes = StringToByteKey(key); |
||||||
|
// 取得私钥
|
||||||
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); |
||||||
|
KeyFactory factory = KeyFactory.getInstance(KEY_RSA); |
||||||
|
PrivateKey privateKey = factory.generatePrivate(keySpec); |
||||||
|
// 对数据加密
|
||||||
|
Cipher cipher = Cipher.getInstance(factory.getAlgorithm()); |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, privateKey); |
||||||
|
result = cipher.doFinal(data); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("encryptByPrivateKey failed", e); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 初始化密钥 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static Map<String, Object> init() { |
||||||
|
Map<String, Object> map = null; |
||||||
|
try { |
||||||
|
KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_RSA); |
||||||
|
generator.initialize(1024); |
||||||
|
KeyPair keyPair = generator.generateKeyPair(); |
||||||
|
// 公钥
|
||||||
|
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); |
||||||
|
// 私钥
|
||||||
|
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); |
||||||
|
// 将密钥封装为map
|
||||||
|
map = new HashMap<>(); |
||||||
|
map.put(KEY_RSA_PUBLICKEY, publicKey); |
||||||
|
map.put(KEY_RSA_PRIVATEKEY, privateKey); |
||||||
|
} catch (NoSuchAlgorithmException e) { |
||||||
|
log.error("Exception occurred!", e); |
||||||
|
} |
||||||
|
return map; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取公钥 |
||||||
|
* @param map |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getPublicKey(Map<String, Object> map) { |
||||||
|
String str = ""; |
||||||
|
try { |
||||||
|
Key key = (Key) map.get(KEY_RSA_PUBLICKEY); |
||||||
|
str = byteToStringKey(key.getEncoded()); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("getPublicKey failed", e); |
||||||
|
} |
||||||
|
return str; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取私钥 |
||||||
|
* @param map |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getPrivateKey(Map<String, Object> map) { |
||||||
|
String str = ""; |
||||||
|
try { |
||||||
|
Key key = (Key) map.get(KEY_RSA_PRIVATEKEY); |
||||||
|
str = byteToStringKey(key.getEncoded()); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("getPrivateKey failed", e); |
||||||
|
} |
||||||
|
return str; |
||||||
|
} |
||||||
|
|
||||||
|
public static String byteToStringKey(byte[] key) { |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
for (int i = 0; i < key.length; i++) { |
||||||
|
if ((key[i] & 0xff) < 0x10) { |
||||||
|
sb.append("0"); |
||||||
|
} |
||||||
|
sb.append(Integer.toHexString(0xFF & key[i])); |
||||||
|
} |
||||||
|
return sb.toString().toUpperCase(); |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] StringToByteKey(String key) { |
||||||
|
key = key.toUpperCase(); |
||||||
|
byte[] arr = new byte[key.length() / 2]; |
||||||
|
int k = 0; |
||||||
|
for (int i = 0; i < arr.length; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
|
||||||
|
byte high = (byte) (Character.digit(key.charAt(k), 16) & 0xff); |
||||||
|
byte low = (byte) (Character.digit(key.charAt(k + 1), 16) & 0xff); |
||||||
|
arr[i] = (byte) (high << 4 | low); |
||||||
|
k += 2; |
||||||
|
} |
||||||
|
return arr; |
||||||
|
} |
||||||
|
|
||||||
|
private RSAUtil(){ |
||||||
|
//Do nothing.
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,81 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.io.BufferedReader; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.golbal.GlobalConstant; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** |
||||||
|
* Ownership belongs to the company author:mengyxu date:2021年1月20日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
public class ShellUtil { |
||||||
|
public static final boolean IS_LINUX; |
||||||
|
|
||||||
|
static { |
||||||
|
IS_LINUX = "linux".equals(System.getProperty("os.name").toLowerCase()); |
||||||
|
} |
||||||
|
|
||||||
|
public static int executeShellCmd(String cmd) throws CoreException { |
||||||
|
try { |
||||||
|
log.info("ShellUtil runtime exec commond----------------->" + cmd); |
||||||
|
Process process = null; |
||||||
|
if(IS_LINUX) { |
||||||
|
process = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd}); |
||||||
|
}else { |
||||||
|
process = Runtime.getRuntime().exec(cmd); |
||||||
|
} |
||||||
|
|
||||||
|
if (process != null) { |
||||||
|
final InputStream input = process.getInputStream(); |
||||||
|
logInputStream(cmd, input); |
||||||
|
|
||||||
|
process.waitFor(); |
||||||
|
log.info("process result:" + process.exitValue());// 0代表成功,其他代表失败,返回未终止的子进程的数量
|
||||||
|
process.destroy(); |
||||||
|
return process.exitValue(); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("Execute shell error log", e); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
// end
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* In order to log input stream |
||||||
|
* |
||||||
|
* @param in |
||||||
|
* @throws UnsupportedEncodingException |
||||||
|
*/ |
||||||
|
public static void logInputStream(String shells, InputStream in) throws UnsupportedEncodingException { |
||||||
|
|
||||||
|
StringBuilder builder = new StringBuilder(); |
||||||
|
builder.append("Shell [").append(shells).append(" return log: "); |
||||||
|
String str = null; |
||||||
|
try (final BufferedReader inBr = new BufferedReader(new InputStreamReader(in, GlobalConstant.ENCODING_UTF8));) { |
||||||
|
while ((str = inBr.readLine()) != null) { |
||||||
|
builder.append(str); |
||||||
|
builder.append("\n"); |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("Read log inputstream failed!", e); |
||||||
|
} |
||||||
|
|
||||||
|
// Log to file.
|
||||||
|
log.info(builder.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
private ShellUtil() { |
||||||
|
// Not allow to create instance.
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import org.springframework.beans.BeansException; |
||||||
|
import org.springframework.context.ApplicationContext; |
||||||
|
import org.springframework.context.ApplicationContextAware; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月26日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Component(value="springContextUtil") |
||||||
|
public class SpringContextUtil implements ApplicationContextAware{ |
||||||
|
private static ApplicationContext appContext; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setApplicationContext(ApplicationContext context) |
||||||
|
throws BeansException { |
||||||
|
SpringContextUtil.appContext = context; |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public static <T> T getBeanByName(String beanName){ |
||||||
|
if(beanName == null){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
return (T) appContext.getBean(beanName); |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> T getBeanByClass(Class<T> clazz){ |
||||||
|
if(clazz == null){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
return (T) appContext.getBean(clazz); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,406 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
import java.security.MessageDigest; |
||||||
|
import java.security.NoSuchAlgorithmException; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Random; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月26日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class StringUtil { |
||||||
|
private static final char[] HEX_DIGITS_L = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', |
||||||
|
'c', 'd', 'e', 'f' }; |
||||||
|
private static final char[] HEX_DIGITS_U = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', |
||||||
|
'C', 'D', 'E', 'F' }; |
||||||
|
private static final String DEFAULT_ENCODING = "UTF-8"; |
||||||
|
public static final String EMPTY_STRING = ""; |
||||||
|
private static final String ARGUMENT_PREFIX = "{"; |
||||||
|
private static final String ARGUMENT_SUFFIX = "}"; |
||||||
|
private static final Pattern COMPRESS_PATTERN = Pattern.compile("(\\r|\\n|\\r\\n)\\s*"); |
||||||
|
|
||||||
|
private StringUtil() { |
||||||
|
// Add a private constructor to hide the implicit public one.
|
||||||
|
} |
||||||
|
|
||||||
|
public static String compress(String src) { |
||||||
|
return COMPRESS_PATTERN.matcher(src).replaceAll(EMPTY_STRING); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Concatenate all the parameters to one string. |
||||||
|
* |
||||||
|
* @param src |
||||||
|
* @param args -- random length parameters. |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String concate(String src, String... args) { |
||||||
|
StringBuilder builder = new StringBuilder().append(src); |
||||||
|
|
||||||
|
if (args != null) { |
||||||
|
for (String arg : args) { |
||||||
|
builder.append(arg); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return builder.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static String splice(String delimiter, String... args) { |
||||||
|
StringBuilder builder = new StringBuilder(); |
||||||
|
|
||||||
|
if (args != null) { |
||||||
|
for (String arg : args) { |
||||||
|
builder.append(arg == null ? "" : arg).append(delimiter); |
||||||
|
} |
||||||
|
} |
||||||
|
String s = builder.toString(); |
||||||
|
return s.substring(0, s.lastIndexOf(delimiter)); |
||||||
|
} |
||||||
|
|
||||||
|
public static String toString(String[] array) { |
||||||
|
if (array == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
StringBuilder builder = new StringBuilder(); |
||||||
|
|
||||||
|
builder.append("{"); |
||||||
|
for (String element : array) { |
||||||
|
builder.append("'").append(element).append("',"); |
||||||
|
} |
||||||
|
|
||||||
|
builder.deleteCharAt(builder.length() - 1).append("}"); |
||||||
|
|
||||||
|
return builder.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isEmpty(String value) { |
||||||
|
return value == null || value.trim().isEmpty(); |
||||||
|
} |
||||||
|
|
||||||
|
public static String md5(String src, boolean lowercase) throws CoreException { |
||||||
|
return md5(src, null, lowercase); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 32位小写 MD5 编码 |
||||||
|
* |
||||||
|
* @param s |
||||||
|
* @param encoding |
||||||
|
* @return |
||||||
|
* @throws RrsException |
||||||
|
*/ |
||||||
|
public static String md5(String s, String expectedEncoding, boolean lowercase) throws CoreException { |
||||||
|
String encoding = DEFAULT_ENCODING; |
||||||
|
|
||||||
|
if (expectedEncoding != null) { |
||||||
|
encoding = expectedEncoding; |
||||||
|
} |
||||||
|
|
||||||
|
// 用来将字节转换成 16 进制表示的字符
|
||||||
|
char[] hexDigits; |
||||||
|
if (lowercase) { |
||||||
|
hexDigits = HEX_DIGITS_L; |
||||||
|
} else { |
||||||
|
hexDigits = HEX_DIGITS_U; |
||||||
|
} |
||||||
|
|
||||||
|
String result = null; |
||||||
|
|
||||||
|
if (s != null) { |
||||||
|
try { |
||||||
|
// 返回实现指定摘要算法的 MessageDigest 对象
|
||||||
|
MessageDigest md = MessageDigest.getInstance("MD5"); |
||||||
|
|
||||||
|
// 使用encoding编码将originstr字符串编码并保存到source字节数组
|
||||||
|
byte[] source = s.getBytes(encoding); |
||||||
|
|
||||||
|
// 使用指定的 byte 数组更新摘要
|
||||||
|
md.update(source); |
||||||
|
|
||||||
|
// 通过执行诸如填充之类的最终操作完成哈希计算,结果是一个128位的长整数
|
||||||
|
byte[] tmp = md.digest(); |
||||||
|
|
||||||
|
// 用16进制数表示需要32位
|
||||||
|
char[] ss = new char[32]; |
||||||
|
|
||||||
|
for (int i = 0, j = 0; i < 16; i++) { |
||||||
|
// j表示转换结果中对应的字符位置
|
||||||
|
// 从第一个字节开始,对 MD5 的每一个字节
|
||||||
|
// 转换成 16 进制字符
|
||||||
|
byte b = tmp[i]; |
||||||
|
|
||||||
|
// 取字节中高 4 位的数字转换
|
||||||
|
// 无符号右移运算符>>> ,它总是在左边补0
|
||||||
|
// 0x代表它后面的是十六进制的数字. f转换成十进制就是15
|
||||||
|
ss[j++] = hexDigits[b >>> 4 & 0xf]; |
||||||
|
|
||||||
|
// 取字节中低 4 位的数字转换
|
||||||
|
ss[j++] = hexDigits[b & 0xf]; |
||||||
|
} |
||||||
|
result = new String(ss);// 结果转换成字符串用于返回
|
||||||
|
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { |
||||||
|
// 当请求特定的加密算法而它在该环境中不可用时抛出此异常
|
||||||
|
throw new CoreException("md5(String) - s=" + s, e); //$NON-NLS-1$
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public static String[] split(String s, String delimiter) { |
||||||
|
return split(s, delimiter, 10); |
||||||
|
} |
||||||
|
|
||||||
|
public static String[] split(String s, String delimiter, int initCapacity) { |
||||||
|
List<String> list = new ArrayList<>(initCapacity); |
||||||
|
|
||||||
|
int index = -1; |
||||||
|
int offset = 0; |
||||||
|
s = s.replace("\\N", ""); |
||||||
|
while ((index = s.indexOf(delimiter, index + 1)) != -1) { |
||||||
|
String ss = s.substring(offset, index); |
||||||
|
list.add(ss); |
||||||
|
offset = index + 1; |
||||||
|
} |
||||||
|
list.add(s.substring(offset)); |
||||||
|
|
||||||
|
return list.toArray(new String[0]); |
||||||
|
} |
||||||
|
|
||||||
|
public static String getStringNum(int length) { |
||||||
|
Random r = new Random(); |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
for (int i = 0; i < length; i++) { |
||||||
|
sb.append(r.nextInt(10)); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static String getStringHex(int length) { |
||||||
|
Random r = new Random(); |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
for (int i = 0; i < length; i++) { |
||||||
|
sb.append(HEX_DIGITS_L[r.nextInt(16)]); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Pack the reminding left space with filler and return a fixed length string. |
||||||
|
* Return itself if length of source string is larger or equals to the fixed |
||||||
|
* length. 左补齐 |
||||||
|
* |
||||||
|
* @param src |
||||||
|
* @param filler |
||||||
|
* @param totalLength |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String lpad(String src, String filler, int totalLength) { |
||||||
|
// Check length
|
||||||
|
int len = src.length(); |
||||||
|
|
||||||
|
// Return itself if larger or equals to the totalLength
|
||||||
|
if (len >= totalLength) { |
||||||
|
return src; |
||||||
|
} |
||||||
|
|
||||||
|
// To pack left space with filler.
|
||||||
|
StringBuilder builder = new StringBuilder(totalLength); |
||||||
|
for (int i = len; i < totalLength; i++) { |
||||||
|
builder.append(filler); |
||||||
|
} |
||||||
|
|
||||||
|
// fill the resource string and return it.
|
||||||
|
return builder.append(src).toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* Pack the reminding right space with filler and return a fixed length string. |
||||||
|
* Return itself if length of source string is larger or equals to the fixed |
||||||
|
* length. 右补齐 |
||||||
|
* |
||||||
|
* @param src |
||||||
|
* @param filler |
||||||
|
* @param totalLength |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String rpad(String src, String filler, int totalLength) { |
||||||
|
int len = src.length(); |
||||||
|
if (len >= totalLength) { |
||||||
|
return src; |
||||||
|
} |
||||||
|
StringBuilder builder = new StringBuilder(src); |
||||||
|
for (int i = len; i < totalLength; i++) { |
||||||
|
builder.append(filler); |
||||||
|
} |
||||||
|
return builder.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static String subString(String str, int length) { |
||||||
|
return str.substring(0, str.length() > length ? length : str.length()); |
||||||
|
} |
||||||
|
|
||||||
|
public static String subString(String str, int start, int length) { |
||||||
|
if (str == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
int len = str.length(); |
||||||
|
if (len <= start) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
if (len < start + length) { |
||||||
|
return str.substring(start, len - 1); |
||||||
|
} |
||||||
|
return str.substring(start, start + length); |
||||||
|
} |
||||||
|
|
||||||
|
public static String right(String str, int length) { |
||||||
|
if (str == null) { |
||||||
|
return str; |
||||||
|
} |
||||||
|
int len = str.length(); |
||||||
|
if (len <= length) { |
||||||
|
return str; |
||||||
|
} |
||||||
|
return str.substring(len - length); |
||||||
|
} |
||||||
|
|
||||||
|
// 字符串转换unicode
|
||||||
|
public static String stringToUnicode(String string) { |
||||||
|
StringBuffer unicode = new StringBuffer(); |
||||||
|
for (int i = 0; i < string.length(); i++) { |
||||||
|
char c = string.charAt(i); // 取出每一个字符
|
||||||
|
unicode.append("\\u" + Integer.toHexString(c));// 转换为unicode
|
||||||
|
} |
||||||
|
return unicode.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
// unicode 转字符串
|
||||||
|
public static String unicodeToString(String unicode) { |
||||||
|
StringBuffer string = new StringBuffer(); |
||||||
|
String[] hex = unicode.split("\\\\u"); |
||||||
|
for (int i = 1; i < hex.length; i++) { |
||||||
|
int data = Integer.parseInt(hex[i], 16);// 转换出每一个代码点
|
||||||
|
string.append((char) data);// 追加成string
|
||||||
|
} |
||||||
|
return string.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Inject the arguments into a string and return. |
||||||
|
* |
||||||
|
* @param src |
||||||
|
* @param args |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String injectJsonStringArgument(String src, String... args) { |
||||||
|
StringBuilder builder = new StringBuilder(); |
||||||
|
|
||||||
|
int start = 0; |
||||||
|
int end = 0; |
||||||
|
int i = 0; |
||||||
|
while ((start = src.indexOf(ARGUMENT_PREFIX + i + ARGUMENT_SUFFIX, end)) >= 0) { |
||||||
|
builder.append(src.substring(end, start)); |
||||||
|
|
||||||
|
end = src.indexOf(ARGUMENT_SUFFIX, start); |
||||||
|
|
||||||
|
if (end > start) { |
||||||
|
int index = Integer.valueOf(src.substring(start + 1, end)); |
||||||
|
builder.append(args[index]); |
||||||
|
|
||||||
|
// Move to next
|
||||||
|
end += 1; |
||||||
|
} else { |
||||||
|
break; |
||||||
|
} |
||||||
|
i++; |
||||||
|
} |
||||||
|
|
||||||
|
builder.append(src.substring(end)); |
||||||
|
|
||||||
|
return builder.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isNumeric(String value) { |
||||||
|
return isInteger(value) || isDouble(value); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isInteger(String value) { |
||||||
|
try { |
||||||
|
Integer.parseInt(value); |
||||||
|
return true; |
||||||
|
} catch (NumberFormatException e) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isDouble(String value) { |
||||||
|
boolean flag = false; |
||||||
|
|
||||||
|
try { |
||||||
|
if (value.contains(".")) { |
||||||
|
flag = Double.isNaN(Double.parseDouble(value)); |
||||||
|
} |
||||||
|
} catch (NumberFormatException e) { |
||||||
|
flag = false; |
||||||
|
} |
||||||
|
|
||||||
|
return flag; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean equals(String src, String dest) { |
||||||
|
if (src == null && dest == null) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return src != null && src.equals(dest); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isEmpty(String... values) { |
||||||
|
for (String value : values) { |
||||||
|
if (isEmpty(value)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isAllEmpty(String... values) { |
||||||
|
for (String value : values) { |
||||||
|
if (!isEmpty(value)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public static int length(String str) { |
||||||
|
if (isEmpty(str)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return str.length(); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isBlank(final CharSequence cs) { |
||||||
|
int strLen; |
||||||
|
if (cs == null || (strLen = cs.length()) == 0) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
for (int i = 0; i < strLen; i++) { |
||||||
|
if (!Character.isWhitespace(cs.charAt(i))) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,137 @@ |
|||||||
|
package com.mengyxu.core.utils; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.dom4j.Attribute; |
||||||
|
import org.dom4j.Document; |
||||||
|
import org.dom4j.DocumentException; |
||||||
|
import org.dom4j.Element; |
||||||
|
import org.dom4j.io.SAXReader; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.special.XmlTag; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年6月28日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class XmlUtil { |
||||||
|
private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; |
||||||
|
private static final String SEPARATOR = System.getProperty("line.separator"); |
||||||
|
|
||||||
|
public static XmlTag readFileAsTag(File file) throws CoreException{ |
||||||
|
SAXReader reader = new SAXReader(); |
||||||
|
Document document; |
||||||
|
try { |
||||||
|
document = reader.read(file); |
||||||
|
Element node = document.getRootElement(); |
||||||
|
return parsToTag(node); |
||||||
|
} catch (DocumentException e) { |
||||||
|
throw new CoreException("解析XML文件失败"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static XmlTag parsToTag(Element node) { |
||||||
|
XmlTag tag = new XmlTag(); |
||||||
|
tag.setName(node.getName()); |
||||||
|
List<Attribute> list = node.attributes(); |
||||||
|
if (list != null && !list.isEmpty()) { |
||||||
|
Map<String, String> attrs = new HashMap<>(); |
||||||
|
for (Attribute attr : list) { |
||||||
|
attrs.put(attr.getName(), attr.getValue()); |
||||||
|
} |
||||||
|
tag.setAttrs(attrs); |
||||||
|
} |
||||||
|
Iterator<Element> iter = node.elementIterator(); |
||||||
|
if(iter.hasNext()) { |
||||||
|
List<XmlTag> nodes = new ArrayList<>(); |
||||||
|
while (iter.hasNext()){ |
||||||
|
nodes.add(parsToTag(iter.next())); |
||||||
|
} |
||||||
|
tag.setNodes(nodes); |
||||||
|
}else { |
||||||
|
tag.setValue(node.getStringValue()); |
||||||
|
} |
||||||
|
return tag; |
||||||
|
} |
||||||
|
|
||||||
|
public static String formatTagAsXml(XmlTag tag) { |
||||||
|
return XML_HEADER + toXml(tag, 0); |
||||||
|
} |
||||||
|
|
||||||
|
private static String toXml(XmlTag tag, int idx) { |
||||||
|
StringBuffer sb = new StringBuffer(); |
||||||
|
apendTab(idx, sb); |
||||||
|
sb.append("<").append(tag.getName()); |
||||||
|
Map<String, String> attrs = tag.getAttrs(); |
||||||
|
String flag = null; |
||||||
|
if(attrs != null && !attrs.isEmpty()) { |
||||||
|
for (String key : attrs.keySet()) { |
||||||
|
String val = attrs.get(key); |
||||||
|
if(key.equals("type")) { |
||||||
|
flag = val; |
||||||
|
} |
||||||
|
sb.append(" ").append(key).append("=\"") |
||||||
|
.append(val).append("\""); |
||||||
|
} |
||||||
|
} |
||||||
|
sb.append(">"); |
||||||
|
List<XmlTag> nodes = tag.getNodes(); |
||||||
|
if(nodes != null && !nodes.isEmpty()) { |
||||||
|
for (XmlTag node : nodes) { |
||||||
|
sb.append(toXml(node, idx+1)); |
||||||
|
} |
||||||
|
apendTab(idx, sb); |
||||||
|
}else { |
||||||
|
String value = tag.getValue(); |
||||||
|
if("isdn".equals(flag)) { |
||||||
|
sb.append(format("19" + value)); |
||||||
|
}else if("imsi".equals(flag)) { |
||||||
|
sb.append(format(value)); |
||||||
|
}else { |
||||||
|
sb.append(value); |
||||||
|
} |
||||||
|
} |
||||||
|
sb.append("</").append(tag.getName()).append(">"); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
private static void apendTab(int idx, StringBuffer sb) { |
||||||
|
sb.append(SEPARATOR); |
||||||
|
for (int i = 0; i < idx; i++) { |
||||||
|
sb.append(" "); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static String format(String str) { |
||||||
|
int len = str.length(); |
||||||
|
if(len%2 != 0) { |
||||||
|
str += "F"; |
||||||
|
} |
||||||
|
StringBuffer sb = new StringBuffer(); |
||||||
|
for (int i = 0; i < str.length()/2; i++) { |
||||||
|
sb.append(str.charAt(i*2+1)).append(str.charAt(i*2)).append(" "); |
||||||
|
} |
||||||
|
return sb.substring(0, sb.length()-1); |
||||||
|
} |
||||||
|
|
||||||
|
public static String parse(String str) { |
||||||
|
if(StringUtil.isEmpty(str)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
str = str.trim().replace(" ", ""); |
||||||
|
StringBuffer sb = new StringBuffer(); |
||||||
|
for (int i = 0; i < str.length()/2; i++) { |
||||||
|
sb.append(str.charAt(i*2+1)).append(str.charAt(i*2)); |
||||||
|
} |
||||||
|
return sb.substring(0, sb.length()-1).replace("F", ""); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.mengyxu.core.test; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.utils.Base64Util; |
||||||
|
import com.mengyxu.core.utils.RSAUtil; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年6月26日 |
||||||
|
*/ |
||||||
|
public class Base64Tester { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void decode() throws CoreException { |
||||||
|
String s = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A"; |
||||||
|
byte[] b = Base64Util.decode(s); |
||||||
|
System.out.println(RSAUtil.byteToStringKey(b)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package com.mengyxu.core.test; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import com.mengyxu.core.utils.LocationUtil; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年7月9日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class LocationUtilTester { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void test1() { |
||||||
|
long start = System.currentTimeMillis(); |
||||||
|
String x = "114.06444999999997"; |
||||||
|
String y = "22.507108"; |
||||||
|
String[] arr = LocationUtil.wgs84tobd09(x, y); |
||||||
|
System.out.println(Arrays.toString(arr)); |
||||||
|
System.out.println(System.currentTimeMillis() - start); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void test2() { |
||||||
|
long start = System.currentTimeMillis(); |
||||||
|
String x = "120"; |
||||||
|
String y = "24"; |
||||||
|
String[] arr = LocationUtil.wgs84tobd09(x, y); |
||||||
|
System.out.println(Arrays.toString(arr)); |
||||||
|
System.out.println(System.currentTimeMillis() - start); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,137 @@ |
|||||||
|
package com.mengyxu.core.test; |
||||||
|
|
||||||
|
import java.io.BufferedReader; |
||||||
|
import java.io.File; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.FileReader; |
||||||
|
import java.io.IOException; |
||||||
|
import java.math.BigInteger; |
||||||
|
import java.security.KeyFactory; |
||||||
|
import java.security.PublicKey; |
||||||
|
import java.security.spec.RSAPublicKeySpec; |
||||||
|
import java.security.spec.X509EncodedKeySpec; |
||||||
|
|
||||||
|
import javax.crypto.Cipher; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.utils.Base64Util; |
||||||
|
import com.mengyxu.core.utils.RSAUtil; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年6月11日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class RSAUtilTester { |
||||||
|
public static final String a = "138128429165014960214288316246915564109957848967973935739058724552651480736930647934382755460619033465620384391387196627089864034424350665139841418169631846827850418205510584071030219835341930960684577738773846628024223162766742868530563861053134130417499539521288428945157726371402147367583657263208271059771"; |
||||||
|
|
||||||
|
//字符串进行加密填充的名称
|
||||||
|
public static final String PADDING = "RSA/NONE/NoPadding"; |
||||||
|
//字符串持有安全提供者的名称
|
||||||
|
public static final String PROVIDER = "BC"; |
||||||
|
|
||||||
|
@Test |
||||||
|
public void stringToByteKey() throws CoreException { |
||||||
|
String key = "0008000001000100BEC07F26C1D87D7E022D3E82A4F8A0E83E2079206D728EFF0123194DFD6627655ACA16FA16EB076A09B85902E19727B1D8CCE91F998DD5EFB5D26CCE9B4BB1A0D2708B59EFA1217305BA8838960B1862198F2847C0182D5CA8F38D95949A3AD07E576713405C82DB06F89744D80660D562C8B13BE56E048DA0EC7934550653B6AFA2BB7ACDD893E595303E826AAE62095FD8280304BF5EE00DDE4DB3D5D20BFBEFA6C7D527D87E1F6BEA415E143F400A79AC1F24077AC205E433C730977AAC85A4BA2138AAA4B64C95AE14357204A6A6F708DF60290A94358358AF416EFB97E585EBC368E0F6BB189B0368861E1F8D1C62D53A9CF4A2BC4308883B87455FF72F"; |
||||||
|
byte[] arr = RSAUtil.StringToByteKey(key); |
||||||
|
for (byte b : arr) { |
||||||
|
System.out.println(b); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void byteToStringKey() throws IOException { |
||||||
|
File file = new File("D:/pubkey.Rsapub"); |
||||||
|
FileInputStream fis = new FileInputStream(file); |
||||||
|
byte[] arr = new byte[fis.available()]; |
||||||
|
fis.read(arr); |
||||||
|
fis.close(); |
||||||
|
String key = RSAUtil.byteToStringKey(arr); |
||||||
|
System.out.println(key); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void encryptByPublicKey() throws IOException { |
||||||
|
String key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvsB/JsHYfX4CLT6CpPig6D4geSBtco7/ASMZTf1mJ2Vayhb6FusHagm4WQLhlyex2MzpH5mN1e+10mzOm0uxoNJwi1nvoSFzBbqIOJYLGGIZjyhHwBgtXKjzjZWUmjrQfldnE0BcgtsG+JdE2AZg1WLIsTvlbgSNoOx5NFUGU7avort6zdiT5ZUwPoJqrmIJX9goAwS/XuAN3k2z1dIL+++mx9Un2H4fa+pBXhQ/QAp5rB8kB3rCBeQzxzCXeqyFpLohOKqktkyVrhQ1cgSmpvcI32ApCpQ1g1ivQW77l+WF68No4Pa7GJsDaIYeH40cYtU6nPSivEMIiDuHRV/3LwIDAQAB"; |
||||||
|
String data = "123456789"; |
||||||
|
String result = RSAUtil.encryptByPublicKey(data, key); |
||||||
|
System.out.println(result); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void dcryptByPublicKey() throws IOException { |
||||||
|
String key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvsB/JsHYfX4CLT6CpPig6D4geSBtco7/ASMZTf1mJ2Vayhb6FusHagm4WQLhlyex2MzpH5mN1e+10mzOm0uxoNJwi1nvoSFzBbqIOJYLGGIZjyhHwBgtXKjzjZWUmjrQfldnE0BcgtsG+JdE2AZg1WLIsTvlbgSNoOx5NFUGU7avort6zdiT5ZUwPoJqrmIJX9goAwS/XuAN3k2z1dIL+++mx9Un2H4fa+pBXhQ/QAp5rB8kB3rCBeQzxzCXeqyFpLohOKqktkyVrhQ1cgSmpvcI32ApCpQ1g1ivQW77l+WF68No4Pa7GJsDaIYeH40cYtU6nPSivEMIiDuHRV/3LwIDAQAB"; |
||||||
|
String data = "rBmtPB1ip3Z9nEaUHt2PCaC47CLD/N+SU3CQSMYUSlujTzzw2pJorSXQiRo3nm3gmQjQiPC0JWjhyRzXw1D1TDHr0aRlFv3GuvO2YUkWivxGh4bPArOT7VLEzerjWJ4N9fqPlGi9ZgMbEDhhiONBJ9ipX8t+w2ymTPpcngHRUZQM2vNk/CMgh1F5caYqsqW28XmI5unL3FYGR0U8GK6XfQs/O8doLxXHZ1XSCymjTOMeZ8uhkY/I66pGFS5wjz+m0ZqjcTDwE9UHYGPVNfIx3sgHZ8YyIr/kYxC94dGXp19sTIQBp14QK0pwD6m7xPIQcMOsoZsCVKbqJF/CCjdfgg=="; |
||||||
|
String result = RSAUtil.decryptByPublicKey(data, key); |
||||||
|
System.out.println(result); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void encryptByPublicKey1() throws Exception { |
||||||
|
|
||||||
|
File file = new File("D:/pubkey.der"); |
||||||
|
FileInputStream fis = new FileInputStream(file); |
||||||
|
byte[] arr = new byte[fis.available()]; |
||||||
|
System.out.println(arr.length); |
||||||
|
fis.read(arr); |
||||||
|
fis.close(); |
||||||
|
byte[] arr1 = new byte[4]; |
||||||
|
byte[] arr2 = new byte[256]; |
||||||
|
for (int i = 0; i < 4; i++) { |
||||||
|
arr1[i] = arr[7-i]; |
||||||
|
} |
||||||
|
for (int i = 0; i < 256; i++) { |
||||||
|
arr2[i] = arr[i+8]; |
||||||
|
} |
||||||
|
String data = "123456789"; |
||||||
|
KeyFactory kf = KeyFactory.getInstance("RSA"); |
||||||
|
BigInteger modulus = new BigInteger(arr1); |
||||||
|
BigInteger publicExponent = new BigInteger(arr2).abs(); |
||||||
|
System.out.println(modulus); |
||||||
|
System.out.println(publicExponent); |
||||||
|
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(publicExponent, modulus); |
||||||
|
// X509EncodedKeySpec keySpec = new X509EncodedKeySpec(arr);
|
||||||
|
PublicKey publicKey = kf.generatePublic(keySpec); |
||||||
|
Cipher cipher = Cipher.getInstance(kf.getAlgorithm()); |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey); |
||||||
|
byte[] result = cipher.doFinal(data.getBytes()); |
||||||
|
for (byte b : result) { |
||||||
|
System.out.println(b); |
||||||
|
} |
||||||
|
// System.out.println(Base64Util.encode(result));
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void test() throws Exception { |
||||||
|
//读取pem证书
|
||||||
|
BufferedReader br = new BufferedReader(new FileReader("D:/pub2.pem")); |
||||||
|
String s = br.readLine(); |
||||||
|
StringBuffer publickey = new StringBuffer(); |
||||||
|
while (!StringUtil.isEmpty(s)) { |
||||||
|
if(s.charAt(0) != '-') |
||||||
|
publickey.append(s); |
||||||
|
s = br.readLine(); |
||||||
|
} |
||||||
|
br.close(); |
||||||
|
byte[] keybyte = Base64Util.decode(publickey.toString()); |
||||||
|
KeyFactory kf = KeyFactory.getInstance("RSA"); |
||||||
|
|
||||||
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keybyte); |
||||||
|
|
||||||
|
PublicKey publicKey = kf.generatePublic(keySpec); |
||||||
|
Cipher cipher = Cipher.getInstance(kf.getAlgorithm()); |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey); |
||||||
|
byte[] result = cipher.doFinal("123456789".getBytes()); |
||||||
|
System.out.println(Base64Util.encode(result)); |
||||||
|
FileOutputStream fos = new FileOutputStream(new File("D:/pub2.bin")); |
||||||
|
fos.write(result); |
||||||
|
fos.flush(); |
||||||
|
fos.close(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,76 @@ |
|||||||
|
package com.mengyxu.core.test; |
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream; |
||||||
|
import java.math.BigInteger; |
||||||
|
import java.security.KeyFactory; |
||||||
|
import java.security.PublicKey; |
||||||
|
import java.security.interfaces.RSAPublicKey; |
||||||
|
import java.security.spec.RSAPublicKeySpec; |
||||||
|
import java.util.Base64; |
||||||
|
|
||||||
|
import javax.crypto.Cipher; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.utils.Base64Util; |
||||||
|
|
||||||
|
/** All rights reserved |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年6月11日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class Tester { |
||||||
|
public static final String a = "138128429165014960214288316246915564109957848967973935739058724552651480736930647934382755460619033465620384391387196627089864034424350665139841418169631846827850418205510584071030219835341930960684577738773846628024223162766742868530563861053134130417499539521288428945157726371402147367583657263208271059771"; |
||||||
|
public static final String b = "65537"; |
||||||
|
|
||||||
|
@Test |
||||||
|
public void test() throws Exception{ |
||||||
|
|
||||||
|
RSAPublicKey res = a(a, b); |
||||||
|
//待加密内容
|
||||||
|
String text = "我是一个小test"; |
||||||
|
//加密后内容
|
||||||
|
String en_text = a(res, text); |
||||||
|
System.out.println(en_text); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void test1() throws CoreException { |
||||||
|
String s = "MTIzNDU2Nzg5"; |
||||||
|
System.out.println(Base64Util.decodeToString(s)); |
||||||
|
} |
||||||
|
|
||||||
|
public static RSAPublicKey a(String str, String str2) { |
||||||
|
try { |
||||||
|
return (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(new BigInteger(str), new BigInteger(str2))); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static String a(PublicKey publicKey, String str) throws Exception { |
||||||
|
Cipher instance = Cipher.getInstance("RSA"); |
||||||
|
instance.init(1, publicKey); |
||||||
|
byte[] bytes = str.getBytes("UTF-8"); |
||||||
|
int length = bytes.length; |
||||||
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); |
||||||
|
int i = 0; |
||||||
|
int i2 = 0; |
||||||
|
while (true) { |
||||||
|
int i3 = length - i; |
||||||
|
if (i3 > 0) { |
||||||
|
byte[] doFinal = i3 > 117 ? instance.doFinal(bytes, i, 117) : instance.doFinal(bytes, i, i3); |
||||||
|
byteArrayOutputStream.write(doFinal, 0, doFinal.length); |
||||||
|
i2++; |
||||||
|
i = i2 * 117; |
||||||
|
} else { |
||||||
|
byte[] byteArray = byteArrayOutputStream.toByteArray(); |
||||||
|
byteArrayOutputStream.close(); |
||||||
|
return Base64.getEncoder().encodeToString(byteArray); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue