场景描述:
前端发送ajax请求向后台查询商品数据,得到数据后将商品信息加入到页面中。
$.ajax({
url: url,
type: "get",
data: dataObject,
//traditional: true,
dataType: "json",
success: function (data) {
console.log(data);
},
error: function () {
}
});
出现了商品名称中的中文变成?的现象。猜测是编码问题。
通过浏览器控制台得知接收到的json数据的中文就是问号,问题发生在后端。
编写filter设置servletResponse的编码,没能解决问题
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(value="/*")//拦截所有请求和响应
@Component
public class ServletFilter implements Filter {
@Override
//初始化方法
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//统一处理请求和响应的乱码
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
//过滤完之后需要放行请求和响应
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
//销毁方法
public void destroy() {
}
}
解决方法:
1.在请求映射的注解中添加 produces="application/json;charset=utf-8"
如:
@ResponseBody
@GetMapping(value="/product/{index}/{count}"
,produces = "application/json;charset=utf-8"
)
public String getProductBySearch(@RequestParam(required = false) String product_name/* 产品名称 */,
JSONObject object = new JSONObject();
//object.put(...,...);
return object,toJSONString();
}
这种方法需要改动多个请求映射的注解
2.在springMVC里配置StringHttpMessageConverter
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
3.写配置类,实现WebMvcConfigurer,添加messageConverter
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
WebMvcConfigurer.super.configureMessageConverters(converters);
StringHttpMessageConverter converter = new StringHttpMessageConverter();
converter.setDefaultCharset(StandardCharsets.UTF_8);
converters.add(converter);
}
}