如何在OPTIONS类型请求时限制Allow响应头中的允许方法?
解决OPTIONS请求返回的Allow头包含过多HTTP方法的问题
嘿,我懂你遇到的困扰——明明在CORS过滤器里把Access-Control-Allow-Methods设成了GET, POST,但OPTIONS请求返回的Allow头却列出了容器支持的所有HTTP方法。这是因为你的Servlet容器(比如Tomcat)会自动为OPTIONS请求添加默认的Allow头,它的优先级比你过滤器里的设置更高,直接覆盖了你的配置。
要搞定这个问题,只需要在处理OPTIONS请求时手动设置Allow头,指定你需要的方法就行。下面是修改后的完整过滤器代码,重点看我调整的OPTIONS处理部分:
// 授权(允许)所有域名访问内容 ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Origin", values.isEmpty()?"*":values); ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Methods","GET, POST"); ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Credentials", "true"); ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Headers","*"); HttpServletResponse resp = (HttpServletResponse) servletResponse; // 处理OPTIONS请求,手动覆盖容器默认的Allow头 if (request.getMethod().equals("OPTIONS")) { // 让Allow头和Access-Control-Allow-Methods保持一致 resp.setHeader("Allow", "GET, POST"); // 按照CORS握手规范返回ACCEPTED状态码 resp.setStatus(HttpServletResponse.SC_ACCEPTED); return; } resp.addHeader("X-XSS-Protection", "1"); resp.addHeader("Strict-Transport-Security", "max-age=31536000"); resp.addHeader("Content-Security-Policy", "default-src 'self'"); resp.addHeader("X-WebKit-CSP", "default-src 'self'"); resp.addHeader("X-Frame-Options", "DENY"); resp.addHeader("Referrer-Policy", "no-referrer"); String origin = request.getHeader("origin"); if(origin!=null && !values.isEmpty()) { List<String> list = new ArrayList<String>(Arrays.asList(values.split(" , "))); if(!list.contains(origin)) { ((HttpServletResponse) servletResponse).setStatus(HttpStatus.SC_UNAUTHORIZED); System.out.println("Entered origin check"); return; } }
核心修改说明:
- 恢复了之前注释掉的OPTIONS请求处理逻辑
- 添加
resp.setHeader("Allow", "GET, POST");——这是关键一步,直接覆盖容器自动生成的Allow头,确保只返回你允许的方法 - 保持
Allow头的内容和Access-Control-Allow-Methods完全一致,既符合CORS预检请求的规范,又能达到限制允许方法的目的
这样修改后,再发送OPTIONS请求,响应头里的Allow字段就只会显示GET, POST了,完美解决你的问题!
内容的提问来源于stack exchange,提问作者Ritwik1711
相关产品推荐
相关产品推荐

