Servlet中的攔截器,監聽器,過濾器

1.什麼是攔截器?

 攔截器接口及其實現

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class LoginInterceptor extends HandlerInterceptorAdapter {
    /**
     *預處理回調方法,實現處理器的預處理(如登錄檢查)。
     *第三個參數爲響應的處理器,即controller。
     *返回true,表示繼續流程,調用下一個攔截器或者處理器。
     *返回false,表示流程中斷,通過response產生響應。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
            Object handler) throws Exception {
        System.out.println("---------------------------->controller調用之前");
        return true;
    }
    
    /**
     *當前請求進行處理之後,也就是Controller方法調用之後執行,
     *但是它會在DispatcherServlet 進行視圖返回渲染之前被調用。
     *此時我們可以通過modelAndView對模型數據進行處理或對視圖進行處理。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
            Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("controller調用完畢");
    }

    /**
     *方法將在整個請求結束之後,也就是在DispatcherServlet 渲染了對應的視圖之後執行。
     *這個方法的主要作用是用於進行資源清理工作的。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
            Object handler, Exception ex) throws Exception {
        System.out.println("整個請求已經結束");
    }

}

攔截器相關配置

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SuppressWarnings("deprecation")
@Component
public class InterceptorConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 註冊攔截器
        InterceptorRegistration ir = registry.addInterceptor(new LoginInterceptor());
        // 配置攔截的路徑,指的是哪些請求需要代理模式
        ir.addPathPatterns("/student/list");
        // 配置不攔截的路徑
        ir.excludePathPatterns("/**.html");
        // 還可以在這裏註冊其它的攔截器
        // registry.addInterceptor(new OtherInterceptor()).addPathPatterns("/**");
    }
}

2.什麼是過濾器?

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;

import org.springframework.core.annotation.Order;

@Order(1)
@WebFilter(filterName = "MyFilter", urlPatterns = "/student/create")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("過濾器初始化");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("請求不可達");
    }
    @Override
    public void destroy() {
        System.out.println("過濾器銷燬");
    }
}

3.什麼是監聽器?

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
 
        System.out.println("---------------------------->請求銷燬");
    }
 
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
 
        System.out.println("---------------------------->請求創建");
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章