2015-07-23 2 views
7

Я использую Tomcat 7. Я настроил собственную фильтрацию CORS, как это предлагается в официальной документации Tomcat.Фильтр Tomcat CORS и Spring Security

Я проверил все, что мог, но он не работает. Учитывая, что я использую приложение поставщика, которое, как я знаю, использует фильтры Spring Security, мне интересно, есть ли здесь известная ошибка.

Вот что я говорю:

<!-- Spring Security START --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/</url-pattern> 
</filter-mapping> 
<!-- Spring Security END --> 

Я добавил следующие конфигурации в web.xml:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Я знаю, что она минимальна, но она должна работать.

Я также ранее пытались более длинную версию:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    <init-param> 
     <param-name>cors.allowed.origins</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.allowed.methods</param-name> 
     <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.allowed.headers</param-name> 
     <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.exposed.headers</param-name> 
     <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.support.credentials</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.preflight.maxage</param-name> 
     <param-value>10</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Это не сработало.

Есть ли у кого-нибудь опыт настройки фильтров CORS с функцией Spring Security?

+2

Не могли бы вы уточнить, что «это не работает»? – Djizeus

+0

Какова ваша точная версия tomcat? – salyh

+0

Вы пытались поставить фильтр корса перед фильтром пружины? – user467257

ответ

0

Ваше приложение поставщик должен быть включен, чтобы отвечать на входящие предпросмотр опций с соответствующим заголовком CORS. Это не ошибка, это просто конфигурация и/или некоторые строки кода, которые отсутствуют, чтобы включить CORS для Spring. Включение CORS не является большой проблемой для вашего поставщика, но это может стать для вас большой проблемой, особенно если у вас нет копии проекта java для проектов в eclipse.

Если вам повезло, ваше приложение-поставщик уже работает на Spring Framework 4.2 RC2, вы можете самостоятельно выполнить конфигурацию в XML, см. https://spring.io/blog/2015/06/08/cors-support-in-spring-framework. Просто попробуйте добавить блок <mvc:cors> в свои приложения web.xml и настроить значения в соответствии с вашими потребностями. Я не тестировал его самостоятельно, но он должен сделать трюк.

Но я боюсь, что ты не мог бы быть, повезло ...

Тогда все становится немного сложнее, если вы не хотите, чтобы попросить ваш поставщик уточненного в/файл WAR приложения. В этом случае, посмотрите на это сообщение: Can't set Authentication Header with Angular and Spring Security. Ответ на сообщение описывает конфигурацию, которая должна быть выполнена в приложении web.xml(создайте новый фильтр CORS и привяжите его к классу, который вы должны создать) и как дополнительный класс фильтра java (в примере класс называется SimpleCorsFilter в пакете com.abcinsights.controller) должен выглядеть так, чтобы он работал. Чтобы добавить новый класс java в ваше приложение, вам необходимо распаковать WAR, создать и добавить новый класс java-фильтра (не забудьте объявление пакета внутри вашего нового класса java) и переупаковать его. Это самая сложная часть, потому что, если вы допустили ошибку в своем классе или во время переупаковки, вы, вероятно, сначала увидите ошибку после повторного развертывания.

-1

Вы должны добавить фильтр CORS перед фильтром Spring Security в web.xml

CORS OPTIONS запрос HTTP не должны быть обработаны Spring Security

+0

ну, Мурайд прав. На высоком уровне это то, что нужно сделать. – mika

0

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

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    <init-param> 
     <param-name>cors.allowOrigin</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.supportedMethods</param-name> 
     <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.supportedHeaders</param-name> 
     <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.exposedHeaders</param-name> 
     <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.supportsCredentials</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.maxAge</param-name> 
     <param-value>10</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
0

У меня была аналогичная конфигурация и основная проблема в том, что заголовок Authorization не разрешен в настройках Tomcat по умолчанию для параметров инициализации . Поэтому мне нужно было просто добавить его вот так:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    <init-param> 
     <param-name>cors.allowed.headers</param-name> 
     <param-value>Authorization,Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
     <!--   ^^^^^^^^^^^^^ --> 
    </init-param> 
</filter> 
Смежные вопросы