跨域的OPTIONS请求竟然走到了interceptor

跨域的OPTIONS请求竟然走到了interceptor,这对里面的计数产生了影响

option预检请求为什么会走向intercptor呢?
我们debug,查看栈发现请求在FrameworkServlet时走了doOptions方法,如下

@Override
	protected void doOptions(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		if (this.dispatchOptionsRequest || CorsUtils.isPreFlightRequest(request)) {
			processRequest(request, response);
			if (response.containsHeader("Allow")) {
				// Proper OPTIONS response coming from a handler - we're done.
				return;
			}
		}

		// Use response wrapper in order to always add PATCH to the allowed methods
		super.doOptions(request, new HttpServletResponseWrapper(response) {
			@Override
			public void setHeader(String name, String value) {
				if ("Allow".equals(name)) {
					value = (StringUtils.hasLength(value) ? value + ", " : "") + HttpMethod.PATCH.name();
				}
				super.setHeader(name, value);
			}
		});
	}

其中processRequest(request, response);就是后续的方法,最终会走到拦截器和controller
否则直接跳过走下面的直接返回

那么我们可以查看到CorsUtils.isPreFlightRequest(request)

public static boolean isPreFlightRequest(HttpServletRequest request) {
		return (HttpMethod.OPTIONS.matches(request.getMethod()) &&
				request.getHeader(HttpHeaders.ORIGIN) != null &&
				request.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD) != null);
	}

判断条件是OPTIONS且带了Origin的header且带了Access-Control-Request-Method的header
那么原因就在于此,怎么避免?
方法1.让前端去掉Origin或者Access-Control-Request-Method
方法2.写filter,filter在spring之前执行,在前面拦截就行

@Component
@WebFilter(urlPatterns = "/*", filterName = "CorsFilter")
public class CorsFilter implements Filter {
   
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    	HttpServletRequest request = (HttpServletRequest) servletRequest;
    	HttpServletResponse response = (HttpServletResponse) servletResponse;
    	response.setHeader("Access-Control-Allow-Origin", "*");//允许任何请求来源        
    	response.setHeader("Access-Control-Allow-Methods", "*");//允许任何method
    	response.setHeader("Access-Control-Allow-Headers", "*");//允许任何自定义header
    	if (!request.getMethod().equals("OPTIONS")){
    		 filterChain.doFilter(servletRequest, servletResponse);
    	}  
    }
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值