<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
SpringMVC 的攔截器 Interceptor 的主要用來攔截指定的使用者請求,並進行相應的預處理或後處理。它的主要作用是攔截使用者的請求並進行相應的處理。比如通過它來進行許可權驗證,或者是來判斷使用者是否登入等操作。
其攔截的時間點是在處理器介面卡執行處理器之前。建立攔截器類需要實現 HandlerInterceptor 介面,然後在組態檔中註冊並指定攔截目標。
對於 SpringMVC 攔截器的定義方式有兩種:
目錄結構:
為了便於下面知識結構的講解,先建立好未使用攔截器的專案,步驟如下:
【1】建立 spring-config.xml 檔案,程式碼如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 設定檢視解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--邏輯檢視字首--> <property name="prefix" value="/WEB-INF/jsp/"></property> <!--邏輯檢視字尾,匹配模式:字首+邏輯檢視+字尾,形成完整路徑名--> <property name="suffix" value=".jsp"></property> </bean> <!-- 設定元件掃描器 --> <context:component-scan base-package="cn.hh.springmvc03"/> </beans>
【2】建立 User 實體類,程式碼如下:
package cn.hh.springmvc03.entity; import lombok.Data; @Data public class User { String username; String password; }
專案案例:建立第一個攔截器。
實現步驟:
【1】新建處理器 UserController,新增方法如下:
//測試攔截器 @RequestMapping("/test1.do") public String doTestInterceptor(){ System.out.println("執行了處理器的方法!"); return "welcome"; }
【2】新建包 cn.hh.springmvc03.intercepter,在包下新建一個自定義攔截器類 Intercepter1,實現 HandlerInterceptor 介面,重寫以下3個方法,程式碼如下:
package cn.hh.springmvc03.intercepter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class Intercepter1 implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception arg3) throws Exception { System.out.println("執行了Intercepter1 ----------afterCompletion"); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("執行了Intercepter1 ----------postHandle"); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("執行了Intercepter1 ----------preHandle"); return true; } }
自定義攔截器,需要實現HandlerInterceptor介面,實現該介面中的以下三個方法:
攔截器中方法與處理器方法的執行順序如圖所示。
也可以這樣來看 ,如下圖:
【3】在 spring-config.xml 組態檔中註冊攔截器,程式碼如下:
<!-- 註冊攔截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="cn.hh.springmvc03.intercepter.Intercepter1"/> </mvc:interceptor> </mvc:interceptors>
【4】執行測試,則控制檯輸出如下:
執行了Intercepter1 ----------preHandle
執行了處理器的方法!
執行了Intercepter1 ----------postHandle
執行了Intercepter1 ----------afterCompletion
專案案例: 建立多個攔截器。(在上面案例的基礎上編寫以下程式碼)
【1】建立Intercepter2,程式碼如下所示:
package cn.hh.springmvc03.intercepter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class Intercepter2 implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception arg3) throws Exception { System.out.println("執行了Intercepter2----------afterCompletion"); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("執行了Intercepter2----------postHandle"); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("執行了Intercepter2----------preHandle"); return true; } }
【2】在 spring-config.xml 檔案中註冊多個攔截器,程式碼如下:
<!-- 註冊多個攔截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.lifeng.intercepter.Intercepter1"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.lifeng.intercepter.Intercepter2"/> </mvc:interceptor> </mvc:interceptors>
【3】執行測試,則控制檯輸出如下:
執行了Intercepter1 ----------preHandle
執行了Intercepter2 ----------preHandle
執行了處理器的方法!
執行了Intercepter2 ----------postHandle
執行了Intercepter1 ----------postHandle
執行了Intercepter2 ----------afterCompletion
執行了Intercepter1 ----------afterCompletion
當有多個攔截器時,形成攔截器鏈。攔截器的執行順序與其註冊順序一致。需要再次強調一點的是當某一個攔截器的 preHandle() 方法返回 true 並被執行到時,會向一個專門的方法棧中放入該攔截器的 afterCompletion() 方法。
多個攔截器方法與處理器方法的執行順序如下圖所示:
只要有一個 preHandler() 方法返回 false,則上部的執行鏈將被斷開,其後續的處理器方法與 postHandle() 方法將無法執行。但無論執行鏈執行情況怎樣,只要方法棧中有方法,即執行鏈中只要有 preHandle() 方法返回 true,就會執行方法棧中的 afterCompletion() 方法,最終都會給出響應。
專案案例: 只有經過登入的使用者方可存取處理器,否則,將返回“無權存取”提示。 本例的登入,由一個 JSP 頁面完成。即在該頁面裡將使用者資訊放入 session 中。也就是說,只要存取過該頁面,就說明登入了。沒存取過,則為未登入使用者。
實現步驟:
【1】web.xml 程式碼如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!--設定前端控制器--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-config.xml</param-value> </init-param> <!--tomcat啟動就建立該範例物件--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
【2】spring-config.xml 組態檔程式碼如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--實現更加強大的功能,支援json資料格式的解析--> <mvc:annotation-driven></mvc:annotation-driven> <!--第5步:設定檢視解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--字首設定--> <property name="prefix" value="/"></property> <!--字尾設定--> <property name="suffix" value=".jsp"></property> </bean> <!--第6步:開啟包掃描 base-package 設定需要掃描的包 --> <context:component-scan base-package="cn.kgc.springmvc03"></context:component-scan> <!--靜態資源的處理 不需要經過前端控制器 tomcat--> <mvc:default-servlet-handler></mvc:default-servlet-handler> <!--設定攔截器--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/user/login"/> <mvc:exclude-mapping path="/user/getcode"/> <bean class="cn.kgc.springmvc03.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> <!--組態檔上傳元件--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean> </beans>
【3】UserController 類中新增登陸方法,程式碼如下:
//登陸 @RequestMapping("login") @ResponseBody public Map<String,Object> login(User user, HttpSession session,@SessionAttribute("code") String attribute){ HashMap<String, Object> map = new HashMap<>(); System.out.println("--------login方法-------"+attribute); if(user.getCode().equals(attribute)){//驗證碼填寫正確 if("tom".equals(user.getUsername())&&"123456".equals(user.getPassword())){//賬號密碼正確 session.setAttribute("user",user); map.put("code",200); map.put("msg","登陸成功"); }else{//賬號密碼不正確 map.put("code",500); map.put("msg","登陸失敗"); } }else{//驗證碼填寫不正確 map.put("code",500); map.put("msg","驗證碼輸入不正確"); } return map; }
【4】新增攔截器 LoginInterceptor 程式碼如下:
package cn.kgc.springmvc03.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("-------------preHandle方法--------------"); HttpSession session = request.getSession(); Object user = session.getAttribute("user"); if(user==null){ response.sendRedirect("/login.jsp"); return false; } return true; } }
【5】新增前端頁面 login.jsp 程式碼如下:
<%-- Created by IntelliJ IDEA. Time: 9:35 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="jquery-1.11.1.js"></script> <script src="https://s3.pstatp.com/cdn/expire-1-M/jquery/3.3.1/jquery.min.js"></script> </head> <body> <form> <p><input type="text" name="username" placeholder="請輸入使用者名稱" id="username"></p> <p><input type="password" name="password" placeholder="請輸入密碼" id="password"></p> <p><input type="text" name="code" placeholder="請輸入驗證碼" id="code"></p> <p><input type="button" value="登入" id="login"></p> </form> <span id="msg" style="color: red"></span> </body> <script> $("#login").click(function () { let username=$("#username").val() let password = $("#password").val() let code = $("#code").val() $.get("/user/login",{username,password,code},function (res) { if(res.code=200){ window.location.href="/main.jsp" rel="external nofollow" }else{ let info = res.msg $("#msg").text(info) } }) }); </script> </html>
到此這篇關於SpringMVC攔截器零基礎掌握的文章就介紹到這了,更多相關SpringMVC攔截器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45