【发布时间】:2018-07-16 20:03:10
【问题描述】:
我有一个 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映射和序列化由fasterxml 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="✓" />
...
<input type="text" name="name" required="required" />
...
</form>
如您所见,我还尝试了带有隐藏字段的 utf8 hack。但没有任何效果。即使我设置了表单属性 accept-charset="UTF-8" 和/或 encoding="application/x-www-form-urlencoded; charset=UTF-8" 也没有任何变化。
编辑1 我检查了从浏览器发送到服务器的 HTTP 请求标头。我发现所有参数都是正确的。所以我假设一个弹簧配置问题。
【问题讨论】:
-
应添加
accept-charset和:<input value="\u2713"> -
@Joop 正如我所写。这不起作用。
-
我理解,但是“这就是我需要的。” 相当不灵活。错误是什么?我以为您仍然将非 ASCII 字符作为数字实体
&#...;- 因此我重写了\u2713 -
例如:我在表单中输入名称“äöüß”,我希望控制器接收这些字符。但相反,我收到“äöüÔ。没有错误,但结果错误。与 AJAX 请求的不同之处在于内容类型,其中在 AJAX 请求中明确设置了字符集,而在正常的表单提交中却没有。
-
然后客户端以 UTF-8 格式发送数据,但服务器假定应答请求采用类似 Latin-1 的格式。这可能是配置或过滤器,但你需要其他人来做这件事,我必须去。
标签: java spring-mvc utf-8 tomcat8 forms http-post