亂碼問題(javaweb)

出現(xiàn)亂碼一般都是post居多

解決post get 請求亂碼

在 Tomcat 為 URIEncoding="utf-8" 前提下,為啥post 字符串的格式還是 ISO-8859-1 ?

方式一:SpringMVC過濾器

據(jù)說:極端情況下.這個過濾器對get的支持不好(鄙人沒發(fā)現(xiàn)茎毁,這個就挺好)

    <filter>
        <filter-name>CharacterEncodingFilter</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>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

springmvc.png

方式二:更改Tomcat 編碼配置 URIEncoding="utf-8"

我咋覺著沒啥用呢(實測沒啥用,改了兼容性好秸妥。沒有問題不改也行)
配置文件路徑:apache-tomcat-8.5.72/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="utf-8"
               connectionTimeout="20000"
               redirectPort="8443" relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%" />
tomcat-config.png

方式三:抄大神作業(yè)

springmvc 不好用就試試這個。


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

public class GenericEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //處理response的字符編碼
        HttpServletResponse myResponse=(HttpServletResponse) response;
        myResponse.setContentType("text/html;charset=UTF-8");
        // 轉(zhuǎn)型為與協(xié)議相關(guān)對象
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        // 對request包裝增強
        HttpServletRequest myrequest = new MyRequest(httpServletRequest);
        chain.doFilter(myrequest, response);
    }


}

//自定義request對象盹憎,HttpServletRequest的包裝類
class MyRequest extends HttpServletRequestWrapper{

    private HttpServletRequest request;

    // 是否編碼
    private boolean hasEncode;

    // 定義一個可以傳入 入HttpServletRequest對象的構(gòu)造函數(shù)筛峭,以便對其進行裝飾
    public MyRequest(HttpServletRequest request) {
        super(request);// super必須寫
        this.request = request;
    }

    // 對需要增強方法 進行覆蓋
    @Override
    public Map<String, String[]> getParameterMap() {
        // 先獲得請求方式
        String method = request.getMethod();
        if (method.equalsIgnoreCase("post")) {
            // post請求
            try {
                // 處理post亂碼
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

        }else if (method.equalsIgnoreCase("get")){
            // get請求
            Map<String, String[]> parameterMap = request.getParameterMap();
            if (!hasEncode) { // 確保get手動編碼邏輯只運行一次
                for (String parameterName : parameterMap.keySet()) {
                    String[] values = parameterMap.get(parameterName);
                    if (values != null) {
                        for (int i = 0; i < values.length; i++) {

                            String targetStr = values[I];
                            String encode = "ISO-8859-1";
                            try {
                                //  "ISO-8859-1" 轉(zhuǎn)為 utf-8
                                if (targetStr.equals(new String(targetStr.getBytes(encode), encode))) {
                                    try {
                                        // 處理get亂碼
                                        values[i] = new String(values[i].getBytes(encode), "utf-8");
                                    } catch (UnsupportedEncodingException e) {
                                        e.printStackTrace();
                                    }
                                }
                            } catch (final UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                hasEncode = true;
            }
            return parameterMap;
        }
        return super.getParameterMap();
    }

    @Override
    public String getParameter(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values == null) { return null; }
        return values[0]; // 取回參數(shù)的第一個值
    }

    @Override
    public String[] getParameterValues(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        return values;
    }
}

copy.png

處理請求返回json字符串的中文亂碼問題

方式一、通過spring 配置一次性解決亂碼

<mvc:annotation-driven>
      <mvc:message-converters register-defaults="true">
         <!-- StringHttpMessageConverter編碼為UTF-8陪每,防止亂碼 -->
         <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg value="UTF-8" />
         </bean>
         <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
               <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                  <property name="failOnEmptyBeans" value="false"/>
               </bean>
            </property>
         </bean>
      </mvc:message-converters>
   </mvc:annotation-driven>

方式二影晓、produces:指定響應(yīng)體返回類型和編碼

@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")
json1.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市檩禾,隨后出現(xiàn)的幾起案子挂签,更是在濱河造成了極大的恐慌,老刑警劉巖盼产,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饵婆,死亡現(xiàn)場離奇詭異,居然都是意外死亡戏售,警方通過查閱死者的電腦和手機侨核,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灌灾,“玉大人搓译,你說我怎么就攤上這事》嫦玻” “怎么了些己?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵豌鸡,是天一觀的道長。 經(jīng)常有香客問我段标,道長涯冠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任逼庞,我火速辦了婚禮蛇更,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赛糟。我一直安慰自己械荷,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布虑灰。 她就那樣靜靜地躺著,像睡著了一般痹兜。 火紅的嫁衣襯著肌膚如雪穆咐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天字旭,我揣著相機與錄音对湃,去河邊找鬼。 笑死遗淳,一個胖子當著我的面吹牛拍柒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屈暗,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拆讯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了养叛?” 一聲冷哼從身側(cè)響起种呐,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弃甥,沒想到半個月后爽室,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡淆攻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年阔墩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓶珊。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡啸箫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艰毒,到底是詐尸還是另有隱情筐高,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站柑土,受9級特大地震影響蜀肘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稽屏,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一扮宠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狐榔,春花似錦坛增、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庵楷,卻和暖如春罢艾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尽纽。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工咐蚯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弄贿。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓春锋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親差凹。 傳聞我的和親對象是個殘疾皇子期奔,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容