1. 程式人生 > 實用技巧 >簡單使用攔截器實現登入+攔截器

簡單使用攔截器實現登入+攔截器

攔截器

參考b站狂神視訊

Spring MVC中的攔截器(Interceptor)類似於Servlet中的過濾器(Filter),它主要用於攔截使用者請求並作相應的處理。例如通過攔截器可以進行許可權驗證、記錄請求資訊的日誌、判斷使用者是否登入等。

攔截器(Interceptor):它依賴於web框架,在SpringMVC中就是依賴於SpringMVC框架。在實現上,基於Java的反射機制,屬於面向切面程式設計(AOP)的一種運用,就是在service或者一個方法前,呼叫一個方法,或者在方法後,呼叫一個方法,比如動態代理就是攔截器的簡單實現,在呼叫方法前打印出字串(或者做其它業務邏輯的操作),也可以在呼叫方法後打印出字串,甚至在丟擲異常的時候做業務邏輯的操作。由於攔截器是基於web框架的呼叫,因此可以使用Spring的依賴注入(DI)進行一些業務操作,同時一個攔截器例項在一個controller生命週期之內可以多次呼叫。但是缺點是隻能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求則沒辦法進行攔截處理。

攔截器重寫三個方法,詳見參考,其與過濾器的區別參考 https://blog.csdn.net/zxd1435513775/article/details/80556034

為了解決 使用者可以不登陸便可進入主頁,這是不安全的,為了解決這個問題,便可使用攔截器。

一、新建登入攔截器

LoginHandlerIntercepter.java

package com.example.employee_management.config;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* @className: LoginHandlerIntercepter
* @description: 登入攔截器
*/
public class LoginHandlerIntercepter implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

//獲取登入使用者的session
Object loginUser=request.getSession().getAttribute("loginUser");

//session不存在,即使用者尚未登入
if(loginUser==null){
request.setAttribute("msg","請先登入");
//返回首頁
request.getRequestDispatcher("/index.html").forward(request,response);

return false;

}else {
return true;
}

}
}

二、在MVC配置類中新增登入攔截器

MyMvcConfig.java

package com.example.employee_management.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
* @className: MyMvcConfig
* @description: MVC 控制器 藉助註解完成控制器而不用手動編寫
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

/**
* MVC 新增首頁控制器
*
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//這裡 “/”和“/index.html”效果一樣,因為web專案預設頁是index.html
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");

//新增使用者主頁
registry.addViewController("/main.html").setViewName("dashboard");
}


/**
* 將國際化元件放入ioc容器中
*
* @return
*/
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}


/**
* 新增登入攔截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns("/**")//對所有請求進行攔截
.excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**");此路徑下請求的進行放行,可以是一些靜態資源
}
}

三、修改登入控制器:新增session來保證攔截器正常執行

LoginController.java

package com.example.employee_management.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;

@Controller
public class LoginController {

@RequestMapping("/user/login")
public String login(@RequestParam("username")String username,
@RequestParam("password")String password, Model model,
HttpSession session){

//使用者名稱不為空且密碼正確 注意這裡的資料是預設密碼為123456,便於除錯
if(!StringUtils.isEmpty(username) && "123456".equals(password)){
session.setAttribute("loginUser",username);
return "redirect:/main.html";
}else {
//使用者名稱或密碼錯誤
model.addAttribute("msg","使用者名稱或密碼錯誤");
return "index";
}
}
}

啟動專案後,在瀏覽器中輸入

localhost:8080/main.html

便會轉入到首頁(index.html),並且提示使用者尚未登入。 登入攔截器的功能便已完成。