grails - 如何在 Grails websocket 插件中启用跨源请求

标签 grails grails-plugin spring-websocket

我尝试覆盖 spring websocket plugin 的默认配置对于 Grails,像这样:

@Configuration
@EnableWebSocketMessageBroker
class CorsWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    void configureMessageBroker(MessageBrokerRegistry messageBrokerRegistry) {
        messageBrokerRegistry.enableSimpleBroker "/queue", "/topic"
        messageBrokerRegistry.setApplicationDestinationPrefixes "/app"
    }

    @Override
    void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        StompWebSocketEndpointRegistration registration = stompEndpointRegistry.addEndpoint("/stomp")
        registration.setAllowedOrigins('http://localhost', 'http://localhost:8080')
        registration.withSockJS().setSupressCors(false)
    }

   // [...]
}

我也尝试过执行 .setAllowedOrigins('*'),但它仍然不起作用。

但是,当我注册客户端时,“Access-Control-Allow-Origin” header 从未在/stomp/info 端点上设置。我总是收到“XMLHttpRequest 无法加载 http://localhost:8080/app/stomp/info 。请求的资源上不存在 'Access-Control-Allow-Origin' header 。因此不允许访问 Origin ' http://localhost 。”

最佳答案

我使用 https://github.com/davidtinker/grails-cors 中的信息解决了这个问题。 Grails-cors 插件不适用于 grails 3.x,但存储库自述文件中有一些信息。我将其复制/粘贴到此处:

此插件不适用于 Grails 3。要在 Grails 3 项目中处理 CORS,您只需在 src/main/java 下的某个位置创建一个 servlet 过滤器即可:

@Priority(Integer.MIN_VALUE)
public class CorsFilter extends OncePerRequestFilter {

    public CorsFilter() { }

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain)
            throws ServletException, IOException {

        String origin = req.getHeader("Origin");

        boolean options = "OPTIONS".equals(req.getMethod());
        if (options) {
            if (origin == null) return;
            resp.addHeader("Access-Control-Allow-Headers", "origin,     authorization, accept, content-type, x-requested-with");
            resp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
            resp.addHeader("Access-Control-Max-Age", "3600");
        }

        resp.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin);
        resp.addHeader("Access-Control-Allow-Credentials", "true");

        if (!options) chain.doFilter(req, resp);
    }
}

引用grails-app/conf/spring/resources.groovy中的过滤器:

beans = {
     corsFilter(CorsFilter)
}

希望这对某人有帮助。

关于grails - 如何在 Grails websocket 插件中启用跨源请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30891198/

相关文章:

grails - 如何从不同的域类中删除数据?

grails - spring-security-core:3.0.0.M1插件在grails 3.0.8中可以正常构建,但在3.1.0.RC1中不能构建

grails - 安全性

grails - grails应用程序与可搜索插件的独立应用程序抛出NoClassDefFoundError

带有 SockJs 的 Spring Websocket 从 XHR 流切换到 Websocket

inheritance - Grails脚手架的继承

Grails 服务器推送

grails - Grails ElasticSearch插件:组件类型映射

javascript - 为什么不是一种在 websocket 中连接和发送的方法?

Spring 4 websocket + Tomcat 7.54 异步支持不工作