2013-01-09 107 views
2

我目前正在编写一个由Spring Security担保的Spring MVC应用程序。对于登录,使用基本表单身份验证,因为我没有添加进一步的配置,凭证被张贴到http://www.localhost:8080/myWebApp/j_spring_security_check更改弹簧和弹簧安全的servlet映射

到目前为止,我已经介绍了第二个servlet(CometD),它不受Spring或Spring Security的影响。为此,我试图更改servlet-mappings以将Spring和Spring Security分别映射到/app,分别为/app/*和另一个Servlet以及cometd/*。我web.xml看起来如下:

<!-- Spring security --> 
<listener> 
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 
<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>/app/*</url-pattern> 
</filter-mapping> 

<!-- Spring MVC --> 
<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping> 

<!-- CometD --> 
<servlet> 
    <servlet-name>cometd</servlet-name> 
    <servlet-class>org.cometd.server.CometdServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>cometd</servlet-name> 
    <url-pattern>/cometd/*</url-pattern> 
</servlet-mapping> 

这样做的问题是,这改变后,我可以登录了。服务器无法找到任何请求映射,并且客户端告诉我 NetworkError: 404 Not Found - http://localhost:8080/myWebApp/app/j_spring_security_check

这个映射有什么问题?如何配置Spring和Spring Security以仅处理特定映射的请求,而不是像文档中所述的//*

非常感谢!

最佳, 勒

+0

'springSecurityFilterChain'的映射中是否存在拼写错误?不应该是'/ app/*'而不是'/ app *'(缺少斜杠)? – sbordet

+0

@sbordet:嗨,西蒙娜!哦,是的,你是对的。我测试了不同的变体。不幸的是,我没有任何区别。仍然无法找到'j_spring_security_check'。我编辑了上面的清单来解决这个问题 – rene

回答

1

留下你springSecurityFilterChain映射到/。更改您的安全配置:

<http use-expressions="true"> 
    <intercept-url pattern="/cometd/**" access="permitAll" /> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
</http> 
+0

感谢您的及时回应。但是我试图区分这两个servlet的原因是Spring 3.1.x(我正在使用)在Cometd库所需的异步支持方面存在问题。 http://stackoverflow.com/a/8655113/1770617表示该支持仅针对3.2.x版本计划。所以,不幸的是这并不能解决我的问题。 – rene

+0

可能会更好地使用Spring 3.2吗?异步支持已实施,并且是GA http://blog.springsource.org/2012/12/13/spring-framework-3-2-goes-ga/ –

+0

也许。不过,我犹豫不决,因为Spring 3.2还没有稳定版本,我宁愿等到它。我想我可以改变映射来避免这个问题。 – rene