CORS не работает с использованием фильтра CORS, если клиент и сервер находятся по одному URL-адресу

#java #cors

Вопрос:

Я пытаюсь реализовать CORS, где клиент и сервер находятся в одном URL-адресе, используя фильтр CORS. Ниже приведен код, который я реализовал

Фильтр CORS

 package com.core.web.spring.cors;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CORSFilter implements Filter{

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        ((HttpServletResponse) res).addHeader("Access-Control-Allow-Origin", "http://192.168.0.103:1111");
        ((HttpServletResponse) res).addHeader("Access-Control-Allow-Methods",
                "GET, POST");
        ((HttpServletResponse) res).addHeader("Access-Control-Max-Age", "3600");
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
        
    }

}
 

web.xml

 <filter>
  <filter-name>cors</filter-name>
  <filter-class>com.core.web.spring.cors.CORSFilter</filter-class>
</filter>
  
<filter-mapping>
  <filter-name>cors</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
 

Я установил исходное значение Access-Control-Allow как http://192.168.0.103:1111. Я меняю происхождение на http://192.168.0.108:1111 из инструмента почтальона. Но вместо того, чтобы блокировать запрос, он его выполняет. Я получаю успешный ответ.

Ниже приведен заголовок запроса и заголовок ответа

Заголовок запроса

 Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Content-Length: 1296
Content-Type: text/html; charset=UTF-8`enter code here`
Host: 192.168.0.103:1111
Origin: http://192.168.0.108:1111
Referer: http://192.168.0.103:1111/SampleTest/index.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
X-Requested-With: XMLHttpRequest
 

Заголовок ответа

 Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Origin: http://192.168.0.103:1111
Access-Control-Max-Age: 3600
Connection: keep-alive
Content-Length: 1210
Date: Sat, 03 Jul 2021 06:11:55 GMT
Server: WildFly/11
Strict-Transport-Security: max-age=7776000; includeSubdomains
X-Content-Type-Options: nosniff
X-FRAME-OPTIONS: SAMEORIGIN
X-Powered-By: Undertow/1
 

Кто-нибудь может мне в этом помочь?

Ответ №1:

Почтальона не волнует SOP (Политика того же происхождения), это инструмент разработки, а не браузер.

CORS (Совместное использование ресурсов разных источников) и SOP (Политика одного источника)-это конфигурации на стороне сервера, которые клиенты решают применять или нет.

Связанные с клиентами

Большинство браузеров применяют его для предотвращения проблем, связанных с атаками CSRF. Большинству инструментов разработки это безразлично. Postman, являющийся инструментом разработки, не будет придавать большого значения заголовку CORS, вам понадобится что-то еще для тестирования.

Существуют расширения Chrome, которые могут помочь вам протестировать CORS в вашем браузере.