Spring可以在OPTIONS方法上自动生成"允许"标题吗?

 不言不语都可以温柔_631 发布于 2023-02-06 20:13

当我RequestMapping在Spring MVC中配置我的s时,我想Allow在使用该OPTIONS方法时自动生成正确的头.

例如,使用此控制器:

@Controller
@RequestMapping("/test")
public class TestController {

    @RequestMapping(method = RequestMethod.GET)
    ResponseEntity getTest() {
        return new ResponseEntity<>("test", HttpStatus.OK);
    }
}

现在,如果我OPTIONS对该URL 发出请求,我会得到405,方法不允许.相反,我希望它能自动回复

Allow: GET, OPTIONS204 - No content

我有一个想法添加拦截器,如下所示:

@Override 
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new HandlerInterceptor() {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if("OPTIONS".equalsIgnoreCase(request.getMethod())){
                response.setHeader("Allow", "GET, OPTIONS");
                response.setStatus(204);
                //TODO figure out the @Controller and what possible methods exist
                return false;
            }
            return true;
        }
        //Deleted excess methods for brevity
    });
}

没有我编写自定义拦截器,这个功能是否存在?如果没有,我如何解决TODO并查找OPTIONS调用发生在同一URL上的注释?

1 个回答
  • 延伸Sotiros和jhadesdev的答案.如果使用Java Config(如在Spring Boot中),您可以通过配置如下配置DispatchServlet来启用OPTIONS请求@Bean:

    @Bean
    public DispatcherServlet dispatcherServlet() {
        DispatcherServlet servlet = new DispatcherServlet();
        servlet.setDispatchOptionsRequest(true);
        return servlet;
    }
    

    然后我创建了一个静态助手,接受HttpMethods varargs,如下所示:

    public static ResponseEntity<Void> allows(HttpMethod... methods) {
        HttpHeaders headers = new HttpHeaders();
        Set<HttpMethod> allow = new HashSet<>();
        for(HttpMethod method: methods){
            allow.add(method);
        }
        headers.setAllow(allow);
    
        return new ResponseEntity<>(headers, HttpStatus.NO_CONTENT);
    }
    

    这使得创建我自己的OPTIONS映射变得如此简单:

    @RequestMapping(method = RequestMethod.OPTIONS)
    ResponseEntity<Void> getProposalsOptions() {
        return allows(HttpMethod.GET, HttpMethod.OPTIONS);
    }
    

    虽然我认为Spring MVC可以OPTIONS自动提供响应,但你不能通过一个Interceptor,但可能通过自定义DispatcherServlet.

    编写自己的OPTIONS响应的好处是,OPTIONS在某些情况下根据用户的角色定制是有意义的.例如,API的未经身份验证的用户可能会收到,Allow GET, OPTIONS但管理员会获得完整的API Allow GET, PUT, DELETE, OPTIONS您可以根据在OPTIONS拨打电话时检查用户的角色来自定义响应.

    2023-02-06 20:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有