
Originally Posted by
__dev18
I actually found your second link (
http://nonrepeatable.blogspot.com/20...th-tuckey.html) and I did what it suggested, but it didn't actually work, because Spring Dispatcher Servlet is still taking requests for Spring Security login page etc.
But fortunately I managed to handle this issue by adding exceptions to urlrewriter configuration, so that urls reserved for spring security won't be redirected to Spring Dispatcher Servlet.
How did you add exception?
I'm using following way.
1. In urlrewritefilter.xml I handle spring security urls as following:
Code:
<rule>
<from>^/webapp/login$</from>
<to>/login</to>
</rule>
<rule>
<from>^/webapp/login$</from>
<to>/login</to>
</rule>
<outbound-rule>
<from>/webapp/login(.*)$</from>
<to>/login$1</to>
</outbound-rule>
<outbound-rule>
<from>/webapp/**</from>
<to>/$1</to>
</outbound-rule>
2. In web.xml
Code:
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</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-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>my-dispatcher</servlet-name>
<url-pattern>/webapp/*</url-pattern>
</servlet-mapping>
3. Spring security config:
Code:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/webapp/login.jsp" method="GET" filters="none" />
<intercept-url pattern="/images/*" filters="none" />
<intercept-url pattern="/css/*" filters="none" />
<intercept-url pattern="/js/*" filters="none" />
<intercept-url pattern="/webapp/admin/**" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/webapp/**" access="permitAll" />
<form-login login-processing-url="/webapp/login.jspx"
login-page="/webapp/login.jsp" default-target-url="/webapp/usercp.jsp"
always-use-default-target="true" authentication-failure-url="/webapp/login.jsp?login_error=1" />
<logout logout-url="/webapp/logout.jspx" logout-success-url="/webapp/login.jsp" />
<anonymous granted-authority="ROLE_ANONYMOUS" />
<remember-me user-service-ref="userDAO" />
<access-denied-handler error-page="/webapp/access-denied" />
</http>
So my web url is like following:
http://localhost:8080/mywebappcontext/webapp/welcome
http://localhost:8080/mywebappcontext/webapp/login
http://localhost:8080/mywebappcontext/webapp/users
etc
So login url is:
http://localhost:8080/mywebappcontext/webapp/login
and logout url is:
logout.jspx
Is there any better way to use spring security and urlrewrite filter?
I don't like to use /webapp/ section in url, because <c:url> omitting /webapp/ section when using with virtual host in tomcat.