SpringBoot中使用攔截器攔截跳轉(zhuǎn)登錄的兩種實(shí)現(xiàn)方法
一、引言
在SpringBoot應(yīng)用中,權(quán)限控制是一個(gè)重要的功能,它確保了只有經(jīng)過身份驗(yàn)證的用戶才能訪問特定的資源。攔截器(Interceptor)是Spring框架提供的一種機(jī)制,用于在請(qǐng)求的生命周期中插入自定義邏輯,如身份驗(yàn)證、日志記錄等。本文將詳細(xì)介紹兩種在SpringBoot中使用攔截器來控制用戶登錄并跳轉(zhuǎn)到指定頁面的方法,以及它們的實(shí)現(xiàn)細(xì)節(jié)。
二、方法一:基于Session的攔截器
1、攔截器實(shí)現(xiàn)
1.1、創(chuàng)建攔截器類
在SpringBoot中,我們可以通過實(shí)現(xiàn)HandlerInterceptor
接口來創(chuàng)建一個(gè)攔截器。preHandle
方法是在請(qǐng)求處理之前調(diào)用的,如果返回false
,則請(qǐng)求將不會(huì)繼續(xù)執(zhí)行,這正是我們檢查用戶是否登錄的地方。
@Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException { User user = (User) request.getSession().getAttribute("user"); if(user == null){ request.setAttribute("msg","沒有權(quán)限"); request.getRequestDispatcher("/index").forward(request,response); return false; }else { return true; } } }
1.2、攔截器配置
接下來,我們需要在WebMvcConfigurer
的實(shí)現(xiàn)類中注冊(cè)我們的攔截器,并指定攔截路徑和排除路徑。
@Configuration public class WebConfigurer implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/index","/login"); } }
2、控制器和視圖
2.1、控制器實(shí)現(xiàn)
控制器A01Controller
負(fù)責(zé)處理登錄請(qǐng)求,并根據(jù)驗(yàn)證結(jié)果重定向到不同的頁面。
@Controller public class A01Controller { @RequestMapping("/index") public String test1(){ return "amodule/A01"; } @PostMapping(value = "/login") public String test2(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session, Map map){ if("123".equals(username) && "123".equals(password)){ User user = new User(); user.setUser_name(username); user.setPassword(password); session.setAttribute("user",user); return "redirect:/main.html"; }else { map.put("msg","賬號(hào)或密碼錯(cuò)誤,請(qǐng)重新登錄"); return "amodule/A01"; } } }
2.2、視圖實(shí)現(xiàn)
JSP頁面A01.jsp
作為登錄頁面,用戶在這里輸入用戶名和密碼。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Title</title> <!-- 省略CSS和JS引用 --> </head> <body> <!-- 登錄表單 --> <form style="margin-left:500px;margin-top:200px;" action="${pageContext.request.contextPath}/login" method="POST" id="formBtn"> <p style="color: red;">${msg}</p> <div class="form-group"> <label for="user" stype="display:inline;">賬戶:</label> <input type="text" class="form-control" name="username" id="user" style="display:inline;width:200px;"autocomplete="off" /> </div> <div class="form-group"> <label for="password" style="display:inline;">密碼:</label> <input type="text" class="form-control" name="password" id="password" style="display:inline;width:200px;"autocomplete="off" /> </div> <button type="submit" class="btn btn-primary">登錄</button> </form> </body> </html>
三、方法二:基于異常處理的攔截器
1、攔截器實(shí)現(xiàn)
1.1、創(chuàng)建攔截器類
在第二種方法中,我們同樣創(chuàng)建一個(gè)攔截器類MyInterceptor
,但這次我們?cè)谟脩粑吹卿洉r(shí)拋出一個(gè)自定義異常。
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object user = session.getAttribute("user"); if (null == user) { throw new LogOutException("用戶未登錄"); } return true; } }
1.2、攔截器配置
在LoginConfig
類中注冊(cè)攔截器,并設(shè)置攔截和排除路徑。
@Configuration public class LoginConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { InterceptorRegistration registration = registry.addInterceptor(new MyInterceptor()); registration.addPathPatterns("/**"); registration.excludePathPatterns("/doLoginUI", "/user/doLogin", "/bower_components/**", "/modules/**", "/plugins/**", "/dist/**"); } }
2、異常處理
2.1、自定義異常
創(chuàng)建一個(gè)自定義異常LogOutException
,用于在用戶未登錄時(shí)拋出。
public class LogOutException extends Exception { public LogOutException() { super(); } public LogOutException(String message) { super(message); } }
2.2、全局異常處理
創(chuàng)建一個(gè)全局異常處理類GlobalExceptionHandler
,用于捕獲并處理攔截器拋出的異常。
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(LogOutException.class) public String doLogOutException(LogOutException e) { return "redirect:/doLoginUI"; } }
3、登錄實(shí)現(xiàn)
3.1、控制器登錄方法
在控制器中實(shí)現(xiàn)登錄邏輯,并在成功登錄后將用戶信息存儲(chǔ)到Session中。
@RequestMapping("/doLogin") public JsonResult doLogin(String username, String password, HttpServletRequest request) throws Exception { sysUserService.doLogin(username, password); SysUser user = new SysUser(); user.setPassword(password); user.setUsername(username); HttpSession session = request.getSession(); session.setAttribute("user", user); return new JsonResult("登陸成功"); }
3.2、業(yè)務(wù)層登錄實(shí)現(xiàn)
在業(yè)務(wù)層實(shí)現(xiàn)登錄邏輯,包括密碼的加密和驗(yàn)證。
@Override public Boolean doLogin(String username, String password) throws Exception { SysUser user = sysUserDao.select(username); if (null == user) { throw new UnknownAccountException("用戶名不存在"); } SimpleHash sh = new SimpleHash("MD5", password, user.getSalt(), 1); String hashedPassword = sh.toHex(); if (!user.getPassword().equals(hashedPassword)) { throw new Exception("密碼錯(cuò)誤"); } return true; }
四、總結(jié)
本文詳細(xì)介紹了兩種在SpringBoot中使用攔截器來控制用戶登錄并跳轉(zhuǎn)到指定頁面的方法。第一種方法是基于Session的檢查,適用于大多數(shù)需要簡單權(quán)限控制的場(chǎng)景。第二種方法是基于異常處理,它提供了更靈活的錯(cuò)誤處理機(jī)制,適用于需要精細(xì)控制用戶訪問權(quán)限的復(fù)雜應(yīng)用。兩種方法各有優(yōu)勢(shì),開發(fā)者可以根據(jù)實(shí)際需求選擇適合的實(shí)現(xiàn)方式。
以上就是SpringBoot中使用攔截器攔截跳轉(zhuǎn)登錄的兩種實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot攔截器攔截跳轉(zhuǎn)登錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Intellij Idea中批量導(dǎo)入第三方j(luò)ar包的全過程
引入jar包一般都是針對(duì)小的java項(xiàng)目,這篇文章主要給大家介紹了關(guān)于Intellij Idea中批量導(dǎo)入第三方j(luò)ar包的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10詳解用Eclipse如何創(chuàng)建Web項(xiàng)目
本篇文章主要介紹了詳解用Eclipse如何創(chuàng)建Web項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12springboot手動(dòng)動(dòng)態(tài)注入controller和service方式
這篇文章主要介紹了springboot手動(dòng)動(dòng)態(tài)注入controller和service方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java中對(duì)null進(jìn)行強(qiáng)制類型轉(zhuǎn)換的方法
小編對(duì)null進(jìn)行強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋錯(cuò),非常的好奇,下面小編通過實(shí)例代碼給大家介紹Java中對(duì)null進(jìn)行強(qiáng)制類型轉(zhuǎn)換的方法,感興趣的朋友參考下吧2018-09-09SpringBoot集成WebSocket實(shí)現(xiàn)后臺(tái)向前端推送信息
在一次項(xiàng)目開發(fā)中,使用到了Netty網(wǎng)絡(luò)應(yīng)用框架,以及MQTT進(jìn)行消息數(shù)據(jù)的收發(fā),這其中需要后臺(tái)來將獲取到的消息主動(dòng)推送給前端,所以本文記錄了SpringBoot集成WebSocket實(shí)現(xiàn)后臺(tái)向前端推送信息的操作,需要的朋友可以參考下2024-02-02idea 實(shí)現(xiàn)搜索jdk中的類和包操作
這篇文章主要介紹了idea 實(shí)現(xiàn)搜索jdk中的類和包操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02IntelliJ IDEA下SpringBoot如何指定某一個(gè)配置文件啟動(dòng)項(xiàng)目
這篇文章主要介紹了IntelliJ IDEA下SpringBoot如何指定某一個(gè)配置文件啟動(dòng)項(xiàng)目問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09在Intellij Idea中使用jstl標(biāo)簽庫的方法
這篇文章主要介紹了在Intellij Idea中使用jstl標(biāo)簽庫的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼
這篇文章主要介紹了java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02