一 概念
Spring MVC中的攔截器(Interceptor)類似于Servlet中的過(guò)濾器(Filter),它主要用于攔截用戶請(qǐng)求并作相應(yīng)的處理。例如通過(guò)攔截器可以進(jìn)行權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶是否登錄等。
攔截器可以在進(jìn)入處理器之前做一些操作,或者在處理器完成后進(jìn)行操作,甚至是在渲染視圖后進(jìn)行操作。
在這里僅僅演示登錄的判斷
二 3步使用
①創(chuàng)建攔截器類實(shí)現(xiàn)HandlerInterceptor接口
②配置攔截器(在springmvc-config.xml中配置)
③測(cè)試攔截器效果是否實(shí)現(xiàn)
三 HandlerInterceptor接口
這個(gè)接口含有三個(gè)方法:
方法名 | 作用說(shuō)明 |
---|---|
preHandle() | 這個(gè)方法將在請(qǐng)求處理之前進(jìn)行調(diào)用,該方法的返回值是布爾值,當(dāng)返回值為false時(shí),表示請(qǐng)求結(jié)束,后續(xù)的Interceptor和Controller都不會(huì)再執(zhí)行;當(dāng)返回值為true時(shí)就會(huì)繼續(xù)調(diào)用下一個(gè)Interceptor的preHandle方法 |
postHandle | 該方法是在當(dāng)前請(qǐng)求進(jìn)行處理之后被調(diào)用,前提是preHandle方法的返回值為true時(shí)才能被調(diào)用,且它會(huì)在DispatcherServlet進(jìn)行視圖返回渲染之前被調(diào)用,所以在這個(gè)方法里可對(duì)Controller層處理之后的ModelAndView對(duì)象進(jìn)行操作 |
afterCompletion | 該方法將在整個(gè)請(qǐng)求結(jié)束之后,也就是在DispatcherServlet渲染了對(duì)應(yīng)的視圖之后執(zhí)行,前提是preHandle方法的返回值為true時(shí)才能被調(diào)用 |
四 代碼實(shí)現(xiàn)
①創(chuàng)建創(chuàng)建攔截器類實(shí)現(xiàn)HandlerInterceptor接口
import cn.com.sise.pojo.User;
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;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 獲取請(qǐng)求的URL
System.out.println("preHandle執(zhí)行中");
// 獲取請(qǐng)求的URL
String url = request.getRequestURI();
// URL:除了login.jsp是可以公開(kāi)訪問(wèn)的,其它的URL都進(jìn)行攔截控制
if (url.indexOf("/lgCheck") >= 0) {
return true;
}
// 獲取Session
HttpSession session = request.getSession();
User user = (User) session.getAttribute("USER_SESSION");
// 判斷Session中是否有用戶數(shù)據(jù),如果有,則返回true,繼續(xù)向下執(zhí)行
if (user != null) {
return true;
}
// 不符合條件的給出提示信息,并轉(zhuǎn)發(fā)到登錄頁(yè)面
request.setAttribute("msg", "您還沒(méi)有登錄,請(qǐng)先登錄!");
request.getRequestDispatcher("/login.jsp")
.forward(request, response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle在目標(biāo)方法執(zhí)行之后,視圖渲染之前執(zhí)行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("在所有方法執(zhí)行之后執(zhí)行");
}
該類所在目錄截圖
②配置攔截器(在springmvc-config.xml中配置)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-490414.html
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<bean class="interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
</beans>
說(shuō)明:
下面這種/** 表示攔截的是所有請(qǐng)求
如果要放行某個(gè)路徑,可在下面的標(biāo)簽進(jìn)行配置
③測(cè)試攔截器效果是否實(shí)現(xiàn)
在控制器中新建一個(gè)類作為登錄路徑和主頁(yè)main路徑以及l(fā)gCheck檢查登錄的路徑(簡(jiǎn)單模擬)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-490414.html
到了這里,關(guān)于Spring MVC攔截器Interceptor使用(判斷用戶登錄)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!