CsrfGuardHttpSessionListener分析
一、介绍
上一章已经介绍了 CsrfGuardServletContextListener , 本章继续分析另外一个 Listener-CsrfGuardHttpSessionListener
二、CsrfGuardHttpSessionListener分析
CsrfGuardHttpSessionListener 是继承了 HttpSessionListener ,主要是在 Session 创建和销毁时进行 监听处理,代码如下,
这个监听器 需要 在 Web.xml 的位置 ,需要在 CsrfGuardServletContextListener 之后,不然获取不到 config 里面的配置
public class CsrfGuardHttpSessionListener implements HttpSessionListener {
/**
创建session 时,对 session 进行Token 的更新
**/
@Override
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
CsrfGuard csrfGuard = CsrfGuard.getInstance();
csrfGuard.updateToken(session);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
/** nothing to do **/
}
}
2.1 csrfGuard 类方法 updateToken分析
从session 中获取 org.owasp.csrfguard.SessionKey 对应的sessionKey
如果没有就创建,并放入session
这里使用的是 默认 SHA1PRNG , 长度是 32位,每隔4位,用 “-” 分隔
public void updateToken(HttpSession session) {
//从session 中获取 org.owasp.csrfguard.SessionKey 对应的sessionKey
String tokenValue = (String) session.getAttribute(getSessionKey());
/**如果为null, 那就创建一个新的,并放入session**/
if (tokenValue == null) {
try {
tokenValue = RandomGenerator.generateRandomId(getPrng(), getTokenLength());
} catch (Exception e) {
throw new RuntimeException(String.format("unable to generate the random token - %s", e.getLocalizedMessage()), e);
}
session.setAttribute(getSessionKey(), tokenValue);
}
}
三、小结
CsrfGuardHttpSessionListener 这个比较简单了,就是 每次创建session时, 创建Token 并放入到 session 中, 值得注意的是 这个 Listener 需要在 CsrfGuardServletContextListener 后面 ,不然 获取不到config .