當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringMVC和SpringBoot的拦截器 HandlerInterceptor 入门
生活随笔
收集整理的這篇文章主要介紹了
SpringMVC和SpringBoot的拦截器 HandlerInterceptor 入门
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
總體步驟
1.自定義一個實現HandlerInterceptor 接口的類比如SignUpHandlerInterceptor(我這邊以注冊登錄攔截器為例)。
package com.example.project.config;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class SignUpHandlerInterceptor implements HandlerInterceptor {/*** 預處理回調方法,實現處理器的預處理(如檢查登陸),第三個參數為響應的處理器,自定義Controller* 返回值:true表示繼續流程(如調用下一個攔截器或處理器);false表示流程中斷(如登錄檢查失敗),不會繼續調用其他的攔截器或處理器,此時我們需要通過response來產生響應;*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//若注冊成功可以獲取sessionObject signUpUser = request.getSession().getAttribute("signUpUser");if(signUpUser==null){request.setAttribute("msg","沒有權限,請先注冊賬號");request.getRequestDispatcher("/signup").forward(request,response);return false;}else{return true;}}/*** 后處理回調方法,實現處理器的后處理(但在渲染視圖之前),此時我們可以通過modelAndView(模型和視圖對象)對模型數據進行處理或對視圖進行處理,modelAndView也可能為null。*/ // @Override // public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); // } // // /** // * 整個請求處理完畢回調方法,即在視圖渲染完畢時回調,如性能監控中我們可以在此記錄結束時間并輸出消耗時間,還可以進行一些資源清理,類似于try-catch-finally中的finally,但僅調用處理器執行鏈中 // */ // @Override // public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // HandlerInterceptor.super.afterCompletion(request, response, handler, ex); // } }2.我這邊是對注冊的攔截器,所以我需要設置session
package com.example.project.controller;import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.thymeleaf.util.StringUtils;import javax.servlet.http.HttpSession;@Controller public class SignUpController {@RequestMapping({"/user/signup"})public String signUp(@RequestParam("signup_name") String signup_name,@RequestParam("signup_email")String signup_email,@RequestParam("signup_password")String signup_password,Model model,HttpSession session){//通過model返回數據,通過RequestParam接收數據//業務//測試System.out.println("###=>"+signup_name);System.out.println("###=>"+signup_email);System.out.println("###=>"+signup_password);//姓名郵箱不為空并且密碼為123456if(!StringUtils.isEmpty(signup_name)&&!StringUtils.isEmpty(signup_email)&&"123456".equals(signup_password)){//注冊成功就設置session//x.setAttribute(name,value)把x的name的值設置為valuesession.setAttribute("signUpUser",signup_email);return "index";}else{//反饋失敗信息model.addAttribute("msg","您的輸入有誤,請重試");return "signup";}// return "signup";} }3.重寫addInterceptor方法,添加自定義的攔截器并設置需要攔截的頁面和不需要攔截的頁面。
package com.example.project.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration public class MyMvcConfiguration implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("signup");registry.addViewController("/signup.html").setViewName("signup");registry.addViewController("/signup").setViewName("signup");}//自定義國際化組件@Beanpublic LocaleResolver localeResolver(){return new MyLocaleResolver();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SignUpHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/signup","/","/user/signup","/login","/login.html");} }HandlerInterceptor 接口的三個方法
/*** 預處理回調實現處理器的預處理(如檢查登陸),第三個參數為響應的處理器,自定義Controller* 返回值:true表示繼續流程(如調用下一個攔截器或處理器);false表示流程中斷(如登錄檢查失敗),不會繼續調用其他的攔截器或處理器,此時我們需要通過response來產生響應;* 這個方法將在請求處理之前進行調用。 「注意」:如果該方法的返回值為false ,將視為當前請求結束,不僅自身的攔截器會失效,還會導致其他的攔截器也不再執行。*/ @Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return HandlerInterceptor.super.preHandle(request, response, handler);}/*** 后處理回調實現處理器的后處理(但在渲染視圖之前),modelAndView(模型和視圖對象)對模型數據進行處理或對視圖進行處理,modelAndView也可能為null。* 只有在 preHandle 方法返回值為true 時才會執行。會在Controller 中的方法調用之后,DispatcherServlet 返回渲染視圖之前被調用。* postHandle 方法被調用的順序跟 preHandle 是相反的,先聲明的攔截器 preHandle 方法先執行,而postHandle方法反而會后執行。*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}/**只有在 preHandle 方法返回值為true 時才會執行。在整個請求結束之后, DispatcherServlet 渲染了對應的視圖之后執行。* 整個請求處理完畢回調,即在視圖渲染完畢時回調,如性能監控中我們可以在此記錄結束時間并輸出消耗時間.* 還可以進行一些資源清理或釋放資源,類似于try-catch-finally中的finally,但僅調用處理器執行鏈中*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}一般的處理順序為:preHandler -> Controller -> postHandler -> model渲染-> afterCompletion
攔截器攔截頁面設置
在自定義的Configuration配置文件中設置攔截的頁面
addPathPatterns設置進入攔截器的頁面
excludePathPatterns設置除外的不需攔截的頁面(比如注冊和登錄)
當需要攔截的內容多的時候可以用:
/**表示所有路徑
excludePathPatterns把除外的可以隨意訪問的路徑放入
完整的MyMvcConfiguration代碼:
總結
以上是生活随笔為你收集整理的SpringMVC和SpringBoot的拦截器 HandlerInterceptor 入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java redis 重连机制_redi
- 下一篇: memset 结构体内指针_数据结构之线