第七章 過濾器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
配置要攔截的資源
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