Я пытаюсь заставить Tuckey UrlRewriteFilter привести в порядок URL-адреса для моего веб-приложения. Одна проблема, с которой я столкнулся, заключается в том, что, когда Spring-Security замечает, что анонимный пользователь пытается получить доступ к защищенному ресурсу, он перенаправляет на URL-адрес, содержащий путь к сервлету.
Что бы я хотел, например:
> GET http://localhost:8080/my-context/protected-resource
< Location: http://localhost:8080/my-context/login
Что я сейчас получаю:
> GET http://localhost:8080/my-context/protected-resource
< Location: http://localhost:8080/my-context/-/login
Соответствующие документы, которые я нашел до сих пор:
DefaultRedirectStrategy, который выполняет реальное перенаправление, о котором идет речь: http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/DefaultRedirectStrategy.html. У него есть свойство contextRelative, которое заманчиво, но я не думаю, что собирается его сократить, если я даже смогу найти способ его настройки.
Сообщение в блоге, которое помогло мне зайти так далеко: http://nonrepeatable.blogspot.com/2009/11/using-spring-security-with-tuckey.html
Я бы хотел знать:
- Можно / нужно убедить Такки переписать заголовок Location. , похоже, здесь не поможет.
- Можно / нужно каким-то образом настроить конфигурацию SS для создания переписанного URL. Я не думаю, что это так аккуратно, так как это сломалось бы, если бы перезапись была отключена.
web.xml
выглядит как
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>LogLevel</param-name>
<param-value>log4j</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>psms</servlet-name>
<url-pattern>/-/*</url-pattern>
</servlet-mapping>
urlrewrite.xml
выглядит так:
<urlrewrite>
<rule>
<from>^/(.*)$</from>
<to>/-/$1</to>
</rule>
</urlrewrite>
applicationContent-security.xml
выглядит так:
<http auto-config="true">
<!-- allow GET requests to /login without authentication -->
<intercept-url pattern="/-/login" method="GET" filters="none"/>
<intercept-url pattern="/-/admin/**" access="ROLE_ADMIN"/>
<intercept-url pattern="/-/**" access="ROLE_USER"/>
<form-login login-page="/-/login"
login-processing-url="/-/login.do"
authentication-failure-url="/-/login?login_error"
default-target-url="/-/index"
always-use-default-target="true"/>
<logout logout-url="/-/logout"
logout-success-url="/-/login"/>
<access-denied-handler error-page="/-/access-denied"/>
</http>