java post、get中文亂碼問題

1、post方式提交中文亂碼處理

1、jsp頁面編碼設爲”UTF-8”

<%@ page language="java" import="java.util.*" pageEncodint="UTF-8"%>

2、form表單提交方式必須爲post,get方式提交spring編碼過濾器不起效

3、修改web.xml,增加編碼過濾器

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

兩個參數的作用

1>、encoding

用來指定一個具體的字符集

2>、forceEncoding

Spring裏的字符過濾器CharacterEncodingFilter是針對請求的,forceEncoding=true意思是指無論客戶端請求是否包含了編碼,都用過濾器裏面的編碼來解析請求
2、get方式提交中文亂碼處理

上面的過濾器,過濾了所有請求。但還是有問題,最後發現是表單的問題,在表單中method默認是get,而以上過濾器只對post有效果,如果是get,需要修改 Tomcat根式目錄的 conf/server.xml文件中,找,在裏面加,URIEncoding解決了queryString中文問題

3、post和get可以同用一個過慮器處理

public class EncodingFilter implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        System.out.println("get 方法中文處理");
        //處理響應編碼
        res.setContentType("text/html,charset=utf-8");

        //處理post請求的編碼
        request.setCharacterEncoding("utf-8");
        //若是get請求就使用裝飾類的方法獲取參數
        if(req.getMethod().equals("GET")) {
            HttpServletRequest newReq = new MyRequest(req);
            /*
             * 調包request 1. 自己定義的request的裝飾類 2. 在攔截通過時,使用我們自己定義request 3.
             * 在Servlet中
             * ,只有你調用request.getParameter(name)方法本質就是執行自己定義的request.getParameter
             * (name)方法
             */
            filterChain.doFilter(newReq, response);
        }else {
            filterChain.doFilter(request,response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

下面是引用的裝飾類

public class DecodingRequest extends HttpServletRequestWrapper {  

    private HttpServletRequest req;
    public MyRequest(HttpServletRequest request) {  
        super(request);  
        this.req = request;
    }  

    @Override
    public String getParameter(String name) {  
        try {
            name = new String(req.getParameter(name).getBytes("iso8859-1"),"utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return name;
    }
} 

web.xml中的配置

<filter>
    <filter-name>encoding</filter-name>
    <filter-class>com.hx.filter.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>  
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

但是還存在一問題,
url訪問:http://zzy.tunnel.qydev.com/springmvc_demo/login/doLogin.do?name=國慶快樂
接收參數的方法:

    @RequestMapping("/doLogin.do")
        public ModelAndView doLogin(HttpServletRequest req,HttpServletResponse res,ModelMap map,String name) {
            map.put("user", name);
            return new ModelAndView("hello");
        }

這個參數拿到的參數還是亂碼,歡迎您 国庆长å,需要第2步中的把uriEncoding=UTF-8‡

4、連接數據庫時的中文設置

url=”jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8”;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章