過慮器簡介:
過慮器能對客戶的請求進行預先處理,然後再將請求轉寄給其他web組件。
過慮器是在Servlet2.3規範中定義的,它可以對Web組件的,ServletRequest和ServletResponse進行檢查和修改。
過慮器本身並不產生ServletRequest對象和ServletResponse對象,它只對web組件提供以下過慮功能:
在web組件調用之前檢查request,並修改要求標頭和請求本文。
過慮器能夠在web組件被調用之後檢查response對像,修改回應標頭和響應本文。
自訂的過慮器必須實現:javax.servlet.Filter介面。此介面定義了以下三個方法:
Init(FilterConfig conf) – 過慮器的初始化方法。-初始化工作執行一次(啟動時)。
doFilter(ServletRequest,ServletResponse,FilterChain) – 此方法完成實際的過慮操作。只要是配置的url匹配此過慮器的配置,即執行此方法。
destroy()-Servlet視窗在銷毀過慮器時執行此方法。-銷毀工作也只執行一次。
記性不好,簡單記錄一個demo
web.xml 配置
<filter> <filter-name>zfx</filter-name> <filter-class>cn.zfx.filter.ZFXFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>zfx</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher><!-- 預設 --> </filter-mapping>
/** * 過濾器 */public class ZFXFilter implements Filter{private String encoding ;@Overridepublic void destroy() {System.out.println("掛了。。。。。。。。。");}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {System.out.println("過濾了。。。。。。。" + encoding);req.setCharacterEncoding(encoding);chain.doFilter(req, resp);System.out.println("後處理過濾了。。。。。。。" + encoding);}/** * 可以讀取初始化資訊 */@Overridepublic void init(FilterConfig config) throws ServletException {this.encoding = config.getInitParameter("encoding");}}
過濾器可以做很多事情,如:字元集過濾、設定jsp頁面不緩衝、驗證使用者是否登入、驗證非法字元,其中 request.setCharacterEncoding (“UTF-8”);只可以解決post方式的亂碼,不能解決get方式。所以這裡可以用封裝器模式,封裝request,對request增強,java中IO基本都是用的封裝設計模式
封裝設計模式:
對一個類的增強,一般採取三種式
1、繼承被增強類,即實現一個子類。
2、使用動態代理處理需要增強方法。
3、使用封裝設計模式。(Java中的IO基本上都是封裝設計模式)
以下是使用封裝設計模式增強一個類的步驟:
1、繼承需要增強類。
2、聲明需要增強類為自己的成員變數。
3、書寫一個構造方法接收需要增強類。
4、實現需要增強方法。
5、實現可擴充的其他方法。
封裝設計模式是指:
假定A類是B類的封裝類,那麼類A與類B有同樣的介面,並且類A擁有類B的的執行個體,類A藉助類B的執行個體來實現介面。
/** * 自訂的HttpServletRequest * 通過實現HttpServletRequestWrapper類 * 實現封裝模式 * 用自訂的request實現亂碼的解決方案 * 包括get和post * @author wangjianme */public class MyHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest request;public MyHttpServletRequest(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic String getParameter(String name) {System.err.println("擷取參數。。。。");String param = request.getParameter(name);if(param==null){//如果為空白則直接返回return null;}//注意大小寫問題if(request.getMethod().equalsIgnoreCase("GET")){System.err.println("進行轉碼");//如果是get才進行轉碼,從request中取出編碼模式try {param = new String(param.getBytes("ISO-8859-1"),request.getCharacterEncoding());} catch (UnsupportedEncodingException e) {throw new RuntimeException(e.getMessage(),e);}return param;}else{return param;}}}
/** * 解決亂碼的Filter * @author wangjianme */public class CharacterFilter implements Filter{public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.err.println("開始過慮。。。。");request.setCharacterEncoding("UTF-8");//注意建立自己的requestMyHttpServletRequest req = new MyHttpServletRequest((HttpServletRequest) request);//注意一下面,一定要傳遞自己的req對像,否則不好用的chain.doFilter(req,response);//以下是沒有使用自己的request的,則處理get時必定會出現亂碼//chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {}}