對過濾器和攔截器的認識和總結
以前在學習時一直搞不清這兩者的區別,以為過濾器是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的axios對Promise的封裝和攔截器
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的作用是對所有進行過濾