SpringMVC使用@ResponseBody注解返回中文字符串亂碼的問題


先說一下我的經歷,以及解決問題的而過程。

  在使用SpringMVC的時候,最開始的時候在配置文件中使用<mvc:annotation-driven />去自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter 兩個bean,這是spring MVC為@Controllers分發請求所必須的。再后來,Ajax請求需要返回字符串,遂在控制器上使用@ResponseBody注解來實現,這時候遇到的一個問題是,返回中文字符的時候會亂碼,關於中文亂碼的解決辦法倒時有很多。SpringMVC的@ResponseBody注解使用的處理類為Spring的org.springframework.http.converter.StringHttpMessageConverter類,返回中文亂碼的原因是其默認處理的字符集是ISO-8859-1。So...

  解決辦法1:

    在控制器上加上@RequestMapping(value="/checkLogin",method=RequestMethod.POST,produces="text/html;charset=UTF-8")字符編碼的注解,加上注解之后,中文亂碼的問題的到了解決,但是之后又有了為HandlerMapping添加攔截器的需求,在這里為了精准的添加攔截器,所以放棄使用<mvc:annotation-driven />這句話去自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter 兩個bean,而改為手動注冊。等修改了之后,發現中文亂碼的問題又來了,遂采用了另外一種辦法。

  解決辦法2:

<bean
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="interceptors">
            <list>
                <bean class="cn.ciss.interceptor.LoginInterceptor"></bean>
            </list>
        </property>
    </bean>
    <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/plain;charset=UTF-8</value> -->
                            <value>text/html;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
                <bean
                    class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
                <bean
                    class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
                <bean
                    class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
                <bean
                    class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
                <bean
                    class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
                <bean
                    class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
            </list>
        </property>
    </bean>

  這是自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter的代碼,之所以自己去注冊,是為了增加對SpringMVC的控制能力,比如你想為某個特定的HandleMapping注冊一個攔截器之類的。看以上貼出的代碼可以看到,在注冊org.springframework.http.converter.StringHttpMessageConverter的時候明確了其編碼格式為UTF-8。這種解決辦法也是我比較喜歡的,因為不用再每一個返回中文字符串上的控制器都加一個@RequestMapping(value="/checkLogin",method=RequestMethod.POST,produces="text/html;charset=UTF-8")這樣的注解了。

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM