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

Dav*_*ave 4 jboss tomcat utf-8 maven servlet-filters

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

和这个Maven依赖...

            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-catalina</artifactId>
                <version>7.0.0</version>
            </dependency>
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 5

这个问题首先没有意义.

  1. 该过滤器是Tomcat服务器的一部分,而不是JBoss服务器.
  2. Maven依赖基本上是在webapp中安装Tomcat的引擎.如果您实际使用JBoss AS,这只会与服务器自己的Tomcat引擎冲突.
  3. 您说您正在使用JBoss AS,但该错误消息特定于JBoss WildFly.

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

<servlet-container name="default">
Run Code Online (Sandbox Code Playgroud)

添加default-encoding属性:

<servlet-container name="default" default-encoding="UTF-8">
Run Code Online (Sandbox Code Playgroud)

如果您实际上正在使用JBoss AS 7.x并且该错误仅仅是从测试环境中进行了非常谨慎的复制,那么在JBoss AS 7.x中启用UTF-8(因此不是6.x或更低!)的正确方法是编辑它 /standalone/configuration/standalone.xml以在<extensions><management>条目之间添加以下条目:

<system-properties>
    <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8" />
</system-properties>
Run Code Online (Sandbox Code Playgroud)

如果您不允许操纵服务器配置和/或希望尽可能地保持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);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

只需将该类放在webapp中的任何位置(而不是在JAR中),它就会自动完成其工作.