1. 程式人生 > >對過濾器和攔截器的認識和總結

對過濾器和攔截器的認識和總結

以前在學習時一直搞不清這兩者的區別,以為過濾器是servlet中的,攔截器是springmvc的,後來在做一個登入攔截的時候,發現兩者都可以實現,所以稍微的終結了一下。
下圖是過濾器和攔截聯合使用時的請求的流程

這裡寫圖片描述

過濾器是JavaEE標準,採用函式回撥的方式進行。是在請求進入容器之後,還未進入Servlet之前進行預處理,並且在請求結束返回給前端這之間進行後期處理。

攔截器是被包裹在過濾器之中的。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("preHandle");
    return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("afterCompletion");
}

  a.preHandle()這個方法是在過濾器的chain.doFilter(request, response)方法的前一步執行,也就是在 [System.out.println(“before…”)][chain.doFilter(request, response)]之間執行。
  b.preHandle()方法之後,在return ModelAndView之前進行,可以操控Controller的ModelAndView內容。
  c.afterCompletion()方法是在過濾器返回給前端前一步執行,也就是在[chain.doFilter(request, response)][System.out.println(“after…”)]之間執行。

下面是具體的使用方式
這裡寫圖片描述

1.編寫一個java類,實現Filter介面

package cn.note.web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import cn.tedu.note.service.UserService; public class ACLFilter implements Filter{ private ServletContext sc; private ApplicationContext ctx; private UserService userService; /** * 過濾器初始化程式碼 */ public void init(FilterConfig cfg) throws ServletException { sc= cfg.getServletContext(); //獲取Spring容器 ctx=WebApplicationContextUtils.getWebApplicationContext(sc); //從容器中獲取 UserService 物件 userService=ctx.getBean("userService",UserService.class); } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException { chain.doFilter(request, response); } public void destroy() { } }

2.doFilter中實現攔截

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) req;
        HttpServletResponse response =(HttpServletResponse) res;

        String path=request.getRequestURI();
        //System.out.println(path);

        path = path.substring(
            path.indexOf('/', 1));

        //System.out.println("trim path:"+path);

        if(path.matches(".*/edit\\.html$")){
            checkLogin(request,response,chain);
            return;
        }

        if(path.matches(".(note).*\\.do$")){
            checkDotDo(request,response,chain);
            return;
        }

        chain.doFilter(request, response); 
    }

3.將過濾器新增到web程式中
在web.xml中新增如下的配置

<filter>
        <filter-name>acl</filter-name>
        <filter-class>
                cn.note.web.ACLFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>acl</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

4.打包部署。。
這樣一個簡單的過濾器就已經完成了。其最核心的其實也就是dofilter裡面對過濾條件的判斷

下面是攔截器的使用
和過濾器一樣
第一步:首先 implements HandlerInterceptor介面
第二步:由於我要在執行controller之前拿到cookie的value
所以我在preHandle方法裡面實現程式碼
第三步:與spring的專案整合

package com.jt.web.interceptor;

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

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

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

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jt.common.service.HttpClientService;
import com.jt.common.util.CookieUtils;
import com.jt.web.controller.UserController;
import com.jt.web.controller.UserThreadLocal;
import com.jt.web.pojo.User;


public class CartInterception implements HandlerInterceptor{
    @Autowired
    private HttpClientService httpClientService;

    private static final ObjectMapper MAPPER=new ObjectMapper();

    //在執行整個controller完成渲染之後(資料完成繫結後,即將就要轉發了),轉向頁面之前
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }


    //在執行controller之後
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }


    //在執行controller方法前執行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse arg1, Object arg2) throws Exception {
        //從cookie中獲取ticket
        String ticket=CookieUtils.getCookieValue(request, UserController.UsercookieName);
        if(StringUtils.isEmpty(ticket)){
            UserThreadLocal.setUser(null);

        }else{
            //成功獲取ticket
            String url="http://sso.jt.com/user/query/"+ticket;

            String jsonData=httpClientService.doGet(url, "utf-8");
            if(StringUtils.isNoneEmpty(jsonData)){
                //成功獲取jsonData
                JsonNode jsonNode=MAPPER.readTree(jsonData);
                String data=jsonNode.get("data").asText();

                User user=MAPPER.readValue(data, User.class);
                UserThreadLocal.setUser(user);
            }else{
                UserThreadLocal.setUser(null);
            }



        }

        return true;//預設不放行,日常的情況下,不管對錯都放行
    }

}

在springmvc的配置檔案中新增

<!-- 配置攔截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 指定攔截的對映 ,**攔截後面的多級目錄-->
            <mvc:mapping path="/cart/**"/>
            <!-- 指定實現類 -->
            <bean class="com.jt.web.interceptor.CartInterception"></bean>
        </mvc:interceptor>

    </mvc:interceptors>

釋出部署即可。

相關推薦

過濾器攔截認識總結

以前在學習時一直搞不清這兩者的區別,以為過濾器是servlet中的,攔截器是springmvc的,後來在做一個登入攔截的時候,發現兩者都可以實現,所以稍微的終結了一下。 下圖是過濾器和攔截聯合使用時的請求的流程 過濾器是JavaEE標準,採用函式回撥

web工程過濾器springMVC攔截的一些總結

今天自己寫SSO(單點登入)發現一些問題的總結 1。因為原先有攔截器inteceptor,所以想著就直接用攔截器搞好了,後來發現不行, 原因是:工程預設是/訪問,是在web中配置預設的,並沒有呼叫任何方法(而攔截器是攔截方法的),所以無論我修改spring配置檔案,修

