【问题标题】:Change servlet-mappings for Spring and Spring Security更改 Spring 和 Spring Security 的 servlet 映射
【发布时间】:2012-12-23 14:19:03
【问题描述】:

我目前正在编写一个 Spring MVC 应用程序,由 Spring Security 保护。对于登录,使用了基本表单身份验证,并且由于我没有添加进一步的配置,因此将凭据发布到http://www.localhost:8080/myWebApp/j_spring_security_check

到目前为止一切顺利,但现在我引入了第二个 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 配置为仅处理特定映射的请求,而不是文档中描述的 //*

提前非常感谢!

最好, 勒内

【问题讨论】:

  • springSecurityFilterChain 的映射中是否有错字?不应该是/app/* 而不是/app*(缺少斜线)?
  • @sbordet:嗨,西蒙娜!哦,是的,你是对的。我测试了不同的变体。不幸的是,我没有区别。仍然找不到j_spring_security_check。我已经编辑了上面的列表来解决这个问题

标签: servlets spring-mvc spring-security cometd


【解决方案1】:

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

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

【讨论】:

  • 感谢您的及时回复。但我试图区分这两个 servlet 的原因是 Spring 3.1.x(我正在使用)在 Cometd 库所需的异步支持方面存在问题。 stackoverflow.com/a/8655113/1770617 表示仅计划为 3.2.x 版本提供支持。所以,不幸的是,这并不能解决我的问题。
  • 使用 Spring 3.2 会更好吗?实现了异步支持,它是 GA blog.springsource.org/2012/12/13/spring-framework-3-2-goes-ga
  • 是的,也许。然而,我犹豫了,因为 Spring 3.2 还不是一个稳定的版本,我宁愿等到它稳定。我想我可以改变映射来避免这个问题。
  • 好的。尝试 /app/* 用于 appServlet 和 springSecurityFilterChain
  • 谢谢。正如@sbordet 也指出的那样,这是一个错字。我已经在清单中解决了这个问题。不幸的是,问题仍然存在。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2018-02-08
  • 2016-06-25
  • 2012-06-23
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多