开发者社区> 问答> 正文

Spring 3.1.4 MVC ajax 异步请求中文乱码 400 请求报错 

基于Spring 3.1.4.RELEASE MVC 的 web 应用 ajax 异步请求中文乱码bug有解决方案吗?
@红薯 如果没错的话,应该是个bug。spring 组织中不知道是哪只猿居然在 StringHttpMessageConverter 中 写下这行代码
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

展开
收起
kun坤 2020-05-28 16:31:26 660 0
1 条回答
写回答
取消 提交回答
  • 自己解决了。Spring默认用的是Jackson, 只要改下pom文件引入Jackson 的jar包就OK了。###### 一句话就解决了

    1. @RequestMapping(params="x", produces="text/plain;charset=utf-8")  
    2. or 
    3. produces = "text/html;charset=UTF-8"  
    ajax 请求和普通的 http 请求,其实并没有什么区别的。

    你具体使用的情况详细描述下吧 ###### 嗯 这是个bug 我是直接把那个类复制过来了 然后改成了utf-8就可以了

    ######回复 @熊大信了熊二的话 : 没有办法通过配置文件来解决?######@Minuzy 我用的也是maven 你直接把这个类安装org.springframe的路径直接拷贝过去。放在src下面就可以了######我也考虑到修改源码的问题,但是我用的Maven管理,没有自己的仓库,修改后的源码不知道放到哪去。所以只能想有没有不修改源码的方案。###### @红薯 您看下。http请求正常。就是ajax 请求是乱码,firebug 抓取到的 Response的信息 Content-Type:text/plain;charset=ISO-8859-1

    @ResponseBody @RequestMapping(value = "/test", method = RequestMethod.POST) public String register() {

    ResultVO resultVO = new ResultVO(true);

    resultVO.setMessage("[中文测试]"); return new Gson().toJson(resultVO); }

    // ResultVO 是个简单的VO

    ######回复 @Minuzy : new Gson().toJson(resultVO)都是多余,直接 return resultVO,方法返回resultVO不是String,Spring自动转json###### @午后冬日 请问Controller中的用的是跟我一样返回String吗?还是返回ModelAndView?######default就是让你自己再设置。人家就是英文没办法。######分享一下你的解决方案。######加端配置就搞定了,网上搜一下满世界都是######ok!等我从厕所出来告诉你######把解决方案贴出来一下呗:)###### 1、自己写一个处理json的view,类似

    public class JsonView extends AbstractView {
    
        @Override
        protected void renderMergedOutputModel(Map<String, Object> map,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            response.setContentType("application/x-www-form-urlencoded;charset=UTF-8");        
            response.setHeader("Cache-Control",
                    "no-store,max-age=0,no-cache,must-revalidate");        
            response.addHeader("Cache-Control", "post-check=0,pre-check=0");        
            response.setHeader("Pragma", "no-cache");
            
            String jsonObj = (String) map.get("ajax_json");
            response.getWriter().write(jsonObj);
            response.flushBuffer();
        }
    Controller里面
    public ModelAndView init(HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            Map<String, String> map = new HashMap<String, String>();
            String imgList = homeService.getInitUrl();
            map.put("ajax_json", imgList);
            return new ModelAndView("jsonView", map);
        }
    或者 2、SpringMVC默认是用Jackson处理json的,converter使用MappingJackson2HttpMessageConverter,charset默认就是utf-8,mediatype是application-json ######谢谢你!这样那还不如覆盖原有类方便。。:)######老外的默认编码都是 iso8859-1###### 解决请求乱码问题,加在WEB-INF/web.xml文件中
    <!--解决spring乱码问题 -->
        <filter>
            <filter-name>encoding</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>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    解决返回数据乱码问题,加在spring配置文件中
    <bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >        
            <property name="messageConverters">
                <list>
                    <!-- 设置返回字符串编码 -->
                    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                        <property name = "supportedMediaTypes">
                            <list>
                                <value>text/html;charset=UTF-8</value>
                            </list>
                        </property>
                    </bean>
                    <!-- json转换器 -->
                    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
                        <property name="supportedMediaTypes">
                            <list>
                                <value>text/html;charset=UTF-8</value>
                            </list>
                        </property>
                    </bean>
                </list>
            </property>
        </bean>
    ######我当时用springMVC返回json的时候也是这样处理的,defaut_encoding就是表示什么都没设的时候的默认值,forceEncoding就是你当前需要设置的编码,至少我们以前那样做是OK的。######回复 @午后冬日 : 我这反正是不行。:)######回复 @Minuzy : 我的项目里就是这样配置的######您尝试过吗?
    2020-05-29 11:09:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多