Java 如何从Vaadin/Spring应用程序提供静态资源?
我有一个Vaadin web应用程序,它与spring security集成用于身份验证。Vaadin servlet的配置非常简单:Java 如何从Vaadin/Spring应用程序提供静态资源?,java,spring,resources,vaadin,Java,Spring,Resources,Vaadin,我有一个Vaadin web应用程序,它与spring security集成用于身份验证。Vaadin servlet的配置非常简单: <servlet> <servlet-name>Vaadin Application Servlet</servlet-name> <servlet-class>com.example.SpringApplicationServlet</servlet-class> <i
<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>
Vaadin应用程序Servlet
com.example.SpringApplicationServlet
应用程序bean
主要应用
widgetset
com.example.widgetset.CustomWidgetSet
Vaadin应用程序Servlet
/*
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>
登录
/jsp/login.jsp
登录
/登录
登录错误
/jsp/loginError.jsp
登录错误
/登录错误
登录表单是用外部css设计的,还有一些图像。基本上,图像位于/jsp/img中,样式表位于/jsp/login.css中。因此,战争结构看起来像:
- /jsp
- /META-INF
- /瓦丁
- /WEB-INF
我已经弄明白了。虽然这是一个解决办法。我已经将Vaadin应用程序Servlet映射到像/app/*这样的东西,而不是映射到/*(请记住,在本例中,您还必须将同一个Servlet映射到/Vaadin/*)。通过这种配置,我可以从我的webapp访问jsp目录,一切正常。我已经删除了整个Spring资源配置,因为这根本不起作用
所以再一次,我仍然对这个解决方案不太满意,我更愿意用其他方式配置我的资源目录,但客户很高兴:)。如果有人找到了正确的解决方案,我将不胜感激。使用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>
URL重写过滤器
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
URL重写过滤器
/*
然后将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>
/风格/**
/款式/$1
/图像/**
/图片/$1
/**
/瓦丁/1美元
/瓦丁/**
/$1
编辑
另一个选项是将静态文件放在/VAADIN/目录中。我已经解决了这个问题。虽然这是一个解决办法。我已经将Vaadin应用程序Servlet映射到像/app/*这样的东西,而不是映射到/*(请记住,在本例中,您还必须将同一个Servlet映射到/Vaadin/*)。通过这种配置,我可以从我的webapp访问jsp目录,一切正常。我已经删除了整个Spring资源配置,因为这根本不起作用
所以再一次,我仍然对这个解决方案不太满意,我更愿意用其他方式配置我的资源目录,但是c可能会迟到,但是对于那些在使用vaadin
/*
映射时仍然无法提供静态内容的人来说,我找到的解决方案是使用apache的默认servletorg.apache.catalina.servlets.DefaultServlet
,因此web.xml将有如下内容:
myservlet
com.vaadin.server.VaadinServlet
用户界面
com.ex.myprj.MyUI
widgetset
com.ex.myprj.AppWidgetSet
myservlet
/*
静态内容Servlet
org.apache.catalina.servlets.DefaultServlet
调试
0
列表
假的
1.
静态内容Servlet
/顾客/*
因此,在上面的示例中,尽管vaadin位于
/*
,但是/customer/*
部分将由DefaultServlet
作为静态内容使用SpringApplicationServlet
扩展了什么类?它扩展了com.vaadin.terminal.gwt.server.AbstractApplicationServlet尝试使用URL映射()或静态资源()的映射。使用更新此主题的一些主要更改。请参阅LeifÅstrand的这篇2018-07 Vaadin.com博客文章,了解关于放置静态资源的旧方法和新方法,以及Servlet 2和Servlet 3规范之间的关系的一些精彩解释。这不起作用,因为它只转换URL请求。我确实需要一些servlet来支持这些静态资源。更不用说,那些规则是不正确的。不过还是谢谢你。