JAVAWEB技術之七過濾器

第七章 過濾器java

JAVAWEB三大組件:Servlet、Filter、Listenerweb

7.1 概念服務器

7.1.1 描述app

過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在服務器上。jsp

它可讓請求獲得目標資源,也能夠不讓請求達到!ide

過濾器有攔截請求的能力!編碼

過濾器是一個服務器端的組件,它能夠攔截客戶端的請求和響應信息,並對這些信息進行過濾。url

Servlet API中提供了一個Filter接口,若是編寫額類實現了這個接口,則稱這個類爲過濾器。Filter接口源碼以下:spa

7.1.2 生命週期.net

7.2 應用場景

  • 自動登陸
  • 統一設置編碼格式
  • 訪問權限控制
  • 敏感字符過濾等

7.3 快速上手

package javax.servlet;
import java.io.IOException;
public interface Filter {
    public void init(FilterConfig filterConfig) throws ServletException;
    public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
    public void destroy();
}1234567

init():初始化方法,建立以後立刻執行,Filter會在服務器啓動時建立!

destory():銷燬方法,銷燬以前執行!在服務器關閉的時候銷燬!

doFilter(ServletRequest,ServletResponse,FilterChain):每次過濾的時候都會執行,重點就是執行過濾的方法。

如何上手:

1.寫一個類實現Filter接口,這個和Servlet是同樣的。

public class AFilter implements Filter {
    public void destroy() {
        System.out.println("銷燬了");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("過濾...");
        //chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        System.out.println("初始化...");
    }
}1234567891011121314

2.在web.xml中進行配置;

<!--在web.xml配置Filter,和Servlet相似
    /:表示當前web目錄,
    *:表示全部文件;
-->
<filter>
    <filter-name>AFilter</filter-name>
    <filter-class>com.tea.filter.AFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
    <!--*:過濾全部;
        /index.jsp:只過濾index.jsp頁面。
		對於其餘頁面放行。
    -->
</filter-mapping>12345678910111213141516

使用註解來建立Filter,這個是你們要掌握的知識點。

@WebFilter("/index.jsp")
public class TestFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

    }
    public void init(FilterConfig config) throws ServletException {

    }
}1234567891011

經常使用配置項
urlPatterns
配置要攔截的資源

  1. 以指定資源匹配。例如"/index.jsp"
  2. 以目錄匹配。例如"/servlet/*",這樣就能夠針對目錄進行過濾。
  3. 之後綴名匹配,例如"*.jsp"
  4. 通配符,攔截全部web資源。"/*"

7.4 多個Filter的執行順序

在咱們的請求到達Servle之間是能夠通過多個Filter的,通常來講,建議Filter之間不要有關聯,各自處理各自的邏輯便可。這樣,咱們也無需關心執行順序問題。
若是必定要確保執行順序,就要對配置進行修改了,執行順序以下

在web.xml中,filter執行順序跟<filter-mapping>的順序有關,先聲明的先執行
使用註解配置的話,filter的執行順序跟名稱的字母順序有關,例如AFilter會比BFilter先執行
若是既有在web.xml中聲明的Filter,也有經過註解配置的Filter,那麼會優先執行web.xml中配置的Filter123

總結:

1.瞭解Filter的概念,做用

2.Servlet和Filter的區別(相同點和不一樣點)

3.瞭解如何使用web.xml來建立Filter,不用掌握

4.掌握使用WebFilter註解的方式來建立Filter

5.掌握過濾攔截資源的4種方式中:/* /*.jsp /xxx.jsp便可,使用可以建立案例便可。

7.5 案例展現

7.5.1 字符集編碼過濾器

@WebFilter("/*")
public class EncodingFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }
}12345678910111213141516

7.5.2 登陸過濾器

URI和URL:

咱們目前只須要根據/後的路徑來判斷便可,不用關注於WEB服務器的路徑,因此目前只用URI便可。

package com.aaa.filter;

import com.aaa.entity.User;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;

/**
 * Created by 張晨光 on 2020/4/24 16:04
 * 過濾全部/*
 */
@WebFilter("/*")
public class LoginFilter implements Filter {
    public void destroy() {
    }

    //最簡單的登陸過濾的思路;
    //複習:過濾器裏面參數:ServletRequest
    //HttpServletRequest:繼承自ServletRequest
    //利用兩個增長的方法:getRequestURI()  getRequestURL()
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.將ServletRequest轉型爲HttpServletRequest;
        HttpServletRequest request= (HttpServletRequest) req;
        //HttpServletResponse response= (HttpServletResponse) resp;
        //2.獲取地址欄的資源路徑;
        String uri = request.getRequestURI();
//        StringBuffer url = request.getRequestURL();
//
//        System.out.println(uri);
//        System.out.println("url:"+url);
        //3.判斷一下資源路徑是不是要登陸的路徑;
        //若是/後是login.jsp或者是loginServlet均可以放行;
        if(uri.contains("login.jsp")||uri.contains("loginServlet")){
            //放行,就去下一個過濾器;
            chain.doFilter(req,resp);
        }else{
            User user = (User) request.getSession().getAttribute("user");//必定要和loginServlet裏面設置值的時候一致;
            //上面的代碼不轉換也能夠Object user=...
            if(user!=null){  //就是已經登陸了,繼續放行;
                chain.doFilter(req,resp);
            }else{
                //1.你們若是須要用resp做一下重定向,則須要在上面加代碼;
               // response.sendRedirect("login.jsp");
                //2.若是不想寫1種方法的實現,則可使用
                request.getRequestDispatcher("/login.jsp").forward(req,resp);
            }
        }

    }

    public void init(FilterConfig config) throws ServletException {

    }

}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859

相關文章
相關標籤/搜索