1. 程式人生 > 程式設計 >SpringMVC-攔截器-判斷使用者登入狀態

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/

掘金: juejin.im/user/5d1873…

這次的文章很短,第二種介面的使用方法沒有過多的描述,如果想要知道可以到網上尋找相關資料