2012-02-15 96 views
3

我有Vaadin Web應用程序與春季安全集成進行身份驗證。 Vaadin servlet的配置非常簡單:如何從Vaadin/Spring應用程序提供靜態資源?

<servlet> 

    <servlet-name>Vaadin Application Servlet</servlet-name> 
    <servlet-class>com.example.SpringApplicationServlet</servlet-class> 
    <init-param> 
     <param-name>applicationBean</param-name> 
     <param-value>mainApplication</param-value> 
    </init-param> 
    <init-param> 
     <param-name>widgetset</param-name> 
     <param-value>com.example.widgetset.CustomWidgetSet</param-value> 
    </init-param> 

</servlet> 

<servlet-mapping> 
    <servlet-name>Vaadin Application Servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

servlet初始化Spring上下文並返回Vaadin應用程序。我也配置了安全性而擁有這樣來配置定製登錄表單:

<servlet> 
    <servlet-name>login</servlet-name> 
    <jsp-file>/jsp/login.jsp</jsp-file> 
</servlet> 
<servlet-mapping> 
    <servlet-name>login</servlet-name> 
    <url-pattern>/login</url-pattern> 
</servlet-mapping> 


<servlet> 
    <servlet-name>login_error</servlet-name> 
    <jsp-file>/jsp/loginError.jsp</jsp-file> 
</servlet> 
<servlet-mapping> 
    <servlet-name>login_error</servlet-name> 
    <url-pattern>/login_error</url-pattern> 
</servlet-mapping> 

登錄表單樣式與外部CSS和也有一些圖像。基本上,圖像位於/ jsp/img中,而樣式表位於/jsp/login.css中。所以WAR結構如下:

  • /JSP
  • /META-INF
  • /VAADIN
  • /WEB-INF

無論是圖像還是CSS被加載,因爲顯然所有這些請求都映射到vaadin servlet。我如何定義一些靜態資源目錄,這些目錄不會由Vaadin servlet提供?我已經嘗試過春季mvc:資源,但沒有奏效。感謝您的幫助。

再見, 菲利普

我已經想通了這一點。雖然這是一種解決方法。我已將Vaadin應用程序Servlet映射到/ app/*而不是/ *(請記住,在這種情況下,您還必須將相同的servlet映射到/ VAADIN/*)。有了這個配置,我可以從我的web應用程序訪問jsp目錄,一切正常。我已經刪除了整個Spring資源配置,因爲這只是不起作用。

那麼一次,我還是漂亮不漂亮這個解決方案舒適,寧願讓我的資源目錄配置其他辦法,但客戶端是快樂:)。如果任何人有正確的解決方案,我將不勝感激地閱讀它。

+0

「SpringApplicationServlet」擴展了哪些類? – 2012-02-15 11:35:46

+0

它擴展了com.vaadin.terminal.gwt.server.AbstractApplicationServlet – 2012-02-15 13:18:25

+0

嘗試使用URL映射([Servlet mapping/vs /*](http://stackoverflow.com/a/4140659/267197))或靜態映射資源([Servlet for serving static content](http://stackoverflow.com/a/3582215/267197))。 – 2012-02-18 23:22:55

回答

3

使用一個url重寫過濾器來獲得更多的URL映射控制。

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

然後映射Vaadin應用程序/ vaadin例如,配置URL馬平在urlrewrite.xml

<rule> 
    <from>/styles/**</from> 
    <to last="true">/styles/$1</to> 
</rule> 
<rule> 
    <from>/images/**</from> 
    <to last="true">/images/$1</to> 
</rule> 
<rule> 
    <from>/**</from> 
    <to>/vaadin/$1</to> 
</rule> 
<outbound-rule> 
    <from>/vaadin/**</from> 
    <to>/$1</to> 
</outbound-rule> 

編輯 另一種選擇是把靜態文件/ VAADIN /目錄。

+0

這不起作用,因爲它僅翻譯URL請求。我肯定需要一些服務於這個靜態資源的servlet。更何況,這些規則是不正確的。不過謝謝你。 – 2012-02-15 14:00:03

1

我已經想通了。雖然這是一種解決方法。我已將Vaadin應用程序Servlet映射到/ app/*而不是/ *(請記住,在這種情況下,您還必須將相同的servlet映射到/ VAADIN/*)。有了這個配置,我可以從我的web應用程序訪問jsp目錄,一切正常。我已經刪除了整個Spring資源配置,因爲這只是不起作用。

那麼一次,我還是漂亮不漂亮這個解決方案舒適,寧願讓我的資源目錄配置的其他方式,但C

0

可能會晚點,但對於誰是仍然有提供靜態內容的問題同時採用vaadin /*映射,我發現這是使用Apache的默認的servlet org.apache.catalina.servlets.DefaultServlet的解決方案,所以web.xml將有類似:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

    <servlet> 
    <servlet-name>myservlet</servlet-name> 
    <servlet-class>com.vaadin.server.VaadinServlet</servlet-class> 
    <init-param> 
     <param-name>UI</param-name> 
     <param-value>com.ex.myprj.MyUI</param-value> 
    </init-param> 
    <!-- If not using the default widget set--> 
    <init-param> 
     <param-name>widgetset</param-name> 
     <param-value>com.ex.myprj.AppWidgetSet</param-value> 
    </init-param> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>myservlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <servlet> 
    <servlet-name>Static content Servlet</servlet-name> 
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 
    <init-param> 
     <param-name>debug</param-name> 
     <param-value>0</param-value> 
    </init-param> 
    <init-param> 
     <param-name>listings</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Static content Servlet</servlet-name> 
    <url-pattern>/customer/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

所以在上面的例子中,儘管在有vaadin部分將作爲靜態內容由DefaultServlet