gpt4 book ai didi

rest - 使用 Grails 3 和 Spring Security REST 配置 CORS

转载 作者:行者123 更新时间:2023-12-02 02:04:27 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何将 Angular 2 前端(在 localhost:4200 上运行)插入 Grails 3 后端(在 localhost:8080 上运行),因此我需要在 grails 应用程序中启用 CORS 支持。

我发现这个 Github 项目 ( https://github.com/appcela/grails3-cors-interceptor-spring-security-rest-sample-app ) 展示了如何使用 grails3-cors-interceptor 插件启用 CORS。我正在运行这个应用程序作为测试后端,并在 CorsService.processPreflight() 中放置一个断点来检查它何时被调用。当我在 /api/books 上执行 GET 时,浏览器首先发送一个经过断点的 OPTIONS 调用,但以下 GET 似乎没有到达那里,我无法弄清楚为什么。有什么想法吗?

最佳答案

更新

Grails 3.2.1 具有支持 CORS 的内置功能。看看这个http://docs.grails.org/latest/guide/theWebLayer.html#cors

只需将其添加到您的 application.yml 中即可启用它

grails:
cors:
enabled: true

(确保查找要启用 CORS 的环境)

原帖

您不需要插件(除非您想使用该插件)来在此处启用 CORS。那么,对于您的休息端点,您始终可以使用 Grails 拦截器启用 CORS,如下所示:

class CorsInterceptor {

CorsInterceptor() {
matchAll()
}

boolean before() {
if (request.method == "OPTIONS") {
response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200")
response.setHeader("Access-Control-Allow-Credentials", "true")
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
response.setHeader("Access-Control-Max-Age", "3600")

response.status = 200
}

return true
}

boolean after() { true }
}

但是 Grails 拦截器无法拦截 Spring Security core/rest 插件提供的端点,因为它们的拦截器的优先级高于 Grails 拦截器。所以首先需要添加一个customer过滤器,然后在Spring相关过滤器之前注册它。

src/main/groovy中添加文件:

package test

import org.springframework.web.filter.OncePerRequestFilter

import javax.servlet.FilterChain
import javax.servlet.ServletException
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

class CorsFilter extends OncePerRequestFilter {

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

if (req.getMethod() == "OPTIONS") {
resp.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
resp.addHeader("Access-Control-Max-Age", "3600")
resp.addHeader("Access-Control-Allow-Origin", "http://localhost:4200")
resp.addHeader("Access-Control-Allow-Credentials", "true")
resp.status = 200
} else {
chain.doFilter(req, resp)
}
}
}

resources.groovy上注册它:

beans = {
corsFilterFoo(CorsFilter)
}

现在,将其添加到 Spring 的过滤器链中安全上下文过滤器之前(在 Bootstrap.groovy 中):

SpringSecurityUtils.clientRegisterFilter("corsFilterFoo",
SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order - 1)

引用文献:https://github.com/grails-plugins/grails-spring-security-core/blob/v3.1.1/src/main/groovy/grails/plugin/springsecurity/SpringSecurityUtils.groovy#L698

关于rest - 使用 Grails 3 和 Spring Security REST 配置 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39912427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com