網站建設|使用aop加解密http接口
背景
最近,我正在編寫小程序接口,因為它的安全性很高,有必要對請求參數和響應進行加密。如果您對每種方法進行加密和解密,代碼都會過于繁瑣,工作量也會增加。因此,我們將進行統(tǒng)一的加密和解密處理,更傳統(tǒng)的方法是通過攔截器攔截。在這里,我們選擇使用Spring的AOP來實現(xiàn)它。
處理方案
1.比較了Spring的五種通知之后,不難發(fā)現(xiàn)環(huán)繞式通知可以解決我們的問題。環(huán)繞式通知的特點是什么?
環(huán)繞式通知是所有通知類型中最強大的,可以全方位地控制連接點。您甚至可以控制連接點是否被執(zhí)行。
對于環(huán)繞聲通知,連接點的參數類型必須是ProcedingJoinPoint。它是JoinPoint的一個子接口,允許控制何時執(zhí)行以及是否執(zhí)行連接點。
需要在環(huán)繞聲通知中顯式調用Process()方法來執(zhí)行代理方法。如果您忘記這樣做,通知將被執(zhí)行,但目標方法不會被執(zhí)行。
圍繞通知的方法需要在執(zhí)行目標方法后返回結果,即調用jointPoint.try()的返回值;否則將出現(xiàn)空指針異常
import com.legendnet.elecmeter.utils.EncryptUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* @Author 情系IT
* @Description
* @Date 2019-12-04 14:55
*/
@Aspect
@Slf4j
@Component
public class HttpAspect {
// 定義切點controller包及子包下面的所有方法
@Pointcut("execution(public * com.legendnet.elecmeter.controller..*.*(..))")
public void httpRequest(){}
@Around("httpRequest()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Exception {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// target 判斷來源然后根據不同的解密算法解密
String target = request.getParameter("target");
String paramCode = request.getParameter("param_code");
paramCode = paramCode.replaceAll(" ", "+");
if(StringUtils.isNotBlank(paramCode)){
if("miniProgram".equals(target)){
paramCode = EncryptUtils.aesDecrypt(paramCode);
}
log.info("請求參數為:【{}】",paramCode);
}
Object proceed = "";
try {
proceed = proceedingJoinPoint.proceed();
if("miniProgram".equals(target)){
proceed = EncryptUtils.aesEncrypt(proceed.toString());
}
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return proceed;
}
}
controller類
import com.alibaba.fastjson.JSON;
import com.legendnet.elecmeter.common.ResultBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author 情系IT
* @Description
* @Date 2019-12-04 15:23
*/
@RestController
@Slf4j
public class TestController {
@RequestMapping("test")
public String test(@RequestParam("param_code") String paramCode){
log.info("我已接收到參數,參數為:【{}】",paramCode);
ResultBean resultBean = new ResultBean();
resultBean.fillData("這就是我的響應");
return JSON.toJSONString(resultBean);
}
}
鄂公網安備42060002000147