本篇文章主要介绍了" 防止跨站脚本攻击--不同的系统之间为了访问安全可以验证key,和sign",主要涉及到方面的内容,对于企业开发感兴趣的同学可以参考一下:
key和sign的校验可以采用类似日志的切面方式(一个切点可以织入多种通知,例如即织入日志通知,又织入key校验通知)切面基本思路是定义切点(截点),在切点(截...
key和sign的校验可以采用类似日志的切面方式(一个切点可以织入多种通知,例如即织入日志通知,又织入key校验通知)
切面基本思路是定义切点(截点),在切点(截点)处织入通知(前置通知,环绕通知,后置通知)
请求系统在业务数据之后加上key,sign,到达目标系统之后,目标系统用切面拦截(前置通知),校验key(和本地存的是否一致)和sign(加密方式,参数是否一致),通过之后remove掉key,sign留下业务数据(参数操作基于对象引用
,所以后传有效)自动从截点方法继续执行,不通过抛异常(环绕通知需要在通知处手动调用截点方法)
前置通知://不需要手动调用截点,自动运行
截点:
/**
* 所有controller
*/
@Pointcut("execution(* com.houbank.bank.*.controller..*.*(..))")
private void allController() {
}
通知
@Before(value = "allController()" +
"&&!callbackController()" +
"&&!taskController()" +
"&&!webController()" +
"&&!baseController()" +
"&&!nosignController()")
public void req(JoinPoint joinPoint) throws Throwable {
if(joinPoint.getArgs().length > 0){
Object jsonObject = (Object) joinPoint.getArgs()[0];
Map bodyMap = MapUtil.beansToMap(jsonObject);
String key = (String) bodyMap.get("key");
String sign = (String) bodyMap.get("sign");
if (StringUtils.isBlank(key) || StringUtils.isBlank(sign)) {
throw new ParamException("请检查参数key,sign");
}
String secret = null;
String[] split = appKey.split(";");