2012-02-15 4 views
3

У меня есть веб-приложение Vaadin с интеграцией безопасности весов для аутентификации. Конфигурация Vaadin сервлета довольно прост:Как обслуживать статические ресурсы из приложения 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> 

сервлет инициализирует 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? Я пробовал весенний mvc: ресурсы, но это не сработало. Спасибо за помощь.

Bye, Filip

Я понял это. Хотя это довольно обходной путь. Я сопоставил сервлет приложения Vaadin с чем-то вроде/app/* вместо/* (помните, что в этом случае вам также нужно сопоставить тот же сервлет в/VAADIN/*). С этой конфигурацией я могу получить доступ к каталогу jsp из моего webapp, и все работает нормально. Я удалил всю конфигурацию Spring Resources, так как это просто не сработало.

Так что еще раз, я все еще довольно не очень удобен с этим решением и предпочитаю, чтобы мой RESOURCES был настроен другим способом, но клиент счастлив :). Если у кого-то есть правильное решение, я был бы признателен за его чтение.

+0

В каком классе работает 'SpringApplicationServlet'? –

+0

Он расширяет com.vaadin.terminal.gwt.server.AbstractApplicationServlet –

+0

Попробуйте сыграть с отображением URL ([Отображение сервлета/vs /*](http://stackoverflow.com/a/4140659/267197)) или отображение статического ресурс ([Servlet для обслуживания статического контента] (http://stackoverflow.com/a/3582215/267197)). –

ответ

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> 

EDIT Другой вариант поместить статические файлы в/Vaadin/каталог.

+0

Это не сработает, потому что это переводит только запрос URL. Мне определенно нужен какой-то сервлет, за которым служат эти статические ресурсы. Не говоря уже о том, что эти правила неверны. Но спасибо вам в любом случае. –

1

Я понял это. Хотя это довольно обходной путь. Я сопоставил сервлет приложения Vaadin с чем-то вроде/app/* вместо/* (помните, что в этом случае вам также нужно сопоставить тот же сервлет в/VAADIN/*). С этой конфигурацией я могу получить доступ к каталогу jsp из моего webapp, и все работает нормально. Я удалил всю конфигурацию Spring Resources, так как это просто не сработало.

Так что еще раз, я все еще довольно не очень комфортно с этим решением, и предпочел бы иметь свои ресурсы реж настроен другим способом, но с

0

Может быть поздно, но для тех, кто по-прежнему возникают проблемы с обслуживания статического контента при использовании Vaadin /* отображение, решение, которое я нашел использовал Apache по умолчанию сервлет 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 в /*, часть /customer/* будет обслуживаться как статическое содержимое на DefaultServlet

Смежные вопросы