【问题标题】:Spring Character Encoding春季字符编码
【发布时间】:2025-12-13 13:35:02
【问题描述】:

我正在尝试向控制器发送西里尔符号。 当我通过 AJAX 和 GET 方法传递参数时发送到控制器时,我收到 ISO-8859-1

在我的jsp上面:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

我尝试创建自定义过滤器,但它不起作用,传入编码到响应总是 ISO-8859-1

@WebFilter(urlPatterns = "/*")
public class EncodingFilter implements Filter {

//INIT method

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest servletRequest = (HttpServletRequest) request;
    HttpServletResponse servletResponse = (HttpServletResponse) response;

    String requestEncoding = servletRequest.getCharacterEncoding();

    if (requestEncoding == null) {
        servletRequest.setCharacterEncoding(ENCODING);
    }

    String responseEncoding = servletResponse.getCharacterEncoding();

//        if (responseEncoding == null) {
//            servletResponse.setCharacterEncoding(ENCODING);
//        }
        servletResponse.setCharacterEncoding(ENCODING);

    chain.doFilter(servletRequest, servletResponse);
}

//DESTROY method

我已经尝试配置 MessageConverters

 @Configuration
 @EnableWebMvc
 public class WebConfig extends WebMvcConfigurerAdapter {

//Other configuration

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
    stringConverter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8"))));
    converters.add(stringConverter);

}
}

还有 Spring CharacterEncodingFilter

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
protected String[] getServletMappings() {
    return new String[]{"/"};
}

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[]{ApplicationConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[]{WebConfig.class};
}

@Override
protected Filter[] getServletFilters() {

    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");
    characterEncodingFilter.setForceEncoding(true);
    return new Filter[] { characterEncodingFilter};
}
}

但这无济于事, AJAX 请求

    $(window).load(function(){

$("#firstUser").keyup(function(){
var value = $(this).val();
console.log(value);

 var searchRequest = $.ajax({
                type: "GET",
                url: "calc/name",
                encoding: "UTF-8",
                data: {
                    'userName' : value
                },
                dataType: "text",
                success: function(msg){

                }
            });

            })
});

【问题讨论】:

  • Spring 已经有一个过滤器,CharacterEncodingFilter 只需正确配置即可。我建议使用AbstractAnnotationConfigDispatcherServletInitializer 而不是自己编写。但是我怀疑错误在于您发送 ajax 请求的方式。
  • 当我发送 ajax 请求时,我设置了 contentType:"charset=utf-8"。尝试使用 AbstractAnnotationConfigDispatcherServletInitializer ,结果相同。
  • 不要试图描述它,而是添加代码。我没有说使用AbstractAnnotationConfigDispatcherServletInitializer,但它会清理你的代码。
  • @M. Deinum 以上更新
  • charset=utf-8 甚至不像一个有效的内容类型。请改用encodingencoding: "utf-8" 而不是 contentType: "charset=utf-8"

标签: java spring spring-mvc filter controller


【解决方案1】:

我修好了。我只是安装其他tomcat版本。 Tomcat7出现问题,Tomcat8一切正常。

PS:两个版本都配置了 server.xml 到 Tomcat/conf 中

PSS:我还将 HttpMessageConverters 配置删除到 WebConfig 中。这不会影响编码。

【讨论】: