java---過濾器、監聽器
一、過濾器(Filter)
1、過濾器作用
能夠對目標資源的請求和響應進行過濾或攔截,主要功能是登入驗證、編碼處理
javaWeb三大元件:servelt、Filter、Listener(監聽器)
2、使用入門
①建立類實現Filter介面 ②重寫介面中的方法 ③配置需要過濾的路徑 ④在doFilter中寫邏輯判斷,使用filterChain對符合條件的放行
@WebFilter("/*") //使用註解配置需要過濾的路徑 public class FilterDemo2 implements Filter { @Override publicvoid init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("進入過濾器了"); filterChain.doFilter(servletRequest,servletResponse);//對請求或響應放行 } @Override public void destroy() { } }
使用配置檔案配置需要過濾的路徑: web.xml
<filter> <filter-name>filterDemo2</filter-name> <filter-class>com.fy.danbiao.Filter.FilterDemo2</filter-class> </filter> <filter-mapping> <filter-name>filterDemo2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3、過濾器的細節
①過濾器的執行流程
資源請求----》過濾器-----》放行-----》資源-----》響應-----》過濾器-----》客戶端
②生命週期
和servlet相似:
init():初始化
doFilter():放行方法
destory():銷燬
③過濾器配置
訪問路徑配置:
過濾所有路徑:/*
過濾指定目錄的路徑:/user/*
過濾指定結尾符:.jsp、.do
過濾具體的資源路徑:index.jsp
訪問的請求型別設定:dispatherTypes屬性,預設是request
request:請求型別,預設值
forward:轉發訪問資源
include:包含訪問資源
error:錯誤跳轉資源
async:非同步訪問資源
配置方式:①註解:@WebFilter(value = "/*",dispatcherTypes = DispatcherType.INCLUDE)
②配置檔案:
<filter> <filter-name>filterDemo2</filter-name> <filter-class>com.fy.danbiao.Filter.FilterDemo2</filter-class> </filter> <filter-mapping> <filter-name>filterDemo2</filter-name> <url-pattern>/*</url-pattern> <dispatcher>INCLUDE</dispatcher> </filter-mapping>
④過濾器鏈的執行(當專案中有多個過濾器時)
客戶端請求---》過濾器1---》過濾器2---》資源執行---》過濾器2---》過濾器1
如何判斷那個過濾器先執行?兩種方式
①web.xml中配置的過濾器,那個先配置,那個先執行。
②根據過濾器類名來比較,類名的每個字元一次比較碼值,小的先執行
4、過濾器案例:判斷訪問者是否登入,如果登入,就放行,沒有登入,跳轉到登入頁面
@WebFilter("/*") public class FilterDemo implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("過濾器初始化"); } /*實現: *1、判斷使用者是否登入,如果沒有登入,就跳轉倒login.jsp頁面,如果登陸了,跳轉到index.jsp *2、設定請求和相應的編碼 * */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse resp = (HttpServletResponse) servletResponse; // 1、設定編碼格式 req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); // 2、過濾請求 String requestURI = req.getRequestURI();//獲取訪問的路徑 // 有些路徑不用攔截,就直接放行了 目前包括跳轉到 登入頁面/登入請求/靜態資源 if(requestURI.contains("login.jsp") || requestURI.contains("login") ||requestURI.contains("lay")){ filterChain.doFilter(req,resp); }else { // 獲取session物件 HttpSession session = req.getSession(); // 得到session物件中的值 Object t_staff = session.getAttribute("t_staff"); System.out.println("t_staff"+t_staff); if(t_staff!=null){ filterChain.doFilter(req,resp); }else { resp.sendRedirect("/layui/login.jsp"); } } } @Override public void destroy() { } }View Code
二、監聽器(Listener)
1、作用:監聽web應用,監聽很多資訊的初始化、銷燬,屬性的新增、移除、修改
2、監聽器的分類:
一個web應用程式的整個執行週期中,會建立和銷燬三個重要的物件:
ServletContext、HttpSession、ServletRequest
按監聽的物件,可劃分為:
ServletContext物件監聽器:ServletContextListener、ServletContextAttributeListener
HttpSession物件監聽器:HttpSessionListener、HttpSessionAttributeListener
ServletRequest物件監聽器:ServletRequestListener、ServletRequestAttributeListener
按監聽事件的劃分:
物件的建立和銷燬的監聽
物件中屬性的新增、修改、移除的監聽
session中某個物件的狀態變化的監聽器
3、使用
①實現指定監聽器的介面
②重寫方法
以HttpSessionListener舉例:
@WebListener //配置監聽器 public class ListenerDemo2 implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("session建立"); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session銷燬"); } }
使用web.xml配置檔案來配置監聽器:
<listener>
<listener-class>com.fy.danbiao.listener.ListenerDemo2</listener-class>
</listener>
4、監聽系統的線上人數(使用ServletContextListener、HttpSessionListener)
@WebListener public class ListenerDemo implements ServletContextListener,HttpSessionListener { ServletContext application; @Override public void contextInitialized(ServletContextEvent servletContextEvent) { // 獲取上下文物件 application = servletContextEvent.getServletContext(); // 是否有計數器 if(application.getAttribute("count")==null){ // 存進去,只執行一次 application.setAttribute("count",0); } } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { // 獲取先前的線上人數,為什麼要把線上人數放在ServletContext,因為再HttpSession中只能存在30分鐘 int count = Integer.parseInt(application.getAttribute("count").toString()); count++; application.setAttribute("count",count); } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { Integer count=Integer.valueOf(application.getAttribute("count").toString()); count--; System.out.println(count); application.setAttribute("count",count); } }