Java SpringBoot 使用攔截器作為權(quán)限控制的實(shí)現(xiàn)方法
如何實(shí)現(xiàn)
首先攔截器是屬于web這塊的,那我們需要引入springboot web模塊,具體版本在parent中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后我們在config目錄下新建interceptor目錄,用來放攔截器
- 我們新建兩個攔截器,一個用來登陸攔截,一個用來進(jìn)行管理員攔截。
- 登陸攔截不必多說,就是判斷除登陸請求外所有請求是否登陸過,沒有我們就截?cái)嗾埱?,然會返回失敗狀態(tài)
- 管理員攔截,攔截的是管理員才能訪問的資源,比如用戶管理/權(quán)限管理等,它是登陸攔截放行后才能進(jìn)行的,
- 就像關(guān)卡是一關(guān)一關(guān)的。登陸驗(yàn)證后進(jìn)入管理員驗(yàn)證,判斷該登陸用戶是否具有管理員權(quán)限,若擁有則放行,否則攔截并返回失敗狀態(tài)
- 攔截器的核心是實(shí)現(xiàn) org.springframework.web.servlet.HandlerInterceptor 接口,驗(yàn)證邏輯一般寫在 preHandle 方法中,在請求資源前
- 我的驗(yàn)證邏輯比較簡單,登陸驗(yàn)證就是從session中取出用戶信息,判斷是否存在,用戶信息是登陸成功時(shí)放入session中的,大家也可以使用JWT驗(yàn)證
- 管理員驗(yàn)證也是從session中取出管理員信息,判斷是否是管理員,管理員信息是登陸成功時(shí)將是否是管理員的信息放入session中的,大家也可以使用JWT驗(yàn)證
登陸攔截器
package com.example.interceptor_demo.config.interceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
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;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
* 攔截器,登錄檢查
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private HttpSession session;
@Autowired
private ObjectMapper objectMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
Object user = session.getAttribute("sessionUser");
if (sessionUser!=null){
return true;
}else {
Map<String,Object> notLogin = new HashMap<>();
notLogin.put("msg","not login");
notLogin.put("code",403);
notLogin.put("data",null);
try(PrintWriter printWriter = response.getWriter()){
printWriter.print(objectMapper.writeValueAsString(notLogin));
}catch (Exception e){
e.printStackTrace();
}
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
管理員攔截器
package com.example.interceptor_demo.config.interceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
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;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
* 攔截器,管理員驗(yàn)證
*/
@Component
public class AdminInterceptor implements HandlerInterceptor {
@Autowired
private HttpSession session;
@Autowired
private ObjectMapper objectMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
Boolean isAdmin = (Boolean)session.getAttribute("sessionAdmin");
if (isAdmin!=null && isAdmin){
return true;
}else {
Map<String,Object> notLogin = new HashMap<>();
notLogin.put("msg","no power");
notLogin.put("code",403);
notLogin.put("data",null);
try(PrintWriter printWriter = response.getWriter()){
printWriter.print(objectMapper.writeValueAsString(notLogin));
}catch (Exception e){
e.printStackTrace();
}
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
最后我們在config目錄下新建WebMvcConfig類,用來注冊攔截器
- 攔截器注冊類的核心是實(shí)現(xiàn) org.springframework.web.servlet.config.annotation.WebMvcConfigurer 接口
- 實(shí)現(xiàn) addInterceptors 方法,參數(shù) registry 對象可用來注冊攔截器
- registry.addInterceptor() 方法用來添加攔截器
- .addPathPatterns() 方法是為該攔截器添加攔截資源路徑
- .excludePathPatterns() 方法是為該攔截器添加要放行的資源路徑
- 其中 * 代表路徑下任意名稱,** 代表任意路徑下任意名稱
package com.example.interceptor_demo.config;
import com.example.interceptor_demo.config.interceptor.AdminInterceptor;
import com.example.interceptor_demo.config.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Autowired
private AdminInterceptor adminInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
this.loginInterceptor(registry);//登錄攔截
this.adminInterceptor(registry);//管理員攔截
}
private void loginInterceptor(InterceptorRegistry registry){
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns(//釋放登陸接口
"/login/**"
);
}
private void adminInterceptor(InterceptorRegistry registry){
registry.addInterceptor(htmlPageInterceptor)
.addPathPatterns("/admin/**");//攔截管理員接口
}
}
到此這篇關(guān)于Java SpringBoot 使用攔截器作為權(quán)限控制的文章就介紹到這了,更多相關(guān)Java SpringBoot攔截器權(quán)限控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+Spring Security+JWT實(shí)現(xiàn)RESTful Api權(quán)限控制的方法
- Springboot+Shiro+Jwt實(shí)現(xiàn)權(quán)限控制的項(xiàng)目實(shí)踐
- SpringBoot如何整合Springsecurity實(shí)現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制
- Springboot+Spring Security實(shí)現(xiàn)前后端分離登錄認(rèn)證及權(quán)限控制的示例代碼
- Springboot和bootstrap實(shí)現(xiàn)shiro權(quán)限控制配置過程
- Springboot+Vue+shiro實(shí)現(xiàn)前后端分離、權(quán)限控制的示例代碼
- SpringBoot整合Shiro實(shí)現(xiàn)權(quán)限控制的代碼實(shí)現(xiàn)
- SpringBoot詳解shiro過濾器與權(quán)限控制
- SpringBoot集成Swagger使用SpringSecurity控制訪問權(quán)限問題
- 淺談基于SpringBoot實(shí)現(xiàn)一個簡單的權(quán)限控制注解
- SpringSecurity實(shí)現(xiàn)RBAC權(quán)限管理
相關(guān)文章
Java配置JDK開發(fā)環(huán)境及環(huán)境變量
這篇文章主要為大家詳細(xì)介紹了Java配置JDK開發(fā)環(huán)境及環(huán)境變量,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
POI導(dǎo)出Excel報(bào)錯No such file or directory的解決方法
這篇文章主要為大家詳細(xì)介紹了POI導(dǎo)出Excel報(bào)錯No such file or directory的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
SpringBoot中如何解決讀取properties文件讀取問題
這篇文章主要介紹了SpringBoot中如何解決讀取properties文件讀取問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
Spring?Data?JPA框架的核心概念與Repository接口詳解
Spring?Data?JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套?JPA?應(yīng)?框架,可使開發(fā)者?極簡的代碼即可實(shí)現(xiàn)對數(shù)據(jù)庫的訪問和操作,本篇我們來了解Spring?Data?JPA框架的核心概念與Repository接口2022-04-04
IDEA實(shí)現(xiàn)Maven項(xiàng)目創(chuàng)建并連接Tomcat方式
Maven是一款由Apache開發(fā)的項(xiàng)目管理工具,主要用于Java項(xiàng)目的構(gòu)建和依賴管理,它通過pom.xml文件自動管理項(xiàng)目依賴的jar包,簡化了項(xiàng)目構(gòu)建過程,Maven支持項(xiàng)目從編寫源代碼到編譯、測試、打包、部署的全過程管理,其依賴管理功能免去了手動添加jar包的麻煩2024-10-10

