You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:57:34