package com.acl.utils;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.security.MessageDigest;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;
/**
* @Filename DigestUtil.java
* @Description 签名工具类
* @Version 1.0
* @Author bohr
* @Email qzhanbo@yiji.com
* @History <li>Author: bohr.qiu</li> <li>Date: 2012-10-15</li> <li>Version: 1.0
* </li> <li>Content: create</li>
*/
public class DigestUtil {
private static final Logger logger = LoggerFactory.getLogger(DigestUtil.class.getName());
private static final String TIME_ZONE = "UTC";
private static final String UTC_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS Z";
/**
* 签名编码
*/
public static final String UTF8 = "utf-8";
/**
* 签名key
*/
public static final String SIGN_KEY = "sign";
/**
* 渠道id key
*/
public static final String CHANNEL_ID_KEY = "channelId";
/**
* 签名类型key,支持DigestALGEnum
*/
public static final String SIGN_TYPE_KEY = "signType";
/**
* utc时间key
*/
public static final String TIMESTAMP_KEY = "utc_time_stamp";
/**
* 签名算法
*
* @Filename DigestUtil.java
* @Description
* @Version 1.0
* @Author bohr.qiu
* @Email qzhanbo@yiji.com
* @History <li>Author: bohr.qiu</li> <li>Date: 2013-1-5</li> <li>Version:
* 1.0</li> <li>Content: create</li>
*/
public static enum DigestALGEnum {
SHA256("SHA-256"),
MD5("MD5");
private String name;
DigestALGEnum(String name) {
this.name = name;
}
public static DigestALGEnum getByName(String name) {
for (DigestALGEnum _enum : values()) {
if (_enum.getName().equals(name)) {
return _enum;
}
}
return null;
}
public String getName() {
return name;
}
}
/**
* 以Map中key的字符顺序排序后签名,如果secretKey不为空,排在最后面签名。<br/>
* 比如:Map中值如下:<br/>
* keyA=valueA<br/>
* keyB=valueB<br/>
* keyA1=valueA1<br/>
* <br/>
* security_check_code为yjf<br/>
* <p/>
* 待签名字符串为:<br/>
* keyA=valueA&keyA1=valueA1&keyB=valueByjf<br/>
* <b>注意:</b>SIGN_KEY不会被签名
*
* @param dataMap
* @param securityCheckKey 密钥
* @param de 摘要算法
* @return
*/
public static <T> String digest(Map<String, T> dataMap, String securityCheckKey,
DigestALGEnum de) {
return digest(dataMap, securityCheckKey, de, UTF8);
}
/**
* 签名并带上时间戳
*
* @param dataMap
* @param securityCheckKey
* @param de
* @param charset
* @return
*/
public static String digestWithTimeStamp(Map<String, Object> dataMap, String securityCheckKey,
DigestALGEnum de, String charset) {
dataMap.put(TIMESTAMP_KEY, getUTCTime());
return digest(dataMap, securityCheckKey, de, charset);
}
/**
* 签名并带上时间戳,使用utf-8编码
*
* @param dataMap
* @param securityCheckKey
* @param de
* @return
*/
public static String digestWithTimeStamp(Map<String, Object> dataMap, String securityCheckKey,
DigestALGEnum de) {
return digestWithTimeStamp(dataMap, securityCheckKey, de, UTF8);
}
/**
* 以Map中key的字符顺序排序后签名,如果secretKey不为空,排在最后面签名。<br/>
* 比如:Map中值如下:<br/>
* keyA=valueA<br/>
* keyB=valueB<br/>
* keyA1=valueA1<br/>
* <br/>
* security_check_code为yjf<br/>
* <p/>
* 待签名字符串为:<br/>
* keyA=valueA&keyA1=valueA1&keyB=valueByjf<br/>
* <b>注意:</b>SIGN_KEY不会被签名
*
* @param dataMap
* @param securityCheckKey 密钥
* @param de 摘要算法
* @return
*/
public static <T> String digest(Map<String, T> dataMap, String securityCheckKey,
DigestALGEnum de, String encoding) {
if (dataMap == null) {
throw new IllegalArgumentException("数据不能为空");
}
if (dataMap.isEmpty()) {
return null;
}
if (securityCheckKey == null) {
throw new IllegalArgumentException("安全校验码数据不能为空");
}
if (de == null) {
throw new IllegalArgumentException("摘要算法不能为空");
}
if (StringUtils.isBlank(encoding)) {
throw new IllegalArgumentException("字符集不能为空");
}
TreeMap<String, T> treeMap = new TreeMap<String, T>(dataMap);
StringBuilder sb = new StringBuilder();
for (Entry<String, T> entry : treeMap.entrySet()) {
if (entry.getValue() == null) {
throw new IllegalArgumentException(entry.getKey() + " 待签名值不能为空");
}
if (entry.getKey().equals(SIGN_KEY)) {
continue;
}
sb.append(entry.getKey()).append("=").append(entry.getValue().toString()).append("&");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(securityCheckKey);
byte[] toDigest;
try {
String str = sb.toString();
toDigest = str.getBytes(encoding);
if (logger.isDebugEnabled()) {
logger.debug("待签名url:" + str);
}
MessageDigest md = MessageDigest.getInstance(de.getName());
md.update(toDigest);
return new String(Hex.encodeHex(md.digest()));
} catch (Exception e) {
throw new RuntimeException("签名失败", e);
}
}
private static String getSign(Map<String, ?> params) {
Object para = params.get(SIGN_KEY);
if (para == null) {
throw new IllegalArgumentException(SIGN_KEY + "不能为空");
}
return StringUtils.trimToEmpty(para.toString());
}
private static String getParameter(HttpServletRequest request, String parameter) {
String para = request.getParameter(parameter);
if (para == null) {
throw new IllegalArgumentException(parameter + "不能为空");
}
return StringUtils.trimToEmpty(para);
}
/**
* 从request中获取待签名数据,校验签名是否正确
*
* @param request
* @param securityCheckKey
* @param de 签名算法,如果request中有SIGN_TYPE_KEY,则以SIGN_TYPE_KEY指定的摘要算法摘要
* @param charset 字符集
* @param expireTime 过期时间
* @param timeUnit 过期时间单位
*/
public static void checkWithTimestamp(HttpServletRequest request, String securityCheckKey,
DigestALGEnum de, String charset, long expireTime,
TimeUnit timeUnit) {
String timestamp = getParameter(request, TIMESTAMP_KEY);
checkTimeout(timestamp, expireTime, timeUnit);
check(request, securityCheckKey, de, charset);
}
/**
* 从request中获取待签名数据,校验签名是否正确
*
* @param request
* @param securityCheckKey
* @param de 签名算法,如果request中有SIGN_TYPE_KEY,则以SIGN_TYPE_KEY指定的摘要算法摘要
* @param charset 编码
* @return
*/
public static void check(HttpServletRequest request, String securityCheckKey, DigestALGEnum de,
String charset) {
if (securityCheckKey == null) {
throw new IllegalArgumentException("安全校验码不能为空");
}
if (request == null) {
throw new IllegalArgumentException("request对象不能为空");
}
String signType = request.getParameter(SIGN_TYPE_KEY);
signType = (signType == null) ? de.getName() : signType;
if (DigestALGEnum.getByName(signType) == null) {
throw new IllegalArgumentException("不支持的摘要算法类型:" + signType);
}
String sign = getParameter(request, SIGN_KEY);
@SuppressWarnings("unchecked")
TreeMap<String, String[]> treeMap = new TreeMap<String, String[]>(request.getParameterMap());
StringBuilder sb = new StringBuilder();
for (Entry<String, String[]> entry : treeMap.entrySet()) {
if
没有合适的资源?快使用搜索试试~ 我知道了~
SpringMVC+Mybatis+WebSocket+Task定时任务
共217个文件
class:69个
java:61个
jar:56个
5星 · 超过95%的资源 需积分: 20 119 下载量 199 浏览量
2015-09-22
19:31:20
上传
评论 3
收藏 29.38MB RAR 举报
温馨提示
SpringMVC+Mybatis+WebSocket+Task定时任务
资源推荐
资源详情
资源评论
收起资源包目录
SpringMVC+Mybatis+WebSocket+Task定时任务 (217个子文件)
OffsetLimitInterceptor.class 13KB
DigestUtil.class 12KB
PropertiesHelper.class 12KB
BaseController.class 7KB
Dialect.class 7KB
WeChatUtil.class 6KB
JsonMapper.class 5KB
YiJiFuUtil.class 5KB
SystemWebSocketHandler.class 5KB
PropertiesUtil.class 5KB
MacAddressUtil.class 5KB
Order.class 5KB
BaseServlet.class 5KB
PageBounds.class 4KB
DefaultParameterHandler.class 4KB
VerifyCodeUtil.class 4KB
Cn2SpellUtils.class 4KB
Paginator.class 4KB
SQLHelp.class 4KB
Application.class 4KB
PageListAttrHandlerInterceptor.class 4KB
OffsetLimitInterceptor$2.class 3KB
StringUtils.class 3KB
PageListJsonSerializer.class 3KB
WebSocketHandshakeInterceptor.class 3KB
HttpClientConnectionManager.class 3KB
SQLServer2005Dialect.class 3KB
ORCodeUtil.class 3KB
DB2Dialect.class 2KB
ByteUtil.class 2KB
SignUtil.class 2KB
WebSocketConfig.class 2KB
SQLServerDialect.class 2KB
OracleDialect.class 2KB
SystemInterceptor.class 2KB
FileUtils.class 2KB
HSQLDialect.class 2KB
MD5Utils.class 2KB
MySSLSocketFactory.class 2KB
DigestUtil$DigestALGEnum.class 2KB
DemoManageImpl.class 2KB
Order$Direction.class 2KB
PostgreSQLDialect.class 1KB
MySQLDialect.class 1KB
H2Dialect.class 1KB
PageList.class 1KB
FormatDateUtil.class 1KB
StringEscapeEditor.class 1KB
DemoController.class 1KB
OffsetLimitInterceptor$1.class 1KB
PageListJsonMapper.class 1KB
SybaseDialect.class 1KB
LogUtils.class 909B
CleanupMybatisPaginatorListener.class 895B
TrustAnyTrustManager.class 887B
TaskJobThree.class 881B
TaskJobFive.class 876B
OffsetLimitInterceptor$BoundSqlSqlSource.class 837B
Application$2.class 831B
Application$1.class 829B
Constants.class 816B
YiJiFuUtil$1.class 779B
Test.class 716B
UUIDUtils.class 627B
Job2.class 525B
DemoManage.class 328B
WebService.class 293B
DemoDao.class 244B
TestDao.class 228B
.classpath 636B
org.eclipse.wst.common.component 488B
org.eclipse.wst.jsdt.ui.superType.container 49B
poi-ooxml-schemas-3.11-beta3.jar 5.23MB
xmlbeans-2.6.0.jar 2.6MB
poi-3.11-beta3.jar 1.97MB
aspectjweaver-1.7.4.jar 1.76MB
druid-1.0.2.jar 1.74MB
ojdbc14.jar 1.47MB
poi-ooxml-3.11-beta3.jar 1.15MB
jackson-databind-2.5.1.jar 1.09MB
QRCode.jar 1.05MB
Qrcode_swetake.jar 1014KB
spring-context-4.1.3.RELEASE.jar 1003KB
spring-core-4.1.3.RELEASE.jar 983KB
mysql-connector-java-5.1.29.jar 856KB
spring-webmvc-4.1.3.RELEASE.jar 763KB
jackson-mapper-asl-1.9.13.jar 762KB
httpclient-4.5.jar 711KB
mybatis-3.2.8.jar 697KB
spring-web-4.1.3.RELEASE.jar 697KB
spring-beans-4.1.3.RELEASE.jar 691KB
quartz-2.2.1.jar 645KB
spring-test-4.1.3.RELEASE.jar 491KB
sqljdbc4.jar 455KB
spring-jdbc-4.1.3.RELEASE.jar 417KB
jstl-1.2.jar 405KB
spring-websocket-4.1.3.RELEASE.jar 378KB
fastjson-1.1.31.jar 355KB
spring-aop-4.1.3.RELEASE.jar 351KB
log4j-1.2.9.jar 344KB
共 217 条
- 1
- 2
- 3
资源评论
- Bjelica2018-05-03websocket没起来,参考一下这个
- sssssssssafw2016-09-27这个是我找的,嗯嗯,非常有用,项目也能启动~~不错,赞一个
- liubojiequan20102016-03-11这个是我找的,嗯嗯,非常有用,项目也能启动~~不错,赞一个
malixi52073
- 粉丝: 3
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- IMG_20240425_120538.jpg
- My Complete Genome_6k Base-Pairs of Phenotype SNPs_Complete Raw Data.zip
- qt 的mqtt测试demo
- 移动应用开发教程-zip.zip
- mosquitto-2.018-install-windows-x64
- FTPServer FTP 服务器,绿色免安装,单文件
- 梦畅语音点名软件,上课点名
- 利用ADNI数据集和标签,在tensorflow框架上使用tensorlayer接口,通过架构u-net实现海马体的分割
- Kutools for Word v9.0 office word 插件
- 修复Windows 10 LTSC 2021资源占用率高
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功