Filter過濾器處理亂碼問題
阿新 • • 發佈:2019-01-26
當我們從表單獲取資料時。
當獲取到的資料是中文時,那麼就可能會產生亂碼。
對於Post方式提交的資料,我們可以通過直接設定request和response的編碼方式來解決亂碼問題。
但是Get方式提交的資料,那麼就需要編碼再解碼的方式解決亂碼問題。
比如下面這個程式碼,我們獲取到jsp頁面提交的資料。
中文的資料就產生了亂碼。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("username");
String like = request.getParameterValues("like")[0];
System.out.println(name);
System.out.println(like);
}
我們直接在Servlet裡解決的話,受用範圍比較小,也麻煩。
那麼我們就想了,直接在Filter裡將獲取到的資料處理後再發送給Servlet。
下面看Filter裡我們怎樣實現的。
package com.qianfeng.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class EncodeFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//處理post方式的亂碼
//request.setCharacterEncoding("utf-8");
HttpServletRequest req = (HttpServletRequest) request;
MyRequest myReq = new MyRequest(req);
chain.doFilter(myReq, response);
}
public void destroy() {
}
}
class MyRequest extends HttpServletRequestWrapper
{
ServletRequest r;
private HttpServletRequest req;
MyRequest(HttpServletRequest req)
{
super(req);
this.req = req;
}
// @Override
// public String getParameter(String name) {
// String value = req.getParameter(name);
// try {
// return new String(value.getBytes("ISO8859-1"),"utf-8");
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
// return null;
// }
@Override
public String getParameter(String name) {
Map<String,String[]> map = getParameterMap();
return map.get(name)[0];
}
@Override
public String[] getParameterValues(String name) {
Map<String,String[]> map = getParameterMap();
return map.get(name);
}
boolean flag = true;
@Override
public Map<String,String[]> getParameterMap() {
Map<String,String[]> map = req.getParameterMap();
if(flag){
for(Map.Entry<String, String[]> en:map.entrySet()){
String[] arr = en.getValue();
System.out.println(en.getValue());
System.out.println(arr);
for(int i=0;i<arr.length;i++){
//陣列中的每個值都要再編碼再解碼處理
try {
arr[i] = new String(arr[i].getBytes("ISO8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
flag = false;
}
return map;
}
}
我們來doFilter裡獲取到Request物件。
而我們需要在呼叫getParameter和getParameterValues時就解決亂碼問題。
所以,我們需要實現自己的方法,利用裝飾設計模式,實現MyRequest類。
程式碼就不拆開分析了,直接去上面找。
實現getParameter和getParameterValues方法,然後在方法裡呼叫getParameterMap方法,對提交的資料進行編碼再解碼。
這幾需要注意的地方,我們獲取到的陣列改變的值直接修改的map中的值,因此最好我們直接返回map就可以了。
String[] arr = en.getValue();