필터의 응용 전역 부호화 해결 - Filter (2)

2812 단어 filter
전역 문자 인코딩 필터
원리: Html Form에서 요청한 매개 변수의 중국어 문제를 처리하기 위해 encoding 매개 변수를 설정하여 어떤 문자 인코딩을 사용할지 나타냅니다.
지식:
개발자는 Filter에서 사용자의 요청과 응답을 대표하는 Request,response 대상을 얻을 수 있기 때문에 프로그래밍에서 Decorator(장식기) 모드를 사용하여 Request,response 대상을 포장하고
포장 대상은 목표 자원을 전달하여 특수한 수요를 실현한다.
package com.jjyy.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 {
	private FilterConfig config = null;
	private String encode = null;
	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 
		response.setContentType("text/html;charset=utf-8");
		// 
		chain.doFilter(new MyHttpServletRequest((HttpServletRequest)request), response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		this.config = filterConfig;
		this.encode = config.getInitParameter("encode")==null?"utf-8":config.getInitParameter("encode");
	}
	// 
	class MyHttpServletRequest extends HttpServletRequestWrapper{
		private HttpServletRequest request = null;
		boolean isNotEncode = true;
		public MyHttpServletRequest(HttpServletRequest request) {
			super(request);
			this.request = request;
		}
		
		@Override
		public Map getParameterMap() {
			try {
				if(request.getMethod().equalsIgnoreCase("POST")){
					request.setCharacterEncoding(encode);
					return request.getParameterMap();
				}else if(request.getMethod().equalsIgnoreCase("GET")){
					//request.getParameterMap() , 
					//request.getParameterMap() map
					Map<String,String[]> map = request.getParameterMap();
					if(isNotEncode){
						for(Map.Entry<String, String[]> entry:map.entrySet()){
							String [] vs = entry.getValue();
							for(int i=0;i<vs.length;i++){
								vs[i]= new String(vs[i].getBytes("iso8859-1"),encode);
							}
						}
						isNotEncode = false;
					}
					return map;
				}else{
					return request.getParameterMap();
				}
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			return super.getParameterMap();
		}
		
		@Override
		public String getParameter(String name) {
			
			return getParameterValues(name)==null?null:getParameterValues(name)[0];
		}
		@Override
		public String[] getParameterValues(String name) {
			return (String[])getParameterMap().get(name);
		}
	}
}

좋은 웹페이지 즐겨찾기