情况如下: 我的应用程序扩展了一个框架。所以我没有main()或我声明的任何其他入口点(我重写该框架提供的方法,并安排其他所有内容)。这个框架可以安全;安全建立在apache mina之上。
当与应用程序建立不安全连接时,mina会抛出异常,这是堆栈跟踪:
Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at sun.security.ssl.EngineInputRecord.bytesInCompletePacket(EngineInputRecord.java:171) ~[na:1.7.0_21]
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:845) ~[na:1.7.0_21]
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758) ~[na:1.7.0_21]
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) ~[na:1.7.0_21]
at org.apache.mina.filter.support.SSLHandler.unwrap0(SSLHandler.java:657) ~[mina-filter-ssl-1.1.7.jar:na]
at org.apache.mina.filter.support.SSLHandler.unwrapHandshake(SSLHandler.java:613) ~[mina-filter-ssl-1.1.7.jar:na]
at org.apache.mina.filter.support.SSLHandler.handshake(SSLHandler.java:493) ~[mina-filter-ssl-1.1.7.jar:na]
at org.apache.mina.filter.support.SSLHandler.messageReceived(SSLHandler.java:306) ~[mina-filter-ssl-1.1.7.jar:na]
at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:392) ~[mina-filter-ssl-1.1.7.jar:na]
... 12 common frames omitted
我想使用AOP技巧来捕获这个,所以我可以以一种很好的方式通知用户,并且可以发送警报。我想出了这个方面:
@Aspect
public class SSLExceptionCatcherAdvice {
private static final Logger LOG = LoggerFactory.getLogger(SSLExceptionCatcherAdvice.class);
@Around("execution(* *.unwrap(..))")
public void catchException(ProceedingJoinPoint pjp) {
try {
pjp.proceed();
} catch (Throwable exception) {
LOG.info("########################################");
}
}
}
但是,它根本没有被调用。方面很好,顺便说一句,它可以从我的代码库中捕获其他方法调用。
对此有何建议? Thx提前。
答案 0 :(得分:1)
Spring默认使用基于代理的AOP解决方案,因此只有Spring托管bean才能应用这些方面。它不适用于非春季托管bean。请参阅this section of the reference guide。
您试图拦截javax.
包上的执行,这是一种特殊情况,只能在load-time weaving environment中使用,而不能使用基于代理或基于编译时的解决方案。同时使用加载时编织来编织它们也可能很棘手,因为这些类可能已经在加载时编织开始之前加载了。
方面很好,顺便说一句,它可以从我的代码库中捕获其他方法调用。
实际上您的方面存在缺陷,@Around
建议应始终返回Object
并且应始终返回调用proceed()
方法的结果(除非您重新抛出Exception
你的方面中断正确地返回结果,现在有效地每个方法返回null
。
链接: