升级到 Spring Security 3.1 确实是干净利落的最佳方式。如果你不能这样做,你仍然可以达到预期的结果,但它不会那么漂亮。如果您的资源在 URL 空间中完全分离(看起来如此),您可以添加第二个 Spring Security 过滤器,仅覆盖 /api 资源,并确保它在默认资源之前应用。要在 Spring Security 3.0 中分离配置,您需要为第二个过滤器提供单独的应用程序上下文,并配置过滤器以在众所周知的位置找到它 - 例如 DispatcherServlet 创建一个上下文并将其存储在 servlet 上下文中的相关属性中到它的名字(下例中的“api”):
<filter>
<filter-name>apiSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>org.springframework.web.servlet.FrameworkServlet.CONTEXT.api</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>apiSecurityFilterChain</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>api</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
此示例中的调度程序 servlet 有一个应用程序上下文,/WEB-INF/api-servlet.xml
其中包含一个带有id="apiSecurityFilter"
.