我是Spring MVC的新手。我正在开发一个应用程序,在进入登录控制器之前,它在安全控制器中执行一些过程。我不知道在登录时访问我的代码中的所有方法。
所以我想知道在登录时是否有办法记录应用程序流中的所有方法?
请帮帮我。
感谢。
答案 0 :(得分:0)
最干净,最恰当的方法是在应用程序中实现正确的日志记录。那样,你现在就完全是方法的流程了。
否则,您始终可以使用Thread.currentThread().getStackTrace()
来确定访问了哪些方法。
答案 1 :(得分:0)
您可以使用面向方面编程。 Spring使用代理提供了自己的AOP实现(但是有一些限制 - 例如,你不能建议私有方法)。作为替代方案,您也可以使用AspectJ。无论如何,这是使用Spring AOP建议应用程序的任何公共方法的示例代码:
@Around(value = "publicMethod()")
public Object logMethod(ProceedingJoinPoint joinPoint) {
// TODO: access method details using joinPoint
// e.g. access the public method name
MethodSignature methodSignature = (MethodSignature) joinPoint
.getSignature();
// do anything you want with the method's name, for instance log it
LOGGER.debug("Public method invoked: {}", methodSignature.getMethod().getName());
return joinPoint.proceed();
}
@Around(value= "publicMethod()")
注释使用自定义切入点,定义为使用@Pointcut
注释的方法:
@Pointcut("execution(public * your.app.package.*.*(..)) ")
private void publicMethod() {
// this is just a declaration required by AOP framework - we don't need to insert any code here
}
要使一切正常,您需要在配置类中添加@EnableAspectJAutoProxy
注释:
@ComponentScan(value = "your.app.package")
@Configuration
@EnableAspectJAutoProxy
public class TestConfig
{
}
注意:注意不要建议你的AOP课程 - 这会弄乱一些事情。您可以将AOP类放在单独的包中(例如your.app.aop
)或在potcut定义中使用排除(!within(your.app.aop..*)
)。
请阅读一些关于AOP的文章,以便更好地理解这个想法。官方Spring文档应该没问题 - https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html。