当前位置: 首页 > 知识库问答 >
问题:

使用Spring Framework为选项请求启用CORS

陆洛城
2023-03-14

每次对服务进行PUT Ajax调用时,它都会返回以下错误:

@SpringBootApplication
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DispatcherServletInitializer.class, OptionsController.class,Application.class);
    }
}
public abstract class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setInitParameter("dispatchOptionsRequest", "true");
        super.customizeRegistration(registration);
    }
}

用于处理所有选项请求控制器:

@Controller
public class OptionsController {

    @RequestMapping(method = RequestMethod.OPTIONS)
    public HttpServletResponse handle(HttpServletResponse theHttpServletResponse) throws IOException {
        theHttpServletResponse.addHeader("Access-Control-Allow-Headers", "origin, content-type, accept, x-requested-with");
        theHttpServletResponse.addHeader("Access-Control-Max-Age", "60"); 
        theHttpServletResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        theHttpServletResponse.addHeader("Access-Control-Allow-Origin", "*");
        return theHttpServletResponse;
    }

}

共有1个答案

施俊远
2023-03-14

最后,DispatcheServlet自定义初始化器是真正解决了我的问题的类。OPTIONS请求失败是因为我实现了optionsController,这是错误的。

所以我删除了optionsController,只需在Rest控制器中为OPTIONS请求添加handle方法,问题就解决了:

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/users")
public class Users {

    @RequestMapping(
            value = "/edit",
            method = RequestMethod.PUT)
    public ResponseEntity<?> create(@RequestBody User user){
         ....
         ....
    }

    @RequestMapping(
            value = "/**",
            method = RequestMethod.OPTIONS
    )
    public ResponseEntity handle() {
        return new ResponseEntity(HttpStatus.OK);
    }
}
 类似资料:
  • 问题内容: 我正在使用Bottle Web Framework上的Web服务的RESTful API,并希望通过jQuery AJAX调用来访问资源。 使用REST客户端,资源接口可按预期工作并正确处理GET,POST,…请求。但是,当发送jQuery AJAX POST请求时,最终的OPTIONS预检请求被简单地拒绝为“ 405:不允许使用方法”。 我试图在Bottle服务器上启用 CORS-

  • 问题内容: 我有一个angular.js应用程序,我需要做CORS请求。 我想使用以下角度资源定义我的休息服务“角度”:http : //docs.angularjs.org/tutorial/step_11。 但是我还没有找到一种方法来使它工作。在google上,我找到了以下示例代码:http : //jsfiddle.net/ricardohbin/E3YEt/,但这似乎不适用于angular

  • 我正在尝试向一个创建自己的wifi热点并且只允许http请求的设备发出http请求。对于Android8和更低的http请求是成功的,但是对于Android9它们是失败的。虽然谷歌Pixel2使用的是Android9,但它似乎能发挥作用。 network_security_config.xml

  • 问题内容: 我正在创建一个Web Start应用程序,该应用程序将从某些较新的JVM选项(尤其是转义分析,G1垃圾收集器等)中受益。 同时,我希望该应用程序在不支持这些选项的旧版JVM上正常运行。 是否有实现此目标的好方法? 问题答案: 正如Thorbjørn所述,Java 6 u10允许JNLP中包含多个元素。最新的 Java Web Start开发人员指南 的 JNLP文件语法 部分指出,可以

  • 问题内容: 作为此问题的后续,我想知道如何在Spring 3 MVC应用程序中处理OPTIONS请求。我不想在我的spring代码中为每个端点编写一个选项处理方法。但是建议的将选项处理程序映射到“ / **”仅适用于尚未具有处理程序的端点。 因此,我想到了使用mvc拦截器来拦截OPTIONS请求以处理跨站点访问的问题。但我无法想象这是做到这一点的最佳方法。是否还有其他选项,例如在同一路径上具有不同

  • 目前我正在研究聊天服务器/客户端项目。我正在努力使用 select 处理多个请求,我的服务器脚本使用 select 模块,但客户端脚本没有。结果是,当用户输入消息时,其他客户端必须编写自己的消息才能通读对话。我已经在网上搜索了很多示例,但只能找到带有 sys.stdin 的代码片段,这不是我想要的。 我很高兴收到任何指示/解释。 服务器代码: 客户端代码: