Spring mvc Sockjs回退,支持Spring Security CSRF启用

Spring mvc Sockjs回退,支持Spring Security CSRF启用,spring-mvc,spring-security,csrf,sockjs,Spring Mvc,Spring Security,Csrf,Sockjs,我的项目使用SpringSecurity+SpringMVC并处理websocket(通过stomp+sockjs) 当我测试sockjs时,XHR请求返回403。 如果我在安全上下文中关闭csrf,就可以了。 如果我像这样重写sockjs AbstractXHRObject构造函数:没关系: function AbstractXHRObject(method, url, payload, opts) { debug(method, url); var self = this; Ev


我的项目使用SpringSecurity+SpringMVC并处理websocket(通过stomp+sockjs)
当我测试sockjs时,XHR请求返回403。 如果我在安全上下文中关闭csrf,就可以了。
如果我像这样重写sockjs AbstractXHRObject构造函数:没关系:

function AbstractXHRObject(method, url, payload, opts) {
  debug(method, url);
  var self = this;
  EventEmitter.call(this);

  // HACK : add csrf headers
  opts["headers"][csrfHeader] = csrfToken;

  setTimeout(function () {
    self._start(method, url, payload, opts);
  }, 0);
}
当然,我必须检查opts是否不为空

我的问题是:在SockJS的XHR回退对象上添加头的方法是什么


谢谢

最后,我在我的安全上下文中禁用了sockjs URL的CSRF。

 <security:csrf request-matcher-ref="csrfMatcher" />

注意:下面是

不知道sockjs在angularjs的情况下,您可以像这样添加截距和标题
public class CsrfSecurityRequestMatcher implements RequestMatcher {

    private Pattern                 allowedMethods      = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
    private AntPathRequestMatcher   unprotectedMatcher  = new AntPathRequestMatcher("/ws/**/xhr_send**");

    @Override
    public boolean matches(HttpServletRequest request) {
        if (allowedMethods.matcher(request.getMethod()).matches()) {
            return false;
        }

        return !unprotectedMatcher.matches(request);
    }
}