SpringMVC-攔截器-判斷用戶登陸狀態

前言

若是一個用戶想要修改本身的我的信息, 那麼他必須是登陸狀態下進行的java

本文章將會簡單的配置一下攔截器的使用,以及一些簡單介紹git


環境

  • idea
  • spring 依賴均爲 5.0.0.RELEASE 版本
  • jdk 1.8

....github

開始

SpringMVC提供了 Interceptor 攔截器幾種機制:web

  • 實現 HandlerInterceptor接口
  • 繼承實現了 HandlerInterceptor接口的類
  • 實現 WebRequestInterceptor接口
  • 繼承實現了 WebRequestInterceptor接口的類

我會使用實現HandlerInterceptor接口的機制, 其餘的能夠到網上查資料,用法是差很少的spring

查看 HandlerInterceptor接口源碼:session

public interface HandlerInterceptor {

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		return true;
	}

	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception {
	}

	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {
	}

}
複製代碼

三個方法的做用:mvc

  • preHandle: 執行 Handler 方法以前執行, 返回值是 Boolean 類型, 若是返回 false, 表示攔截請求,再也不向下執行, 若是返回 true , 表示放行, 程序繼續向下進行(若是後面沒有其餘攔截器,就會直接執行 controller 方法)app

  • postHandle: 執行 Handler 以後, 返回 ModelAndView 以前執行dom

  • afterCompletion: 執行完 Handler 以後執行, 因爲是在 controller 方法執行完畢後執行該方法, 因此該方法適合進行統一的異常或者日誌處理操做jsp


建立登陸攔截

  • 登陸控制器:
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, HttpServletResponse response, 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…

此次的文章很短, 第二種接口的使用方法沒有過多的描述, 若是想要知道能夠到網上尋找相關資料

相關文章
相關標籤/搜索