使用 Spring MVC Web 应用程序以 html 形式强制 UTF8 编码

M46

我有一个 spring MVC Web 应用程序并使用 JSP 创建我的网页。问题是,当我直接提交表单时,编码是“application/x-www-form-urlencoded”。当我通过 AJAX 请求从同一个表单提交相同的数据时,编码是“application/x-www-form-urlencoded; charset=UTF-8”。

我需要输入的 utf8 编码字符是我的控制器中的用户。例如:用户输入“äöüß”,我的控制器得到“äöüÔ。当我通过 AJAX 请求发送数据时,我得到正确的“äöüß”。

我究竟做错了什么?这是一个通过 http-post 提交的简单表单。做这个 utf8 编码是不可能的。

我的应用程序在带有 Spring 5.0.1 的 tomcat 8.5.11 上运行。网页都是 HTML5,我在 servlet 3.1 环境中使用 JSTL 1.2.5。JSON 映射和序列化由 fastxml 2.9.2 完成

配置完全基于Java。

我的 WebAppInitializer(又名 web.xml)

...
@Override
protected Filter[] getServletFilters() {
    return new Filter[] { new HiddenHttpMethodFilter(), 
                            new CharacterEncodingFilter("UTF-8", true, true) };
}

在我的 servlet 配置中,我为 StringHttpMessageConverter 显式设置了一个字符集。

...
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
    converters.add(new ResourceHttpMessageConverter());
    converters.add(new MappingJackson2HttpMessageConverter());
}

网页看起来像

<%@page contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@page session="true" %>
<%@page trimDirectiveWhitespaces="true" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<!DOCTYPE html>

<html lang="de">

...

<meta charset="UTF-8"/>

...

<form id="createArticleForm" action="<c:url value='/article/save' />" method="post">
  <input type="hidden" name="utf8" value="&#x2713;" />

...

  <input type="text" name="name" required="required" />

...
</form>

如您所见,我还尝试了带有隐藏字段的 utf8 hacks。但没有任何作用。即使我设置了表单属性 accept-charset="UTF-8" 和/或 encoding="application/x-www-form-urlencoded; charset=UTF-8" 也没有任何变化。

Edit1我检查了从浏览器发送到服务器的 HTTP 请求头。我发现所有参数都是正确的。所以我假设一个弹簧配置问题。

M46

我自己找到了解决方案。问题在于 characterEncodingFilter 的初始化。

在 web.xml 中,您执行以下操作:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

由于 Spring 5 基于 Java 的注释配置受到青睐,根据文档,您可以在 WebApplicationInitializer 中执行以下操作,这比上面的代码简单得多:

@Override
protected Filter[] getServletFilters() {
    return new Filter[] { new HiddenHttpMethodFilter(), 
                            new CharacterEncodingFilter("UTF-8", true, true) };
}

,这是不是在每一个HttpRequest的未来工作正常!

解决方案是不使用提供的便捷方式将过滤器自动映射到 servlet。

相反,您必须:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

      FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("characterEncodingFilter", new CharacterEncodingFilter("UTF-8", true, true));
      filterRegistration.addMappingForUrlPatterns(null, false, "/*");

      filterRegistration = servletContext.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter() );
      filterRegistration.addMappingForUrlPatterns(null, false, "/*");

    super.onStartup(servletContext);
}

在这里,您可以重新看到过滤器映射,这非常有效!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Spring 应用程序中使用嵌入式数据库 MariaDB 为 db 和表指定 utf8 编码?

在Spring MVC Web应用程序中,什么时候应该使用html的<form>和spring的<form:form>?

Spring Boot UTF8编码

使用SpringBoot,Spring的MVC和Maven WEB-INF不包含在Web应用程序

Spring MVC UTF-8编码

Spring MVC Tomcat编码UTF-8

强制Postgres使用UTF8编码而不是LATIN1进行安装?

使用 UTF8 编码的输出数组

使用STS创建新的Web应用程序项目时找不到Spring MVC项目?

使用Spring-MVC降低Java Web应用程序中的部署频率

使用WSSpringServlet的带有SOAP Web服务的Spring MVC应用程序

使用web.xml中的Spring安全性和错误页面保护Spring Web MVC应用程序

如何配置Spring Boot应用程序以支持UTF-8和GBK编码?

在heroku上部署Spring MVC Web应用程序

Spring MVC Web应用程序中的模板

Rails像Spring MVC Web应用程序的Views

Spring MVC连接2种不同的Web应用程序

启动Spring Web MVC应用程序时发生异常

如何在Visual Studio Code上使用web.xml调试Spring MVC Web应用程序?

如何在VC ++ MFC应用程序中使用UTF-8编码

在.html和MVC 4应用程序中使用.html

如何使用构建类或war文件将我的Spring MVC Web应用程序部署到Apache tomat目录中?

我们可以使用Electron工具为Spring Boot Web MVC创建独立的应用程序吗?

使MVC Web应用程序使用默认资源文件

使用context.Database。登录MVC Web应用程序

使用 JavaScript 更改 MVC Web 应用程序中的属性

如何将utf8编码的html嵌入元素

使用intelliJ运行spring mvc应用程序

在前端使用 AngularJs 的 Spring MVC Crud 应用程序