如何在我的 Maven 项目中正确包含“org.apache.catalina.filters.SetCharacterEncodingFilter”过滤器?

Posted

技术标签:

【中文标题】如何在我的 Maven 项目中正确包含“org.apache.catalina.filters.SetCharacterEncodingFilter”过滤器?【英文标题】:How do I properly include the "org.apache.catalina.filters.SetCharacterEncodingFilter" filter in my Maven project? 【发布时间】:2017-04-16 19:01:10 【问题描述】:

我正在使用 Maven 3.3 和 JBoss 7.1.3.Final (Java 6)。我想在我的网络应用程序中包含一个过滤器,以便所有传入的请求数据都将被编码为 UTF-8。所以我将此添加到我的 web.xml 文件中

<filter>
    <filter-name>CharsetFilter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>requestEncoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
        <filter-name>CharsetFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

还有这个 Maven 依赖项……

            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-catalina</artifactId>
                <version>7.0.0</version>
            </dependency>

但在部署我的应用程序时,我收到以下错误...

WFLYCTL0186:   Services which failed to start:      service jboss.undertow.deployment.default-server.default-host./myproject.UndertowDeploymentInfoService: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./myproject.UndertowDeploymentInfoService: java.lang.ClassNotFoundException: org.apache.catalina.filters.SetCharacterEncodingFilter from [Module "deployment.myproject.war:main" from Service Module Loader]

我需要包含哪些依赖项才能成功部署我的应用程序?

【问题讨论】:

您声称您使用的是 JBoss 7.1.3,但您的错误消息来自 undertow 模块,该模块直到 WildFly 8.x 才出现。 @BalusC:我认为所有 JBossAS 版本(不包括基于 WildFly 的 JBoss EAP)都使用 Tomcat 作为其 Web 容器的基础;他们在将名称更改为 WildFly 的时候转入了低潮 【参考方案1】:

这个问题首先没有意义。

    That filter is part of Tomcat server,不是 JBoss 服务器。 那个 Maven 依赖基本上是在 webapp 中安装 Tomcat 的引擎。如果您实际使用 JBoss AS,这只会与服务器自己的 Tomcat 引擎冲突。 您说您使用的是 JBoss AS,但该错误消息是特定于 JBoss WildFly 的。

我假设您的目标确实是 JBoss WildFly,因此不是 Apache Tomcat 或 JBoss AS。在 JBoss WildFly 中启用 UTF-8 的正确方法是编辑其 /standalone/configuration/standalone.xml 以更改以下行:

<servlet-container name="default">

添加default-encoding 属性:

<servlet-container name="default" default-encoding="UTF-8">

如果您实际上使用 JBoss AS 7.x 并且该错误只是从测试环境中不小心复制粘贴,那么在 JBoss AS 7.x 中启用 UTF-8 的正确方法(以及因此不是 6.x 或更低!)是编辑其 /standalone/configuration/standalone.xml 以在 &lt;extensions&gt;&lt;management&gt; 条目之间添加以下条目:

<system-properties>
    <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8" />
</system-properties>

如果您不允许操作服务器配置和/或希望尽可能多地保持 web 应用程序在不同服务器之间的可移植性,那么您只需自己创建该过滤器即可。以下是基本行:

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter 

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException 
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    

    // ...

只需将该类放到您的 web 应用程序中的任何位置(而不是 JAR 中),它就会自动完成它的工作。

【讨论】:

以上是关于如何在我的 Maven 项目中正确包含“org.apache.catalina.filters.SetCharacterEncodingFilter”过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

收到一个主 jar 文件,其中包含需要在类路径中的其他 jar 文件。在我的 Maven 项目中包含这个主 jar 的最佳方法是啥?

如何将http C库正确包含到Android项目中?

Maven bundle插件无法生成正确的Export-Package

Maven,切换到不同的配置文件

如何使用非 Maven 项目作为 Maven 模块的资源? [复制]

构建包含专有库的maven项目[重复]