복붙노트

[SPRING] Vaadin / Spring 애플리케이션에서 정적 리소스를 제공하는 방법은 무엇입니까?

SPRING

Vaadin / Spring 애플리케이션에서 정적 리소스를 제공하는 방법은 무엇입니까?

나는 인증을위한 봄 보안 통합과 Vaadin 웹 응용 프로그램이 있습니다. Vaadin 서블릿의 설정은 매우 간단합니다.

<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 Context를 초기화하고 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 구조는 다음과 같습니다.

분명히 모든 요청이 vaadin 서블릿에 매핑되기 때문에 이미지 나 CSS가로드되지 않습니다. Vaadin 서블릿에서 제공하지 않는 정적 리소스 디렉토리를 어떻게 정의 할 수 있습니까? 나는 spring mvc : resources를 시도했으나 작동하지 않았다. 도와 줘서 고마워.

안녕, 필립

나는 이것을 알아 냈다. 그것은 다소 일시적인 해결책이지만. 나는 Vaadin Application Servlet을 / app / *와 같은 것으로 매핑했다. / * (이 경우에는 동일한 서블릿을 / VAADIN / *에 매핑해야 함). 이 구성을 사용하면 webapp에서 jsp 디렉토리에 액세스 할 수 있으며 모든 것이 올바르게 작동합니다. 이것이 작동하지 않았기 때문에 전체 Spring 리소스 설정을 삭제했습니다.

그래서 한 번 더, 나는 아직도이 솔루션에 꽤 안락한 편이고, 다른 방법으로 구성된 나의 리소스를 갖고 싶지만, 클라이언트는 행복하다. :) 누구든지 올바른 해결책을 가지고 있다면 그것을 읽어 주셔서 감사합니다.

해결법

  1. ==============================

    1.URL 재 작성 필터를 사용하여 URL 맵핑을보다 잘 제어하십시오.

    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에 매핑하고 urlrewrite.xml에 url 매핑을 구성합니다

     <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 / 디렉토리에 정적 파일을 넣는 것입니다.

  2. ==============================

    2.나는 이것을 알아 냈다. 그것은 다소 일시적인 해결책이지만. 나는 Vaadin Application Servlet을 / app / *와 같은 것으로 매핑했다. / * (이 경우에는 동일한 서블릿을 / VAADIN / *에 매핑해야 함). 이 구성을 사용하면 webapp에서 jsp 디렉토리에 액세스 할 수 있으며 모든 것이 올바르게 작동합니다. 이것이 작동하지 않았기 때문에 전체 Spring 리소스 설정을 삭제했습니다.

    나는 이것을 알아 냈다. 그것은 다소 일시적인 해결책이지만. 나는 Vaadin Application Servlet을 / app / *와 같은 것으로 매핑했다. / * (이 경우에는 동일한 서블릿을 / VAADIN / *에 매핑해야 함). 이 구성을 사용하면 webapp에서 jsp 디렉토리에 액세스 할 수 있으며 모든 것이 올바르게 작동합니다. 이것이 작동하지 않았기 때문에 전체 Spring 리소스 설정을 삭제했습니다.

    그래서 한번 더, 나는 아직도이 솔루션에 꽤 편하지 않고 오히려 내 리소스를 다른 방법으로 구성 하겠지만 c

  3. ==============================

    3.늦어 졌을 지 모르지만 vaadin / * 매핑을 사용하는 동안 여전히 정적 인 컨텐츠를 제공하는 데 문제가있는 사람은 아파치의 기본 서블릿 org.apache.catalina.servlets.DefaultServlet을 사용하여 해결책을 찾았습니다. 따라서 web.xml은 다음과 같이됩니다.

    늦어 졌을 지 모르지만 vaadin / * 매핑을 사용하는 동안 여전히 정적 인 컨텐츠를 제공하는 데 문제가있는 사람은 아파치의 기본 서블릿 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에 의해 정적 컨텐츠로 제공됩니다

  4. from https://stackoverflow.com/questions/9292439/how-to-serve-static-resources-from-a-vaadin-spring-application by cc-by-sa and MIT license