问题
@[java] @[代码] @[巧妙]
Spring被誉为Java Web程序员的春天,绝非浮夸。
打开spring的源代码我们会发现他使用了大量的AOP,面向切面编程。
这一次,项目中需要用来解决前端传参的类型匹配问题,所以使用了AOP。
如果我们用Spring的拦截器的话,就会发现。request可以setAttribute但是不能setParameter,可能是为了安全考虑,Spring不允许在拦截器中对前台传过来的参数做任何改动。
可是,如果真的有这个需求怎么办呢?
解决方案
做准备
- 导入spring-aop相关的包(百度一大把)
- 在applicationContext中做配置,我们使用注解的方式
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.xxx" />
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
- 在自动扫描的包内新建一个类,类的头上加入以下注解
@Component
@Aspect
@Order(10000) //order的值越小越优先执行
写代码
下面是类的代码(假定我们要切的是所有配置了注解RequestMapping,并且方法名是create的方法)
@Component
@Aspect
@Order(10000) //order的值越小越优先执行
public class SecurityAspect {
@Autowired
private HttpServletRequest request; // 简单的注入request
@Pointcut("execution(@org.springframework.web.bind.annotation.RequestMapping * *(..))")
public void aspect() {
}
@Around(value = "aspect() and execution(* create(..)))")
public Object aroundCreate(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] params = joinPoint.getArgs();
params[0] = "只是被修改的值"; // 这里我们修改了第一个参数
return joinPoint.proceed(params);
}
}