Междоменное разделение клиентских и внутренних проектов и поддержка сеанса Session

Java

Когда интерфейсная часть и внутренняя часть веб-проекта разрабатываются отдельно из-за несогласованных доменных имен, могут возникать ситуации, когда нельзя делать запросы и поддерживать сеансы.

OPTIONS

Когда интерфейсный Ajax запрашивает фон, откройте консоль, и вы увидите, что перед каждым запросом будет одинOPTIONSтип запроса
OPTIONSЭто называется предварительным запросом.Посредством этого запроса браузер информирует сервер о ситуации следующего запроса.

Access-Control-Request-Method: POST 
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

Получив ответ от сервера, браузер знает, разрешен ли запрос.

Обработка ОПЦИИ

Фон может обрабатывать этот запрос в перехватчике или фильтре, вот перехватчик в фоне Springboot в качестве примера

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) {
    String method = request.getMethod().toLowerCase();
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, PATCH, DELETE");
    response.setHeader("Access-Control-Allow-Headers", "X-Requested-With,content-type");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Expose-Headers", "TK");
    if (method.equals("options")){
        return false;
    }
    //...
    return true;
}

Access-Control-Allow-OriginОт имени источника запроса на разрешение установлено значение*Или установите его в качестве внешнего доменного имени, чтобы решить проблему невозможности выполнения междоменных запросов.http://domain
Access-Control-Allow-MethodsУказывает разрешенные методы запроса

Следующие два специальных примечания
Access-Control-Allow-Headersделегировать разрешение浏览器к服务器Какие заголовки запросов отправлять
Access-Control-Expose-Headersделегировать разрешение浏览器который можно прочитать服务器отправленные заголовки запроса
ограничиваются клиентом

Используйте токен для сохранения сеанса

Традиционный интерфейс разработки и серверная часть могут поддерживать сеанс, потому что когда сервер вызываетHttpSession, будетSessionIdв заголовке запросаset-cookie, браузер считывает эту информацию и помещаетSessionIdСохраните его локально и дождитесь следующего запроса с помощьюCookieформу на сервер, сервер в соответствии с полученнымSessionIdоказатьсяSessionпродолжить сеанс

Теперь используйте после использования переднего и заднего концовCookieВсе виды неудобств, вы можете перейти на другой способ выполненияSessionIdтрансмиссия, это поставитьSessionIdПоместите его в заголовок запроса и выведите в браузер

Подключиться к фрагменту кода

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) {
    //...
    HttpSession session = request.getSession();
    response.setHeader("TK",session.getId());
    return true;
}

Из-за настройкиresponse.setHeader("Access-Control-Expose-Headers", "TK");
Указывает, что клиент может прочитать заголовокTKполе, клиент может прочитатьTKсерединаSessionIdСохранить локально, способ хранения может бытьCookieилиLocalStorageвсе будет хорошо
использовать по запросуhttp://service;jsessionid=${token}на сервер в виде Это отличается от традиционного веб-сайта.Cookie:JSESSIONID=sessionidЭффект формы согласуется
Таким образом, для достижения цели поддержания разговора

Зачем поддерживать сеанс

сервер согласноsessionidСохранение сеанса осуществляется контейнером в соответствии с URL-адресом, переданным в запросе.;jsessionid=или в кукиJSESSIONID=,
контейнер в соответствии сsessionidАвтоматически найти сеанс в памяти.
это тоже выбор;jsessionid=причина пути. Это заставит вас не чувствовать, что вы занимаетесь разработкой с разделенным интерфейсом и серверной частью, как в традиционной разработке JSP, интерфейсная часть и серверная часть сливаются воедино.

Конечно, вы также можете вручную управлять другими способами, такими как прямая передача параметров.http://service?JID=${token}, привести его в шапке запроса и т.д., а потом вручную получить ID и потом найти соответствующий Session, но это немного избыточно