Servlet 請求中文亂碼高級處理

在我之前的中文處理方式中是根據傳輸的本質對GET和POST方式進行不同處理,

今天學到了一個高級的處理方式,可以同時處理GET和POST方式


使用 設計模式中的裝飾設計模式 加 過濾器 進行處理,至於 裝飾設計模式和過濾器是什麼,可以自行百度,可能以後我會進行解析

在這裏簡單說 過濾器 就是在執行Servlet 之前先執行的一段代碼,請先明白過濾器是怎麼回事

以下就是使用裝飾設計模式解決亂碼問題,但是隻能解決請求亂碼,解決響應亂碼還是 response.setContextType("text/html;charset=utf-8");


根據之前我講的get請求的解決亂碼方式,請看我之前寫的亂碼原理講解

請求亂碼就是我們使用 request.getParameter(String name); 這個方法獲取值的時候,出現了錯誤,在這裏我用解決GET亂碼的方式一起解決GET和POST


自己對Request對象進行封裝,改變編碼

class MyRequest extends HttpServletRequestWrapper{

	public MyRequest(HttpServletRequest request) {
		super(request);
	}

	@Override
	public String getParameter(String name) {
		String value = super.getParameter(name);
		if(value==null){
		return null;//在這裏需要進行空指針,不然在下面進行編碼轉換時會出現空指針異常
		}
		try {
			byte[] buffer = value.getBytes("iso-8859-1");//這裏還是採用之前解決GET方式亂碼的思路
			value = new String(buffer, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}
	return value;
	}
}

過濾器:攔截請求,改變編碼

public class CheckLoginFilter implements Filter{
	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse response,FilterChain chain) throws IOException, ServletException {
	MyRequest request = new MyRequest((HttpServletRequest)req); //使用自定義的request 解決請求亂碼
	response.setContentType("text/html;charset=utf-8");//原來的方式解決響應亂碼
	chain.doFilter(request, response);//將自定義的request 傳到 Servlet 中,這時在Servlet中獲取的request就是我們自己處理過亂碼的
	}


	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
}










發佈了29 篇原創文章 · 獲贊 39 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章