2016-09-30 76 views
0

我的項目完全基於基於java的配置。因此,而不是非標準的web.xml我有這樣的:如何同時爲Spring Security正確定義web.xml和基於java的配置

public class MyWebAppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext container) throws ServletException { 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
      rootContext.register(WebAppConfiguration.class); 
      AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 

      ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 
      dispatcher.setLoadOnStartup(1); 
      dispatcher.addMapping("/"); 
    } 

這工作得很好,我能得到像在Thymeleaf模板CSRF令牌:

<meta name="_csrf" th:content="${_csrf.token}"/> 
<meta name="_csrf_header" th:content="${_csrf.headerName}"/> 

但現在我需要部署我的項目轉到Google App Engine,並且它需要具有web.xml,否則它甚至無法啓動。 我web.xml中添加和刪除上述java的配置:

<context-param> 
     <param-name>contextClass</param-name> 
     <param-value> 
     org.springframework.web.context.support.AnnotationConfigWebApplicationContext 
    </param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>com.demshin.medpro.configuration.WebAppConfiguration</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>springServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextClass</param-name> 
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>springServlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

當我嘗試打開我的應用程序的網址,我得到一個異常:

org.thymeleaf.exceptions.TemplateProcessingException:異常 評估SpringEL表達式:「_csrf.token」

正如我認爲的,問題是在過濾鏈損壞。 但如果我添加此web.xml中:

<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> 
</filter-mapping> 

,而不是這個Java的配置:

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 
    public SecurityWebApplicationInitializer() { 
     super(WebSecurityConfiguration.class); 
    } 
} 

,問題仍然存在,雖然走線是一個有點不同。

那麼這怎麼治好?也許有一種方法可以擺脫Google App Engine上的web.xml? 謝謝。

回答

0

我發現了一些有用的信息here。 問題是WebApplicationInitializer需要Servlet 3.0,但Appengine只支持Servlet 2.5。所以我們必須使用普通的基於XML的配置,至少用於初始化。並手動配置web.xml中的Spring filter/servlet。 不幸的是我沒有完全將spring配置移動到xml而使其工作,只是添加spring-security.xml不起作用。

我們也可以投票支持Servlet 3.0支持here,但不幸的是Google似乎沒有任何計劃來添加它。

0

如果您保留java配置然後創建一個空的web.xml例如

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    version="3.1"> 

</web-app> 
+0

這樣的事情不起作用,它不應該。 –

相關問題