当前位置: 首页 > 知识库问答 >
问题:

使用Spring MVC Web Application以html形式强制UTF8编码

叶德运
2023-03-14

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

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

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

我的应用程序正在tomcat 8.5上运行。11带Spring5.0。1.网页都是HTML5,我使用JSTL 1.2。5在servlet 3.1环境中。JSON映射和序列化由FasterXML2.9完成。2.

该配置完全基于Java。

我的网络应用初始化器(又名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黑客。但什么都不管用。即使我设置了表单属性接受-charset="UTF-8"和/或编码="应用/x-www-表单-urlencoded; charset=UTF-8"也不会发生任何变化。

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

共有1个答案

仲孙超
2023-03-14

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

在网络上。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);
}

在这里,你有你的过滤器映射回到视线,这是完美的作品!

 类似资料:
  • 问题内容: 我可以在HTML表单中使用PUT方法将数据从表单发送到服务器吗? 问题答案: XHTML 1.x表单仅支持GET和POST。GET和POST是“ method”属性的唯一允许值。

  • 建议选择 safe 方式命名文件名。 经测试,以下修改源码以适应 utf-8 命名方式兼容性也不好。 // 修改\inc\pageutils.php中utf8_encodeFN、utf8_decodeFN两个函数   function utf8_encodeFN($file,$safe=true){ global $conf; //if($conf['fnencode'] == '

  • 问题内容: 最近,我更改了一些要通过ajax显示的页面,但对于为什么utf8编码现在在框内显示一个问号却不知道,我有些困惑。 举个例子。最初的页面是index.php。charset已显式设置为utf8,位于中。然后我用php查询数据库 这是原始的index.php页面: 但是,当我进行更改以添加通过ajax填充“ main_container”的菜单时,所有utf8编码均停止工作。这是新的代码:

  • 问题内容: 我有一些来自json文件的文本。在本文中,我应用了UTF8编码,但是该编码器无法识别非标准字符,并且为大写字符,是否有一种方法可以净化我的字符串? 我的功能: 问题答案: 我找到了解决方案。 UTF8采用8位表ASCII表,而UTF16采用16位ASCII表,解决方案很简单,只需将函数修改为:

  • 问题内容: 我正在使用MVC 4和Entity Framework开发Intranet Web应用程序。我有一个可以通过编辑操作进行修改的人员列表。我想通过使用模式形式使我的应用程序更加动态。所以我试图将编辑视图放入Bootstrap模态,对此我有两个问题: 我应该使用简单视图还是局部视图? 我如何执行验证(实际上它可以工作,但会将我重定向到我的原始视图,因此不以模式形式出现) 我认为我必须使用A

  • 使用 lavas init 创建的模板项目中,在以下场景下都会以编程方式使用 Lavas: server.dev.js 开发环境下的 SPA/SSR 模式。 server.prod.js 生产环境下的 SSR 模式。 可见以编程方式使用 Lavas 的主要场景就是 SSR 模式,而在 SPA 模式下仅仅是供开发服务器使用。因此,如果开发者选择了 SSR 模式,阅读下面的内容将十分有帮助: 如何选择