java - 即使启用了 CORS,POST 也会被阻止

标签 java javascript angularjs spring-mvc cors

我创建了一个 SimpleCORSFilter基于 SpringMVC 指南允许 CORS:

@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", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-by");
        chain.doFilter(req, res);
    }
}

POST 和 PUT 请求的 Controller 代码如下:
@RequestMapping(
        produces = MediaType.APPLICATION_JSON_VALUE,
        method = RequestMethod.PUT,
        value = "admin/tile/{id}"
)
public boolean saveNewTile(@PathVariable("id") String id) {
    ContextEntity contextEntity = new ContextEntity("tile", id);
    //TODO: USE CUSTOM DATABASE
    contextEntityDAO.save(contextEntity);

    return true;
}

@RequestMapping(
        produces = MediaType.APPLICATION_JSON_VALUE,
        method = RequestMethod.POST,
        value = "admin/tile/{id}"
)
public boolean updateTile(@PathVariable("id") String id, @RequestParam(required = false) ContextAttribute[] atts) {
    ContextEntity contextEntity = contextEntityDAO.findById(id);
    contextEntity.addContextAttributes(atts);

    contextEntityDAO.save(contextEntity);
    return true;
}

使用 AngularJS v1.3.14 我可以执行 GET 和 PUT 请求,但是当我尝试执行 POST 时,Firefox 会通知我该请求已被阻止,因为同源策略...

例如,这部分工作正常
$scope.onTestOnlyClick = function() {
  $http.put('http://localhost:8080/admin/tile/' + tile.id)
};

但是,当我这样做时
$http.post('http://localhost:8080/admin/tile/' + tile.id, contextAtts);

它无法完成请求,两条线都在同一个 Controller 中!

这就是我在 Firebug 中看到的,出于某种原因,当我执行 POST 时,Firebug 只显示一个 OPTIONS 请求,之后没有 POST。
enter image description here

谢谢。

最佳答案

添加 内容类型 访问控制允许 header 在你的过滤器中。在我的本地测试成功。

response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Origin, Cache-Control, X-Requested-With");
    response.setHeader("Access-Control-Allow-Credentials", "true");

关于java - 即使启用了 CORS,POST 也会被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28855198/

相关文章:

angularjs - POST 方法无法在 angularjs 中获取 500 个内部服务器错误

javascript - 清除输入时如何在angularjs中使用select2-removed的select2来触发事件

java - 了解 Java 中的线程中断

java - C++ 与 Java 中的 md5 base64 编码器

java - 使用Maven支持android库项目

javascript - 无法将 Javascript 符号绑定(bind)到 HTMLElement.style

java - lib vlc android无法播放原始h264吗?

javascript - javascript innerHTML结束标签大小写

javascript - 将 PHP 变量传递给 JavaScript 并使用警报显示

javascript - 如何在 Rails 应用程序中使用 Bower 包含修改后的 javascript 库?