1. 程式人生 > >Filter過濾器(Servlet)

Filter過濾器(Servlet)

過濾器 一個 rac ini per response 格式 troy set

Filter,簡單的說就是用來過濾從客戶端發送到服務器端的信息。

創建Filter的過程:

1.創建一個類實現Filter接口:

public class MyFilter implements Filter

2.在配置文件中修改配置信息:

 <filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <
filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

過濾器相關的配置和過濾鏈:

配置:

url-partern :指示在哪個位置進行攔截(過濾)

dispacher :包含四個內置屬性:

  ERROR:錯誤頁面跳轉

  FORWORD:請求轉發

  INCLUDE:請求包含(頁面中包含的文件)

  REQUEST:請求request

過濾鏈:

FilterChain:將過濾器連接成一條鏈。放行方向為下一個過濾器,這個順序是由在XML文件中filter-mapping的順序決定的;如果沒有下一個過濾器就指向服務器

應用:將Request請求信息進行過濾用來解決中文亂碼問題

1.創建過濾器類:

package com.filter;

import java.io.IOException;

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; public class MyFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //將request增強 //創建一個request的對象,因為這裏是ServletRequest的request不能使用HTTPServletRequest的特有的傳遞doGet,doPost方法,所以要向下轉型 HttpServletRequest req = (HttpServletRequest) request; SuperHttpServletRequest superRequest = new SuperHttpServletRequest(req); chain.doFilter(superRequest, response); } @Override public void destroy() { } }

2.創建重寫類,重寫getParameter方法,使得該方法加強

package com.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class SuperHttpServletRequest extends HttpServletRequestWrapper {
    /**
     * 實現的是類而不是接口的好處:實現接口就要實現其所有的方法
     * 而類只需要重寫就行了,因為繼承類的話會自動繼承父類的所有方法
     * ServletRequest是頂層接口,裏面定義了getParameter方法,而HttpServletRequestWrapper是第一個實現該接口
     * 所有方法的類,所以直接繼承該類重寫方法就行了
     */
    private HttpServletRequest request;
    public SuperHttpServletRequest(HttpServletRequest request) {
        super(request);
        //將父類中的request賦值給該類中的request
        this.request=request;
    }

    @Override
    public String getParameter(String name) {
        //獲取請求方式
        String method = request.getMethod();
        //如果是get請求,get請求的解決中文亂碼的方式是用utf-8重構字符串
        if("get".equalsIgnoreCase(method)) {
            String parameter = super.getParameter(name);
            try {
                parameter = new String(parameter.getBytes("ISO-8859-1"),"utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return parameter;
            //如果是post請求,post請求解決中文亂碼的方式是重新設置字符緩沖區的編碼格式
        }else if("post".equalsIgnoreCase(method)) {
            try {
                request.setCharacterEncoding("utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return request.getParameter(name);
    }
}

Filter過濾器(Servlet)