Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp
, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.
Была функция с ключевым словом export
, которая была предназначенный для отдельной компиляции. Функция export
устарела в C++11
и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export
. Отдельная компиляция невозможна в C++
или C++11
, но, возможно, в C++17
, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.
Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.
Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.
Ваше описание происходящего выглядит неверным.
Это не (или, по крайней мере, не должно), что это происходит. Когда браузер запрашивает http://server.com/login и возвращает в ответ заголовок Set-Cookie
, cookie устанавливается и ограничивается доменом server.com
, даже если ответ редирект. Если вы видите файл cookie «auth», отправленный на client.com
, то это файл cookie, который client.com
был установлен ранее.
В любом случае, похоже, что вас действительно волнует, это
Существует множество причин, по которым это может происходить.
server.com
Access-Control-Allow-Origin: http://client.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin
при отправке учетных данных. Также обратите внимание, что источник должен быть точным совпадением, включая схему (http или https). На практике обычно серверы читают заголовок Origin
запроса, сверяют его с белым списком и, если это разрешено, копируют значение заголовка Origin
из запроса в заголовок Access-Control-Allow-Origin
в ответе. [тысяча сто тридцать одна] xhr.withCredentials = true
в своем запросе XHR. (См. MDN для более подробной информации.) Затем, после того, как вы все это сделали, у вас на пути будет еще одно препятствие. Поскольку вы используете client.com
и пытаетесь отправить файл cookie на server.com
, файл cookie server.com
считается «сторонним». AFAIK У всех основных браузеров есть настройка, которая блокирует сторонние куки для конфиденциальности, потому что они чаще всего используются трекерами для сбора маркетинговых данных для рекламы. Я считаю, что большинство из них по умолчанию блокируют сторонние куки, но я не уверен в этом. Наверняка многие люди установили в своих браузерах блокировку сторонних файлов cookie.
Таким образом, вы должны сообщить своим посетителям, чтобы они настраивали свой браузер для разрешения сторонних файлов cookie из server.com
.
Кстати, небезопасно устанавливать cookie при перенаправлении в другой домен. Хотя это разрешено по спецификации AFAIK, возникли проблемы с поддержкой браузера. См., Например, эту ошибку Chrome .
Из спецификации Access-Control-Allow-Origin: Для запросов без учетных данных в качестве подстановочного знака может быть указано буквальное значение «»; *
Попробуйте добавить определенный домен в Access-Control-Allow-Origin
поле.
Я думаю, что вы должны использовать прокси в угловых приложениях. Для получения дополнительной информации проверьте эту ссылку: https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md
Вы должны использовать опцию withCredentials
при отправке вашего запроса ajax на ваш http://server.com , и ваш server.com должен иметь для Access-Control-Allow-Credentials
значение true.
Example code in Node.JS server:
var cors = require('cors');
var corsOptions = {
origin: '*',
credentials: true };
app.use(cors(corsOptions));
Подробнее об этом здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials
[ 111]Подробнее об этом здесь: https://angular.io/api/http/RequestOptions
Также проверьте это : https : //github.com/angular/angular/issues/24283 - похоже, у определенной версии Angular были проблемы с этим флагом, поэтому, если вы не используете более свежую версию, вам может понадобиться установить заголовок явно.
Причина этого в том, что, если сервер явно не скажет клиенту «Я приму файлы cookie (установленные ранее в моем домене), переданные другим доменом» - принятие файлов cookie будет безопасным выпуск. Подробнее здесь: https://en.wikipedia.org/wiki/Cross-site_request_forgery