用于覆盖参数的AspectJ声明语法是什么

时间:2011-01-30 16:10:14

标签: java aspectj

之前已经使用注释语法回答了这个问题:Aspectj overwrite an argument of a method

但我无法弄清楚如何使用AspectJ声明性语法。 以下应该在方法中的每个字符串前添加“Poop”,但它不会。

public aspect UserInputSanitizerAdvisor {

    pointcut unSafeString() : execution(@RequestMapping * * (..));

    Object around() : unSafeString() {
        //thisJoinPoint.getArgs();
        //proceed();
        System.out.println("I'm Around");
        Object[] args = thisJoinPoint.getArgs();
        if (args != null) {
            for (int i = 0; i < args.length; i++) {
                Object o = args[i];
                if (o != null && o instanceof String) {
                    String s = (String) o;
                    args[i] = "poop: " + s;
                }
            }
        }

        return proceed();
    }

}

我无法弄清楚如何给出“proceed()”所有参数。

2 个答案:

答案 0 :(得分:6)

我得到了注释版本:

@SuppressWarnings("unused")
@Aspect
public class UserInputSanitizerAdivsor {

    @Around("execution(@RequestMapping * * (..))")
    public Object check(final ProceedingJoinPoint jp) throws Throwable {
        Object[] args = jp.getArgs();
        if (args != null) {
            for (int i = 0; i < args.length; i++) {
                Object o = args[i];
                if (o != null && o instanceof String) {
                    String s = (String) o;
                    args[i] = UserInputSanitizer.sanitize(s);
                }
            }
        }
        return jp.proceed(args);
    }
}

现在我对所有Spring MVC控制器都有XSS保护。我希望让aspectJ语法正常工作。

答案 1 :(得分:0)

return thisJoinPoint.proceed(args);能做你想做的吗?