【问题标题】:Spring security REST APISpring 安全 REST API
【发布时间】:2014-04-27 10:16:15
【问题描述】:

我正在使用带有 grails 和 AngularJS 的 Spring Security REST Api。我用邮递员尝试了 url 请求,它工作正常。它使用使用的 x-auth-token 返回结果。但是我也尝试过使用 AngularJs,但它并没有进一步提出 OPTION 请求。

在这里的第一张图片中,它显示我的请求仅被处理到 OPTION 请求。 在第二张图片中,显示了我在 POSTMAN 中尝试过的内容。它给出了结果并且与 x-auth-token 一起工作得很好。 在第三张图片中,我集成了 spring 安全插件,如下所示。它适用于“api/login”,但进一步失败。 第 4 张图片显示了 OPTION 请求的详细响应,然后它无法进一步。

我已经编写了如下的 grunt connect 方法

connect: {
options: {
port: 9000,
// Change this to '0.0.0.0' to access the server from outside.
hostname: 'localhost',
livereload: 35729
},
proxies: [
{
context: '/crm/api',
host: 'localhost',
port: 8080
}
],
livereload: {
options: {
open: true,
base: [
'.tmp',
'<%= yeoman.app %>'
]
}
},
test: {
options: {
port: 9001,
base: [
'.tmp',
'test',
'<%= yeoman.app %>'
]
}
},
dist: {
options: {
base: '<%= yeoman.dist %>'
}
}
}

我还是有同样的错误。

【问题讨论】:

    标签: spring angularjs spring-mvc grails spring-security


    【解决方案1】:

    正如agerco 所解释的,问题是跨域问题。

    有关解决方案,请参阅此 Spring 指南:Enabling Cross Origin Requests for a RESTful Web Service。

    如上述指南所述,您需要在应用程序上下文中添加一个 Filter bean。

    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Component;
    
    @Component
    public class SimpleCORSFilter implements Filter {
    
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin", "localhost:9000"); // Client URL
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
            chain.doFilter(req, res);
        }
    
        public void init(FilterConfig filterConfig) {}
    
        public void destroy() {}
    
    }
    

    【讨论】:

    • 您好我有同样的问题,我在客户端设置了 grunt-connect-proxy 并在服务器端添加了过滤器。但它不起作用......我如何在spring mvc项目中检查“启用跨源请求”?
    【解决方案2】:

    这是一个跨域问题。

    您的网页位于localhost:9000,您的后端为localhost:8080。从技术上讲,它们是 2 个不同的域,因此您需要启用跨源请求,或者使用代理将请求转发到端口 8080。

    看起来您正在使用 grunt,所以我建议您设置代理。我使用grunt-connect-proxy 设置转发到我的后端端口:

    connect: {
      options: {
        port: 9000,
        hostname: 'localhost',
        livereload: 35729
      },
      proxies: [
        {
          context: '/crm/api',
          host: 'localhost',
          port: 8080
        }
      ]
    }
    

    【讨论】:

    • 嘿,正如你所说,我添加了代理,并使用我在 grunt 文件中使用的连接方法编辑了我的问题。我仍然有同样的错误。你能看看它到底有什么问题吗?
    • 更改您的 ajax 请求 url 以使用与您的网页相同的域,您可以使用不带域的路径:/crm/api/language/index.json,代理会将其转发到正确的端口。因此,当您查看网络选项卡时,它应该点击 localhost:9000/crm/api/language/index.json
    猜你喜欢
    • 2018-03-12
    • 2021-11-12
    • 2017-12-05
    • 2017-09-16
    • 2016-01-24
    • 2018-03-25
    • 2015-05-22
    • 2021-03-25
    • 2015-04-15
    相关资源
    最近更新 更多