Liferay Hook XML能否配置多个Servlet Filter?问题排查
单个Liferay Hook中配置多个Servlet Filter的问题
我在Liferay中创建了一个Hook,对应的XML配置如下:
<?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 7.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_7_2_0.dtd"> <hook> <servlet-filter> <servlet-filter-name>Servlet Request Filter</servlet-filter-name> <servlet-filter-impl>package.SecurityFilters</servlet-filter-impl> </servlet-filter> <servlet-filter-mapping> <servlet-filter-name>Servlet Request Filter</servlet-filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </servlet-filter-mapping> <servlet-filter> <servlet-filter-name>Servlet Request DocumentDownloadFilter</servlet-filter-name> <servlet-filter-impl>package.DocumentDownloadFilter</servlet-filter-impl> </servlet-filter> <servlet-filter-mapping> <servlet-filter-name>Servlet Request DocumentDownloadFilter</servlet-filter-name> <url-pattern>/documents/*</url-pattern> <dispatcher>REQUEST</dispatcher> </servlet-filter-mapping> </hook>
部署该Hook后出现如下异常:
The content of element type "hook" must match "(portal-properties?,language-properties*,custom-jsp-dir?,custom-jsp-global?,indexer-post-processor*,service*,servlet-filter*,servlet-filter-mapping*,struts-action*)".
注释掉其中一个Servlet Filter配置后,Hook可正常部署且过滤器能正常工作。根据DTD文档说明(元素名后带*表示可出现0次、1次或多次),我认为应支持多个servlet-filter和servlet-filter-mapping配置,但不清楚问题出在哪。请问能否在单个Liferay Hook中配置两个Servlet Filter?
问题解答
单个Liferay Hook完全支持配置多个Servlet Filter,你的问题出在XML元素的顺序不符合DTD约束。
从异常信息给出的DTD规则可以看到,hook元素下的子元素必须遵循固定顺序:所有servlet-filter元素必须全部放在所有servlet-filter-mapping元素之前,而你的配置是交替定义filter和mapping,这种交叉顺序违反了DTD的要求。
调整配置顺序即可解决问题,将所有servlet-filter配置放在一起,再集中配置所有servlet-filter-mapping:
<?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 7.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_7_2_0.dtd"> <hook> <servlet-filter> <servlet-filter-name>Servlet Request Filter</servlet-filter-name> <servlet-filter-impl>package.SecurityFilters</servlet-filter-impl> </servlet-filter> <servlet-filter> <servlet-filter-name>Servlet Request DocumentDownloadFilter</servlet-filter-name> <servlet-filter-impl>package.DocumentDownloadFilter</servlet-filter-impl> </servlet-filter> <servlet-filter-mapping> <servlet-filter-name>Servlet Request Filter</servlet-filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </servlet-filter-mapping> <servlet-filter-mapping> <servlet-filter-name>Servlet Request DocumentDownloadFilter</servlet-filter-name> <url-pattern>/documents/*</url-pattern> <dispatcher>REQUEST</dispatcher> </servlet-filter-mapping> </hook>
调整后重新部署,Hook就能正常启动,两个过滤器也能正常工作。
内容的提问来源于stack exchange,提问作者fascynacja
相关产品推荐
相关产品推荐

