切面类:
import com.alibaba.fastjson.JSONObject;
import com.tasu.server.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.*;
/**
* @author 26968
*/
@Aspect
@Component
@Slf4j
public class WebRequestAspect {
@Pointcut("execution( * com.tasu.server..controller.*.*(..))")
public void logPointCut() {
}
@Before("logPointCut()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 校验是否验证token。
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
log.info("请求地址 : " + request.getRequestURL().toString());
log.info("请求类型 : " + request.getMethod());
log.info("实现方法: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
log.info("参数 : " + Arrays.toString(joinPoint.getArgs()));
Object[] args = joinPoint.getArgs();
if (args == null || args.length == 0) {
return;
}
for (Object obj : args) {
if (obj instanceof Map) {
Map<String, String> param = (Map<String, String>) obj;
if (param != null && param.get("data") != null) {
String data = param.get("data").toString();
if (data == null || data.equals("")) {
return;
}
String result = MD5Utils.decrypt3(data);
// 转化为JSON对象
if (result != null && !result.equals("")) {
JSONObject json = JSONObject.parseObject(result);
Set<String> keys = json.keySet();
// 进行封装
for (String key : keys) {
((Map) obj).put(key, json.get(key));
}
}
}
}
}
}
@AfterReturning(returning = "ret", pointcut = "logPointCut()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
log.debug("返回值 : " + ret);
}
@Around("logPointCut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long startTime = System.currentTimeMillis();
// ob 为方法的返回值
Object ob = pjp.proceed();
Map<String, Object> map = new HashMap<>();
String s = JSON.toJSONString(ob);
String data = MD5Utils.encrypt3(s);
map.put("data", data);
log.info("耗时 : " + (System.currentTimeMillis() - startTime + "ms"));
return map;
}
}加密、解密工具类
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
/**
* @author 26968
*/
public class MD5Utils {
/**
* 3des秘钥长度必须是24位
*/
private static final String DES3_KEY ="";//自定义
public static void main(String[] args) {
System.out.println(encrypt3("{\"id\":\"765\"}"));
}
/**
* 将字符串进行3DES加密,现不支持空字符串加密
* @param data String
* -要加密的字符串
* @return String
* -加密后的字符串
*/
public static String encrypt3(String data)
{
String result = null;
if(StringUtils.isBlank(data))
{
return null;
}
String keyStr = DES3_KEY;
Key key = create3Key(keyStr);
if(key != null)
{
try
{
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] miData = cipher.doFinal(data.getBytes("utf-8"));
//result = Func.strByte2Hex(miData);//转化为十六进制字符串
BASE64Encoder encoder = new BASE64Encoder();
result = encoder.encode(miData);
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
return result;
}
/**
* 将加密后的字符串解密
* @param data String
* -加密后的字符串
* @return String
* -解密后的字符串
*/
public static String decrypt3(String data)
{
String result = null;
if(StringUtils.isBlank(data))
{
return null;
}
String keyStr = DES3_KEY;
Key key = create3Key(keyStr);
if(key != null)
{
byte[] sData = null;
try
{
BASE64Decoder decoder = new BASE64Decoder();
sData = decoder.decodeBuffer(data);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] miData = cipher.doFinal(sData);
result = new String(miData);//转化为十六进制字符串
}
catch(Exception e)
{
return null;
}
}
return result;
}
/**
* 形成3DES加密的秘钥Key
* @param keyStr String 密钥(秘钥长度必须是24位)
* @return Key
*/
private static Key create3Key(String keyStr)
{
if(StringUtils.isBlank(keyStr)|| keyStr.length() < 24)
{
return null;
}
SecretKey deskey = null;
try
{
byte[] keyByte = keyStr.getBytes("utf-8");
deskey = new SecretKeySpec(keyByte, "DESede");
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
return deskey;
}
}
版权声明:本文为wooden_people原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。