我在周围的adivce中切入了字符串.hashCode。我想将目标(String)更改为大写,然后继续调用原始hashCode。我不知道该怎么做,以下代码无法正常工作。
@Pointcut("call(int hashCode(..)) && target(sourceString) && within(com.sample.package..*)")
public void hashCodePointcut(final String sourceString) {}
@Around("hashCodePointcut(sourceString)")
public Object around(final ProceedingJoinPoint joinPoint, String sourceString)
throws Throwable {
System.out.println("<<<<<<<<<<<<<<<<<Invoking hashCode on "+joinPoint.getSourceLocation().getFileName());
System.out.println("<<<<<<<<<<<<<<<<<Target String: "+ sourceString);
sourceString = sourceString.toUpperCase();
return joinPoint.proceed();
}
答案 0 :(得分:0)
我先说这个答案,然后我建议 强烈反对 。 IMO,一旦你开始在事实之后使用哈希方法进行攻击并使结果不那么独特(通过忽略字符串中的大小写等),你就会在未来的问题中深入研究,并坚定地处于编码的黑暗面。有了足够强烈的说法,我就是这样做的:
@Pointcut("call(int java.lang.String.hashCode(..)) && target(sourceString) && within(com.sample.packages..*) && !within(your.package.AspectClass)")
public void hashCodePointcut(final String sourceString) {}
@Around("hashCodePointcut(sourceString)")
public Object around(final ProceedingJoinPoint joinPoint, String sourceString)
throws Throwable {
System.out.println("<<<<<<<<<<<<<<<<<Invoking hashCode on"+joinPoint.getSourceLocation().getFileName());
System.out.println("<<<<<<<<<<<<<<<<<Target String: "+ sourceString);
sourceString = sourceString.toUpperCase();
return sourceString.hashCode();
}
我还没有尝试过这个,但应该重新路由对String.hashCode()方法的所有调用,以便在该String的.toUpperCase()上调用相同的方法。它必须以这种方式完成,因为你无法改变joinPoint的目标(这就是为什么你的建议可能没有做任何事情)。
在切入点中添加“!within(your.package.AspectClass)”会阻止在方面内的调用的无限循环中应用相同的建议。
让我知道这是否有所帮助,或者是否仍有问题(除了您正在使用hashCode();))。