2011-01-30 48 views
2

因此,这已经与注释语法之前回答AspectJ的declaritive语法:Aspectj overwrite an argument of a method什么是overwritting参数

但我无法弄清楚如何使用AspectJ的declaritive语法做到这一点。 以下应该在方法中的每个字符串的前面添加“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()”所有的参数。

回答

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语法工作。

0

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

+0

没有,只能用于Annotation AspectJ语法。 – 2011-01-30 16:53:47

+1

你说得对。我不认为你可以用声明来做 - > args()不够灵活来处理任何参数。 – Howard 2011-01-30 17:51:37