(轉)過濾器攔截的區別

null req acc 編程 字符集 work uri indexof send 1、攔截器是基於java的反射機制的,而過濾器是基於函數回調 2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器 3、攔截器只能對action請求起作用,而過濾器則可以對

過濾器攔截的區別

ros sof 多次 pan 圖片路徑 cti 攔截 mic -- ---------------------siwuxie095 過濾器和攔截器的區別 過濾器:過濾器理論上能過濾任何內容,如:HTML、JSP

Java中過濾器攔截的區別

區別 對象 pos ava 初始 反射機制 action 調用 反射 1.攔截器是基於java反射機制的,而過濾器是基於函數回調的。 2.過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。 3.攔截器只對action起作用,而過濾器幾乎可以對所有請求起作用

springBoot之配置文件的讀取以及過濾器攔截的使用

boolean nco 定義 www cheng handle mod HR out 前言 在之前的學習springBoot中,成功的實現了Restful風格的基本服務。但是想將之前的工程作為一個項目來說,那些是僅僅不夠的。可能還需要獲取自定義的配置以及添加過濾器和攔截器。

springboot環境下配置過濾器攔截

name public spring doc true 直接 war pattern long 以前我們在配置過濾器和攔截器的時候,都是一個類繼承一個接口,然後在xml中配置一下就ok 但是,但是,這是springboot的環境,沒有xml的配置。所以我們還要繼續學習啊啊

SpringBoot(十一)過濾器攔截

在做web開發的時候,過濾器(Filter)和攔截器(Interceptor)很常見,通俗的講,過濾器可以簡單理解為“取你所想取”,忽視掉那些你不想要的東西;攔截器可以簡單理解為“拒你所想拒”,關心你想要拒絕掉哪些東西,比如一個BBS論壇上攔截掉敏感詞彙。 過濾器依賴於servlet容器,

springboot(五)過濾器攔截

前言        過濾器和攔截器二者都是AOP程式設計思想的提現,都能實現諸如許可權檢查、日誌記錄等。二者有一定的相似之處,不同的地方在於: Filter是servlet規範,只能用在Web程式中,而攔截器是Spring規範,可以用在Web程式中,也可以用在

轉發重定向的區別過濾器攔截的區別

spring width 客戶 截器 數據 http image 定向 框架 重定向:客戶端發起兩次請求 不會攜帶數據 轉發:服務端內部跳轉,從客戶端只發起一次請求 SpringMvc默認的跳轉方式是:轉發 SpringMvc中的攔截器:過濾進入SpringMVC

springboot配置監聽器、過濾器攔截

監聽器:listener是servlet規範中定義的一種特殊類。用於監聽servletContext、HttpSession和servletRequest等域物件的建立和銷燬事件。監聽域物件的屬性發生修改的事件。用於在事件發生前、發生後做一些必要的處理。其主要可用於以下方面:

Struts2中過濾器攔截的區別

過濾器和攔截器的區別:   ①攔截器是基於Java的反射機制的,而過濾器是基於函式回撥。   ②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。   ③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。   ④攔截器可以訪問acti

SpringBoot配置過濾器、監聽器攔截

一:配置過濾器1.建立TestFilter類並實現Filter介面@WebFilter(filterName="testFilter",urlPatterns="/*") //@WebFilter是定義過濾器的註解 ,urlPatterns="/*" 定義過濾器過濾的路徑

過濾器(Filter)攔截(Interceptor)的區別

一、過濾器(Filter) 1.含義 它依賴於servlet容器,配置於web.xml。 Servlet中的過濾器Filter是實現了javax.servlet.Filter介面的伺服器端程式,主要的用途是設定字符集、控制權限、控制轉向、做一些業務邏輯判斷等。在實現上,基於函式回撥,它可

VUE的axiosPromise的封裝攔截

const prod = process.env.NODE_ENV !== "development"; const root = prod ? "/root" : "/root"; const timeout = 60000; import axios

過濾器(Filter)攔截(Interceptor)

Filter介紹 Filter可以認為是Servlet的一種“加強版”,它主要用於對使用者請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。Filter也可以對使用者請求生成響應,這一點與Servlet相同,但實際上很少

Spring過濾器攔截

什麼是攔截器 ​ 攔截器(Interceptor): 用於在某個方法被訪問之前進行攔截,然後在方法執行之前或之後加入某些操作,其實就是AOP的一種實現策略。它通過動態攔截Action呼叫的物件,允許開發者定義在一個action執行的前後執行的程式碼

AOP--Filter使用,過濾器攔截的區別

AOP(Aspect-Oriented Programming,面向切面程式設計)是一種程式設計思想,並不是一種具體的實現,談到實現一般有Filter和代理模式兩種常見的使用方式,Spring中的AOP也是封裝代理模式完成的,可以說是OOP(Object-Oriented P

過濾器攔截之間的關係區別

1.過濾器和攔截器的區別    1)原理不同:攔截器是基於java的反射機制,而過濾器是基於函式回撥    2)作用物件不同:攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用    3)呼叫次數不同:在action的生命週期,攔截器可以多次被呼叫,而

springboot中的攔截interceptor過濾器filter,多次獲取request引數

大家好,我是烤鴨:    這是一篇關於springboot的攔截器(interceptor)和過濾器(Filter)。    先說一下過濾器和攔截器。區別:1.servlet請求,順序:Filter ——> interceptor。2.Filter的作用是對所有進行過濾