1. 程式人生 > >Spring Boot (教程八: 過濾器、監聽器、攔截器)

Spring Boot (教程八: 過濾器、監聽器、攔截器)

GitHub 地址:

過濾器Filter


在src下建立com.example.filter包

  • 建立 ServletFilter.java 實現 Filter 方法
package com.example.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.annotation.WebFilter; /** * Servlet Filter implementation class ServletFilter * 註解註冊過濾器:實現 javax.servlet.Filter介面 * filterName 是過濾器的名字 * urlPatterns 是需要過濾的請求 ,這裡只過濾servlet/* 下面的所有請求 */ @WebFilter(filterName="ServletFilter",urlPatterns="/servlet/*"
) public class ServletFilter implements Filter { /** * Default constructor. */ public ServletFilter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { System.out.println("過濾器被銷燬。"); } /** * @see
Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub // place your code here System.out.println("過濾器正在執行..."); // pass the request along the filter chain chain.doFilter(request, response); } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { System.out.println("初始化過濾器。"); } }


測試

1


控制檯輸出:

2

3

4

監聽器Listener


在src下建立com.example.listener包

  • 建立 ContextListener.java 類

5

6

package com.example.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * Application Lifecycle Listener implementation class ContextListener
 * @author LingDu
 */
@WebListener
public class ContextListener implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public ContextListener() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0)  { 
         System.out.println("監聽器被銷燬");
    }

    /**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent arg0)  { 
         System.out.println("監聽器初始化。");
    }

}


專案啟動的時候 監聽器是先被初始化的

7

攔截器Interceptor


建立攔截器


      在src下建立com.example.interceptor包,
建立MyInterceptor.java類,實現HandlerInterceptor介面,重寫裡面3個主要的方法。

  • MyInterceptor.java
package com.example.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 1、建立攔截器類並實現 HandlerInterceptor 介面
 * @author LingDu
 */
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("攔截器MyInterceptor------->3、請求結束之後被呼叫,主要用於清理工作。");

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("攔截器MyInterceptor------->2、請求之後呼叫,在檢視渲染之前,也就是Controller方法呼叫之後");

    }

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("攔截器MyInterceptor------->1、請求之前呼叫,也就是Controller方法呼叫之前。");
        return true;//返回true則繼續向下執行,返回false則取消當前請求
    }

}


註冊攔截器


      在src下建立com.example.interceptor包
建立InterceptorConfigurerAdapter類,繼承WebMvcConfigurerAdapter類,重寫addInterceptors方法

  • InterceptorConfigurerAdapter.java


注意:需要加上@Configuration註解

package com.example.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * 建立java類繼承WebMvcConfigurerAdapter類,重寫addInterceptors方法
 * @author LingDu
 */
@Configuration
public class InterceptorConfigurerAdapter extends WebMvcConfigurerAdapter {
    /**
     * 該方法用於註冊攔截器
     * 可註冊多個攔截器,多個攔截器組成一個攔截器鏈
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns 新增路徑
        // excludePathPatterns 排除路徑
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*.*");
        super.addInterceptors(registry);
    }
}


頁面訪問:

8


成功攔截:

9

工程目錄圖

10