如何在filter中查看spring csrf标记

时间:2017-08-08 23:39:47

标签: spring spring-mvc csrf spring-aop

我正在使用spring mvc 4.3版本。我们使用的是默认的spring csrf。在其中一个场景中,我收到无效的令牌错误,但我看到令牌,无论我得到的是什么,都被发送到服务器。有没有什么办法可以让日志消息看到服务器响应,看看生成的csrf令牌。在我正在使用标签的UI JSP页面上,在页面视图源中,我可以看到令牌。但我希望在服务器端的过滤器中看到,以确保我的页面上没有其他令牌丢失。

我的页面上有两个标签。每当我更改标签时,我都会遇到此令牌无效问题。你能帮我解决一下如何在我的自定义过滤器中访问这个令牌细节。

我试过这样的AOP需要进行哪些更改?

@Aspect 公共类AfterGenerateCsrfTockenAspect {

protected transient ITSLogger logger = LogManager.getLogger(this.getClass().getName());
@AfterReturning( 
        pointcut = "org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.generateToken(..)",
        returning = "result"
    )
    public void logGeneratedCsrfToken(Object result) {
        logger.debug("CSRF token was generated.  :::: " + result);
    }

}

2 个答案:

答案 0 :(得分:0)

  

有什么办法可以把日志消息看成服务器响应来查看生成的csrf令牌

是的,AOP救援。例如,您可以在每次生成令牌时记录令牌:

@Aspect
@Slf4j // lombok for logging
public class AfterGenerateCsrfTockenAspect {
    @AfterReturning( // use here FQDN of your Token generator method
        pointcut = "org.springframework.security.web.csrf.CookieCsrfTokenRepository.generateToken(..)",
        returning = "result"
    )
    public void logGeneratedCsrfToken(Object result) {
        log.info("CSRF token '{}' was generated.", result);
    }
}

答案 1 :(得分:0)

默认情况下,spring会在会话中存储csrf标记。我们可以从会话属性

访问csrf令牌
String key ="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN"
HttpSession session = request.getSession(true);
CsrfToken token =(CsrfToken) session.getAttribute(key);