SpringMVC-攔截器-判斷使用者登入狀態
前言
如果一個使用者想要修改自己的個人資訊,那麼他必須是登入狀態下進行的
本文章將會簡單的配置一下攔截器的使用,以及一些簡單介紹
環境
- idea
- spring 依賴均為 5.0.0.RELEASE 版本
- jdk 1.8
....
開始
SpringMVC提供了 Interceptor 攔截器幾種機制:
- 實現
HandlerInterceptor
介面 - 繼承實現了
HandlerInterceptor
介面的類 - 實現
WebRequestInterceptor
介面 - 繼承實現了
WebRequestInterceptor
介面的類
我會使用實現HandlerInterceptor
介面的機制,其他的可以到網上查資料,用法是差不多的
檢視 HandlerInterceptor
介面原始碼:
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request,Object handler,@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request,@Nullable Exception ex) throws Exception {
}
}
複製程式碼
三個方法的作用:
-
preHandle: 執行 Handler 方法之前執行,返回值是 Boolean 型別,如果返回 false,表示攔截請求,不再向下執行,如果返回 true,表示放行,程式繼續向下進行(如果後面沒有其他攔截器,就會直接執行 controller 方法)
-
postHandle: 執行 Handler 之後,返回 ModelAndView 之前執行
-
afterCompletion: 執行完 Handler 之後執行,由於是在 controller 方法執行完畢後執行該方法,所以該方法適合進行統一的異常或者日誌處理操作
建立登入攔截
- 登入控制器:
package com.ujiuye.controller;
import com.ujiuye.domain.User;
import com.ujiuye.exception.UserException;
import com.ujiuye.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@Autowired
private IUserService userService;
//登入方法
@RequestMapping("login")
public String login(String username,String password,HttpSession session,Model model) throws UserException {
User user = userService.selectLogin(username,password);
if (user!=null){
//user物件放入session作用域
session.setAttribute("USER_IN_SESSION",user);
//跳轉到使用者列表頁面
return "redirect:/user/query.do";
}else {
//跳轉到登入頁面,提示使用者名稱或密碼錯誤
model.addAttribute("msg","使用者名稱或者密碼錯誤");
return "forward:/login.jsp";
}
}
}
複製程式碼
- 登入檢查
package com.ujiuye.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 {
//登入檢查,實現介面裡的這個方法
public boolean preHandle(HttpServletRequest request,Object handler) throws Exception {
//判斷session中是否有"USER_IN_SESSION"的key
HttpSession session = request.getSession();
Object user = session.getAttribute("USER_IN_SESSION");
if (user == null){
//跳轉到登入頁面
response.sendRedirect("login.jsp");
return false;
}
return true;
}
}
複製程式碼
檢視session是否有 USER_IN_SESSION 的key,如果有就代表已經登陸,反之;
配置全域性攔截器
springMVC.xml 檔案裡
<!--攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--攔截的路徑/*一級路徑 /**所有路徑-->
<mvc:mapping path="/**"/>
<!--排除登入頁面-->
<mvc:exclude-mapping path="/login.do"/>
<!-- 攔截器類-->
<bean class="com.ujiuye.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!--第二個攔截器-->
</mvc:interceptor>
<mvc:interceptor>
<!--第三個攔截器-->
</mvc:interceptor>
</mvc:interceptors>
複製程式碼
記得排除掉登入頁面;
</mvc:interceptors>
: 標籤下可以建立多個攔截器,從上往下執行
總結
其實就是登入成功後在session放入一個key,然後攔截器實現 HandlerInterceptor
介面,實現裡面的方法,判斷session是否存在登入的key,有的話就是已登入,沒有就再跳回登入頁面,防止使用者直接進入深一層的頁面,
然後再springMVC.xml配置檔案裡配置一個全域性攔截器,就ok了。
兩種介面的區別
HandlerInterceptor
: 主要進行請求前, 和請求後的攔截而
WebRequestInterceptor
:針對請求的攔截器介面,該介面中沒有response
(響應),所以該介面只進行請求資料的準備和處理
檢視 WebRequestInterceptor
介面原始碼:
public interface WebRequestInterceptor {
// 該方法返回值為 **void**,無返回值,由於沒有返回值,所以使用該方法主要進行資料的前期準備,
void preHandle(WebRequest request) throws Exception;
void postHandle(WebRequest request,@Nullable ModelMap model) throws Exception;
void afterCompletion(WebRequest request,@Nullable Exception ex) throws Exception;
}
複製程式碼
個人部落格: aaatao66.github.io/
這次的文章很短,第二種介面的使用方法沒有過多的描述,如果想要知道可以到網上尋找相關資料