web中過濾器的使用與亂碼問題解決

來源:互聯網
上載者:User

標籤:arc   error   ofo   fhs   gms   rar   ++   rbm   out   

一、過濾器Filter1.filter的簡介

filter是對用戶端訪問資源的過濾,符合條件允許存取,不符合條件不允許存取,並且可以對目   標資源訪問前後進行邏輯處理

2.快速入門

步驟:

1)編寫一個過濾器的類實現Filter介面

2)實現介面中尚未實現的方法(著重實現doFilter方法)

3)在web.xml中進行配置(主要是配置要對哪些資源進行過濾)

(1)建立Filter實現Filter

攔截之後要允許存取。

package 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;public class FirstFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        // TODO Auto-generated method stub    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {//        自動攔截請求            System.out.println("filter running.......");//            允許存取            chain.doFilter(request, response);    }    @Override    public void destroy() {        // TODO Auto-generated method stub    }}

 

(2)Web.xml配置一下
<filter>      <filter-name>FirstFilter</filter-name>      <filter-class>filter.FirstFilter</filter-class>  </filter>  <filter-mapping>      <filter-name>FirstFilter</filter-name>      <url-pattern>/*</url-pattern>  </filter-mapping>

 

/*代表所有請求,如果不允許存取,用戶端得不到響應。

3.Filter的API詳解(1)filter生命週期及其與生命週期相關的方法

Filter介面有三個方法,並且這個三個都是與Filter的生命相關的方法

init(Filterconfig):代表filter對象初始化方法 filter對象建立時執行

doFilter(ServletRequest,ServletResponse,FilterCha):代表filter執行過濾的核心方法,如果某資源在已經被配置到這個filter進行過濾的話,那麼每次訪問這個資源都會執行doFilter方法

destory():代表是filter銷毀方法 當filter對象銷毀時執行該方法

 

Filter對象的生命週期:

Filter何時建立:伺服器啟動時就建立該filter對象

中間在用戶端訪問過濾器過濾的資源時調用doFilter方法

Filter何時銷毀:伺服器關閉時filter銷毀

 

(2)Filter的API詳解

1)init(FilterConfig)

其中參數config代表 該Filter對象的配置資訊的對象,內部封裝是該filter的配置資訊。

 

2)destory()方法

filter對象銷毀時執行

3)doFilter方法

doFilter(ServletRequest,ServletResponse,FilterChain)

其中的參數:

ServletRequest/ServletResponse:每次在執行doFilter方法時 web容器負責建立一個request和一個response對象作為doFilter的參數傳遞進來。該request個該response就是在訪問目標資源的service方法時的request和response。

FilterChain:過濾器鏈對象,通過該對象的doFilter方法可以允許存取該請求

 

4.Filter的配置
<filter>      <filter-name>Filter2</filter-name>      <filter-class>filter.Filter2</filter-class>       <init-param>          <param-name>name</param-name>          <param-value>dahua</param-value>      </init-param>  </filter>  <filter-mapping>      <filter-name>Filter2</filter-name>      <url-pattern>/*</url-pattern>      <dispatcher>REQUEST</dispatcher>  </filter-mapping>

 

也可以直接攔截Servlet(等價於url-pattern   /sertvle1)

<filter-mapping>      <filter-name>Filter2</filter-name>      <servlet-name>servlet</servlet-name>  </filter-mapping>
①url-pattern配置時(不用寫工程名字,直接寫路徑)

1)完全符合  /sertvle1

2)目錄匹配  /aaa/bbb/* ----最多的

/user/*:訪問前台的資源進入此過濾器

/admin/*:訪問背景資源時執行此過濾器

3)副檔名匹配  *.abc  *.jsp

 

注意:url-pattern可以使用servlet-name替代,也可以混用

 

dispatcher:訪問的方式(瞭解)

REQUEST:預設值,代表直接存取某個資源時執行filter

        轉寄攔截一次,重新導向2次

FORWARD:轉寄時才執行filter

INCLUDE: 包含資源時執行filter

ERROR:發生錯誤時 進行跳轉是執行filter

 

5.總結Filter的作用?

1)公用代碼的提取

2)可以對request和response中的方法進行增強(裝飾者模式/動態代理)

3)進行許可權控制

6.總結

1.Filter先寫實現方法,再在web.xml中配置(名字,映射以及攔截的請求)

url-pattern配置時  不寫工程名字

1)完全符合  /sertvle1

2)目錄匹配  /aaa/bbb/* ----最多的

/user/*:訪問前台的資源進入此過濾器

/admin/*:訪問背景資源時執行此過濾器

3)副檔名匹配  *.abc  *.jsp

2.過濾器的執行順序根據你在web.xml中映射的順序執行。

3.可以過濾使用者請求:

package web.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;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import daomain.User;public class RequestFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        // TODO Auto-generated method stub            }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        // TODO Auto-generated method stub        HttpServletRequest req =(HttpServletRequest) request;        HttpServletResponse res = (HttpServletResponse) response;        HttpSession session = req.getSession();        User user = (User) session.getAttribute("user");        if(user==null){            request.getRequestDispatcher("/index.jsp").forward(request, response);        }        else{            System.out.println(user);        }        chain.doFilter(request, response);    }    @Override    public void destroy() {        // TODO Auto-generated method stub            }    }

 

二、設定編碼格式1.post提交(1)編寫過濾器代碼
@Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        request.setCharacterEncoding("utf-8");        chain.doFilter(request, response);    }
(2)Web.xml中隊所有請求攔截(3)後台直接接受post提交的中文資料2.get提交

接收前端:

String para = request.getParameter("name");String para2 = new String(para.getBytes("iso-8859-1"),"utf-8");

 

向前端發送
//設定response查詢的碼錶         //response.setCharacterEncoding("UTF-8");                //通過一個頭 Content-Type 告知用戶端使用何種碼錶        //response.setHeader("Content-Type", "text/html;charset=UTF-8");        //        這句與上句等價,開發中只用寫這句,tomcat自動化佈建第一句        response.setContentType("text/html;charset=UTF-8");

 

三、裝飾者模式解決亂碼
package filter;import java.io.IOException;import java.io.UnsupportedEncodingException;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 EncodingFilter implements Filter{        @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {                //request.setCharacterEncoding("UTF-8");                //在傳遞request之前對request的getParameter方法進行增強        /*         * 裝飾者模式(封裝)         *          * 1、增強類與被增強類要實現統一介面         * 2、在增強類中傳入被增強類         * 3、需要增強方法重寫 不需要增強方法調用被增強對象的         *          */                //被增強對象        HttpServletRequest req = (HttpServletRequest) request;        //增強對象        EnhanceRequest enhanceRequest = new EnhanceRequest(req);                        chain.doFilter(enhanceRequest, response);            }    @Override    public void destroy() {            }        @Override    public void init(FilterConfig filterConfig) throws ServletException {            }}class EnhanceRequest extends HttpServletRequestWrapper{        private HttpServletRequest request;    public EnhanceRequest(HttpServletRequest request) {        super(request);        this.request = request;    }        //對getParaameter增強    @Override    public String getParameter(String name) {        String parameter = request.getParameter(name);//亂碼        try {            parameter = new String(parameter.getBytes("iso8859-1"),"UTF-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        return parameter;    }    }

 

web中過濾器的使用與亂碼問題解決

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.