SpringSecurityRESTAPI

SpringSecurityRESTAPI,spring,angularjs,spring-mvc,grails,spring-security,Spring,Angularjs,Spring Mvc,Grails,Spring Security,我将SpringSecurityRESTAPI与grails和AngularJS一起使用。我和邮递员一起尝试了url请求,效果很好。它将使用使用的x-auth-token返回结果。但我也尝试了AngularJs,但没有进一步的选项请求。 在这里的第一幅图中,它显示了我的请求正在被处理,直到选项请求为止。 在第二幅图中,显示了我在《邮差》中的尝试。它给出了结果,并与x-auth-token配合使用。 在第三幅图中,我集成了spring安全插件,如下所示。它正在为“api/登录”工作,但更进一步

我将SpringSecurityRESTAPI与grails和AngularJS一起使用。我和邮递员一起尝试了url请求,效果很好。它将使用使用的x-auth-token返回结果。但我也尝试了AngularJs,但没有进一步的选项请求。

在这里的第一幅图中,它显示了我的请求正在被处理,直到选项请求为止。 在第二幅图中,显示了我在《邮差》中的尝试。它给出了结果,并与x-auth-token配合使用。 在第三幅图中,我集成了spring安全插件,如下所示。它正在为“api/登录”工作,但更进一步,它失败了。 第四幅图显示了选项请求的详细响应,但它无法继续。

我已经编写了grunt连接方法,如下所示

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 %>'
}
}
}
连接:{
选项:{
港口:9000,
//将此更改为“0.0.0.0”以从外部访问服务器。
主机名:“localhost”,
利弗雷罗德:35729
},
代理:[
{
上下文:'/crm/api',
主机:“localhost”,
端口:8080
}
],
利弗雷罗德:{
选项:{
开放:是的,
基数:[
“.tmp”,
''
]
}
},
测试:{
选项:{
港口:9001,
基数:[
“.tmp”,
"测试",,
''
]
}
},
地区:{
选项:{
基:“”
}
}
}

我仍然有同样的错误。

这是一个跨域问题

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

看起来您正在使用grunt,因此我建议设置代理。我使用设置转发到我的后端端口:

connect: {
  options: {
    port: 9000,
    hostname: 'localhost',
    livereload: 35729
  },
  proxies: [
    {
      context: '/crm/api',
      host: 'localhost',
      port: 8080
    }
  ]
}
正如所解释的,该问题是跨域问题

有关解决方案,请参阅本Spring指南:

正如上面指南中所解释的,您需要在应用程序上下文中添加一个
过滤器
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方法编辑了我的问题。我仍然有同样的错误。您能看看它到底出了什么问题吗?更改您的ajax请求url以使用与您的网页相同的域,您可以使用不带域的路径:
/crm/api/language/index.json
,代理将其转发到正确的端口。因此,当您查看网络选项卡时,它应该会点击
localhost:9000/crm/api/language/index.json
Hi我也有同样的问题,我在客户端设置了grunt connect代理,并在服务器端添加了过滤器。但它不起作用。。。如何检查SpringMVC项目中的“启用跨源请求”?