目錄
一:SpringMVC攔截器
1. 攔截器介紹
2. HandlerInterceptor接口分析
3. 自定義攔截器實(shí)現(xiàn)權(quán)限驗(yàn)證
一:SpringMVC攔截器
SpringMVC 中的 Interceptor 攔截器,它的主要作用是攔截指定的用戶(hù)請(qǐng)求,并進(jìn)行相應(yīng)的預(yù)處理與后處理。其攔截的時(shí)間點(diǎn)在“處理器映射器根據(jù)用戶(hù)提交的請(qǐng)求映射出了所要執(zhí)行的處理器類(lèi),并且也找到了要執(zhí)行該處理器類(lèi)的處理器適配器,在處理器適配器執(zhí)行處理器之前”。當(dāng)然,在處理器映射器映射出所要執(zhí)行的處理器類(lèi)時(shí),已經(jīng)將攔截器與處理器組合為了一個(gè)處理器執(zhí)行鏈,并返回給了中央調(diào)度器。
1. 攔截器介紹
(1)攔截器的應(yīng)用場(chǎng)景?
針對(duì)請(qǐng)求和響應(yīng)進(jìn)行的額外的處理,在請(qǐng)求和響應(yīng)的過(guò)程中添加預(yù)處理、后處理和最終處理;主要應(yīng)用在以下場(chǎng)景當(dāng)中:
①日志記錄:記錄請(qǐng)求信息的日志。
②權(quán)限檢查:如登錄檢查。
③性能檢測(cè):檢測(cè)方法的執(zhí)行時(shí)間。
(2)攔截器的執(zhí)行原理
①preHandle():在請(qǐng)求被處理之前進(jìn)行操作;預(yù)處理。
②postHandle():在請(qǐng)求被處理之后,但結(jié)果還沒(méi)有渲染前進(jìn)行操作,可以改變響應(yīng)結(jié)果;后處理。
③afterCompletion:所有的請(qǐng)求響應(yīng)結(jié)束后執(zhí)行善后工作,清理對(duì)象、關(guān)閉資源 ;最終處理.。
(3)攔截器實(shí)現(xiàn)的兩種方式
①繼承HandlerInterceptorAdapter【處理程序攔截適配器】的父類(lèi)。
②實(shí)現(xiàn)HandlerInterceptor【處理程序攔截器】接口,推薦使用實(shí)現(xiàn)接口的方式,因?yàn)槔^承是單繼承的。
2. HandlerInterceptor接口分析
自定義攔截器,需要實(shí)現(xiàn) HandlerInterceptor 接口;并且該接口中含有三個(gè)方法:
(1)preHandle
該方法在處理器方法執(zhí)行之前執(zhí)行。其返回值為 boolean類(lèi)型,若為 true,則緊接著會(huì)執(zhí)行處理器方法,且會(huì)將 afterCompletion()方法放入到一個(gè)專(zhuān)門(mén)的方法棧中等待執(zhí)行。
(2)postHandle
該方法在處理器方法執(zhí)行之后執(zhí)行。處理器方法若最終未被執(zhí)行,則該方法不會(huì)執(zhí)行。由于該方法是在處理器方法執(zhí)行完后執(zhí)行,且該方法參數(shù)中包含 ModelAndView,所以該方法可以修改處理器方法的處理結(jié)果數(shù)據(jù),且可以修改跳轉(zhuǎn)方向。
(3)afterCompletion
當(dāng)preHandle()方法返回 true 時(shí),會(huì)將該方法放到專(zhuān)門(mén)的方法棧中,等到對(duì)請(qǐng)求進(jìn)行響應(yīng)的所有工作完成之后才執(zhí)行該方法。即該方法是在中央調(diào)度器渲染(數(shù)據(jù)填充)了響應(yīng)頁(yè)面之后執(zhí)行的,此時(shí)對(duì) ModelAndView 再操作也對(duì)響應(yīng)無(wú)濟(jì)于事。afterCompletion 最后執(zhí)行的方法,清除資源,例如在 Controller 方法中加入數(shù)據(jù)等。
3. 自定義攔截器實(shí)現(xiàn)權(quán)限驗(yàn)證
(1)改造登錄方法,在session中存儲(chǔ)用戶(hù)信息,用于進(jìn)行權(quán)限驗(yàn)證
細(xì)節(jié):一定要注意我們登錄界面login.jsp跳轉(zhuǎn)到的是/login還是/login.action;有沒(méi)有帶action直接決定我們后面攔截器exclude-mapping通行的路徑帶不帶.action!
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class WebInfAction {
// 首先要跳轉(zhuǎn)到登錄頁(yè)面
@RequestMapping("/showLogin")
public String submit(){
System.out.println("訪(fǎng)問(wèn)login.jsp進(jìn)行登錄");
return "login";
}
// 跳轉(zhuǎn)到login.jsp后,在進(jìn)行判斷
@RequestMapping("/login")
public String login(String name, String pwd, HttpServletRequest request){ // 與前端保持一致,提交的數(shù)據(jù)自動(dòng)吸過(guò)來(lái)
if ("root".equalsIgnoreCase(name) && "123".equalsIgnoreCase(pwd)){
// 在session中存儲(chǔ)用戶(hù)信息(把name存進(jìn)去),用于權(quán)限驗(yàn)證
request.getSession().setAttribute("user",name);
return "main";
}else {
request.setAttribute("msg","用戶(hù)名或者密碼不正確");
return "login";
}
}
}
(2)開(kāi)發(fā)攔截器的功能,實(shí)現(xiàn)HandlerInterceptor接口,重寫(xiě)preHandle()方法
package com.bjpowernode.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
// 重寫(xiě)preHandle方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 是否登錄的判斷
if(request.getSession().getAttribute("user") == null){ // 能取出來(lái),表示登錄過(guò)
// 沒(méi)有登錄,打回到登錄的頁(yè)面,并給出提示
request.setAttribute("msg","請(qǐng)先去登錄!");
request.getRequestDispatcher("WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
// 如果登錄過(guò),就放行往下走
return true;
}
}
(3)在springmvc.xml文件中注冊(cè)攔截器
攔截器中可以配置一個(gè)攔截器鏈,層層把關(guān);這里我們只需要配置一個(gè),總共配置三部分:
①映射要攔截的請(qǐng)求,一般設(shè)置為全部攔截。
②然后在設(shè)置要放行的請(qǐng)求。
③配置具體的攔截器實(shí)現(xiàn)功能的類(lèi)。
<!--注冊(cè)攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--映射要攔截的請(qǐng)求-->
<mvc:mapping path="/**"/>
<!--配置要放行的請(qǐng)求-->
<mvc:exclude-mapping path="/showLogin"/><!--登錄的頁(yè)面-->
<mvc:exclude-mapping path="/login"/><!--登錄驗(yàn)證的頁(yè)面-->
<!--配置具體的攔截器實(shí)現(xiàn)功能的類(lèi)-->
<bean class="com.bjpowernode.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
(4)測(cè)試:
在登錄之前,我們還是知道showMain或者showIndex,直接訪(fǎng)問(wèn)是不能訪(fǎng)問(wèn)的,被攔截了
在成功登錄之后,我們不關(guān)閉當(dāng)前會(huì)話(huà),重新開(kāi)一個(gè)窗口,?直接訪(fǎng)問(wèn)就可以訪(fǎng)問(wèn)了文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-458830.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-458830.html
到了這里,關(guān)于【SpringMVC】| SpringMVC攔截器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!