Servlet URL映射与Filter映射无法同时生效问题求助
问题解决方法
问题原因
访问/dir/foo.data出现404的核心原因是:Servlet的/dir/*属于路径匹配,Filter的*.data属于扩展名匹配,当请求同时符合这两种规则时,部分Servlet容器会优先按扩展名匹配逻辑查找对应资源,但你的应用中没有配置处理*.data的Servlet,因此返回404,导致Filter和目标Servlet无法同时生效。
解决方案
有两种配置方式可以实现Filter与Servlet同时作用于目标请求:
方式一:将Filter直接绑定到目标Servlet
修改Filter的映射配置,放弃仅通过URL后缀匹配,改为指定作用于目标Servlet:
<filter> <filter-name>My Filter</filter-name> <filter-class>filters.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>My Filter</filter-name> <servlet-name>My Servlet</servlet-name> </filter-mapping>
这种配置下,所有被My Servlet处理的请求(包括/dir/foo.data)都会先经过My Filter过滤,再由Servlet响应,彻底避免匹配冲突。
方式二:保留原有Filter规则,同时添加Servlet绑定
如果需要Filter同时处理/somewhere/file.data这类独立的后缀匹配请求,以及/dir下的所有请求,可以添加多组Filter映射:
<filter> <filter-name>My Filter</filter-name> <filter-class>filters.MyFilter</filter-class> </filter> <!-- 处理所有*.data后缀的请求 --> <filter-mapping> <filter-name>My Filter</filter-name> <url-pattern>*.data</url-pattern> </filter-mapping> <!-- 处理My Servlet负责的所有请求 --> <filter-mapping> <filter-name>My Filter</filter-name> <servlet-name>My Servlet</servlet-name> </filter-mapping>
这样既保留了对独立.data文件请求的过滤,也确保了/dir下所有请求(包括带.data后缀的)都会经过Filter处理后交给Servlet响应。
内容的提问来源于stack exchange,提问作者user1636349
相关产品推荐
相关产品推荐

