インターフェイスが受信したHTTPリクエストの本文コンテンツが、json文字列のAES暗号化後のbase64文字列(+ m5AMx9 / dw5Abazg79 + fIgq0i + K / OTI2bitKHQU + Xck =など)であるとすると、バックエンドはどのように復号化してパッケージ化しますか統一された方法でpojo?
アイデア
- コントローラレイヤーの@RequestMappingを使用してメソッドに記述されたアノテーション@DecryptAndBindPojoをカスタマイズします
- springAOPを使用して、@ DecryptAndBindPojoおよびプロセスパラメーターを使用してメソッドをインターセプトします
- @DecryptAndBindPojoを使用するメソッドは、通常のpojoクラスを使用してパラメーターを受け取り、ServletRequestなどを挿入するメソッドでのspringの使用には影響しません。
package com.aaa.bbb.aspect;
import java.io.BufferedReader;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.alibaba.fastjson.JSON;
import com.aaa.bbb.annotation.DecryptAndBindPojo;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
@Aspect
@Component
public class DecryptAndBindPojoAspect {
@Around("@annotation(annotation)")
public Object doBefore(ProceedingJoinPoint joinPoint, DecryptAndBindPojo annotation) throws Throwable {
Object[] obj = joinPoint.getArgs();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
BufferedReader utf8Reader = IoUtil.getUtf8Reader(request.getInputStream());
String s = utf8Reader.readLine();
if (StrUtil.isBlank(s) || obj.length == 0) {
return joinPoint.proceed(obj);
}
String decryptStr = SecureUtil.aes(StrUtil.utf8Bytes("passwordpassword")).decryptStr(s);
for (int i = 0; i < obj.length; i++) {
boolean typeArg = obj[i] instanceof ServletRequest == false && obj[i] instanceof ServletResponse == false
&& obj[i] instanceof HttpSession == false && obj[i] instanceof HttpHeaders == false;
if (typeArg) {
Object parseObject = JSON.parseObject(decryptStr, obj[i].getClass());
obj[i] = parseObject;
}
}
return joinPoint.proceed(obj);
}
}
package com.aaa.bbb.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DecryptAndBindPojo {
}
@PostMapping("/addRole")
@DecryptAndBindPojo
public RoleVO add(Role role, HttpServletRequest request) {
// 做业务操作
// ...
return null;
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
xmlns:tx="http://www.springframework.org/schema/tx">
<aop:aspectj-autoproxy expose-proxy="true"></aop:aspectj-autoproxy>
<context:component-scan base-package="com.aaa.bbb" />
</beans>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>