您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么在Springboot實現攔截器功能”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
preHandle: 預先處理,在目標的controller方法執行之前,進行處理
postHandle: 在目標的controller方法執行之后,到達指定頁面之前進行處理
afterCompletion: 在頁面渲染之后進行處理
方法:
1.Springboot通過實現HandlerInterceptor接口實現攔截器
2.通過WebMvcConfigurer實現一個配置類,再通過@Configuration 注解注入到容器
3.指定攔截規則
以用戶登錄為案例,若用戶沒有登錄session里面就沒有用戶的數據,就會轉到首頁登錄頁面
在正確登錄之后,就將reglister保存到session中,再次訪問頁面的時候,登錄攔截器就可以找到這個reglister對象,就不需要再次攔截到登錄界面了.
package com.zwz.springbootweb.interceptor; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.websocket.Session; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object reglister = session.getAttribute("Reglister"); if (reglister != null) { return true; } else { request.setAttribute("msg", "請先登錄!"); request.getRequestDispatcher("/").forward(request,response); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
之后通過實現WebMvcConfigurer接口實現一個配置類,在配置類中注入攔截器,最后再通過 @Configuration 注解注入配置.并且指定攔截的路徑和需要放行的路徑.
注意:攔截器 /** 會攔截一切資源,包括靜態資源,需要將靜態資源放行
package com.zwz.springbootweb.config; import com.zwz.springbootweb.interceptor.LoginInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.util.UrlPathHelper; @Configuration public class WebConfig implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/loginjudge","/","/retolo","/static/**"); } }
攔截器的應用場景
1、日志記錄:記錄請求信息的日志,以便進行信息監控、信息統計、計算PV(Page VIEW)等。
2、權限檢查:如登錄檢測,進入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;
3、性能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完后記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);
4、通用行為:讀取cookie得到用戶信息并將用戶對象放入請求,從而方便后續流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實現。
5、OpenSessionInView:如Hibernate,在進入處理器打開SESSION,在完成后關閉SESSION。
攔截器與過濾器的區別
1、攔截器是基于Java的反射機制的,而過濾器是基于函數回調。
2、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3、攔截器只能對ACTION請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4、攔截器可以訪問ACTION上下文、值棧里的對象,而過濾器不能訪問。
5、在ACTION的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
6、攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。
“怎么在Springboot實現攔截器功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。