Cross-origin resource sharing(CORS) — это механизм, который позволяет JavaScript на веб-странице делать запросы AJAX к другому домену, отличному от домена, из которого он был создан. По умолчанию такие веб-запросы запрещены в браузерах, и они приведут к ошибкам политики безопасности того же источника. Используя фильтр Java CORS, вы можете разрешить веб-странице делать запросы также и из других доменов(известные как кросс-доменные запросы).
Подробнее: Фильтр CORS с использованием Spring Security
1. Как работает фильтр CORS?
Возможность CORS работает путем добавления некоторых определенных заголовков HTTP, которые сообщают браузеру, что загруженной веб-странице должно быть разрешено делать веб-запросы к заданным/всем доменам. Также мы можем добавить информацию, чтобы указать браузеру разрешить только определенные методы HTTP(GET/PUT/POST/DELETE и т. д.) для этих доменных URL.
1.1. Предварительный запрос
Термин «предварительный запрос» мы встретим далее в статье, поэтому давайте сначала разберемся, что он означает.
Запрос CORS preflight — это запрос CORS, который проверяет, понимает ли другой домен протокол CORS. Это запрос HTTP OPTIONS, использующий следующие заголовки HTTP-запроса:
- Метод запроса контроля доступа
- Заголовки-запросов-контроля-доступа
- Источник
Предварительный запрос автоматически выдается браузером при необходимости; в обычных случаях разработчикам front-end не нужно писать такие запросы самостоятельно. В ответ на предварительный запрос ресурс указывает, какие методы и заголовки он готов обрабатывать и поддерживает ли он учетные данные.
1.2 Заголовки HTTP
Теперь давайте рассмотрим HTTP-заголовки, связанные с CORS, чтобы понять их более подробно.
Заголовки ответа:
- Access-Control-Allow-Origin: указывает авторизованные домены для выполнения кросс-доменных запросов. Используйте «*», если ограничений нет.
- Access-Control-Allow-Credentials: указывает, могут ли кросс-доменные запросы иметь учетные данные авторизации или нет.
- Access-Control-Expose-Headers: указывает, какие заголовки можно безопасно раскрыть.
- Access-Control-Max-Age: указывает, как долго могут кэшироваться результаты предварительного запроса.
- Access-Control-Allow-Methods: указывает методы, разрешенные при доступе к ресурсу.
- Access-Control-Allow-Headers: указывает, какие имена полей заголовка можно использовать во время фактического запроса.
Заголовки запроса
- Источник: указывает, откуда исходит фактический запрос или предварительный запрос из другого источника.
- Access-Control-Request-Method: используется при отправке предварительного запроса, чтобы сообщить серверу, какой метод HTTP будет использоваться в фактическом запросе.
- Access-Control-Request-Headers: используется при отправке предварительного запроса, чтобы сообщить серверу, какие заголовки HTTP будут использоваться в реальных запросах.
2. Пример фильтра Java CORS
Теперь давайте рассмотрим очень простую реализацию фильтра CORS, которую можно добавить в любое веб-приложение.
import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** Servlet Filter implementation class CORSFilter*/// Enable it for Servlet 3.x implementations/* @ WebFilter(asyncSupported = true, urlPatterns = { "/*" }) */public class CORSFilter implements Filter {/*** Default constructor.*/public CORSFilter() {// TODO Auto-generated constructor stub}/*** @see Filter#destroy()*/public void destroy() {// TODO Auto-generated method stub}/*** @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)*/public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)throws IOException, ServletException {HttpServletRequest request =(HttpServletRequest) servletRequest;System.out.println("CORSFilter HTTP Request: " + request.getMethod());// Authorize(allow) all domains to consume the content((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Origin", "*");((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Methods","GET, OPTIONS, HEAD, PUT, POST");HttpServletResponse resp =(HttpServletResponse) servletResponse;// For HTTP OPTIONS verb/method reply with ACCEPTED status code -- per CORS handshakeif(request.getMethod().equals("OPTIONS")) {resp.setStatus(HttpServletResponse.SC_ACCEPTED);return;}// pass the request along the filter chainchain.doFilter(request, servletResponse);}/*** @see Filter#init(FilterConfig)*/public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stub}}
Теперь зарегистрируйте этот фильтр в web.xml.
<filter><filter-name>CorsFilter</filter-name><filter-class>com.howtodoinjava.examples.cors.CORSFilter</filter-class></filter><filter-mapping><filter-name>CorsFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
Вот и все, что касается использования фильтров CORS в веб-приложениях Java.
Ссылки: