SpringBoot中使用攔截器攔截跳轉登錄的兩種實現(xiàn)方法
一、引言
在SpringBoot應用中,權限控制是一個重要的功能,它確保了只有經(jīng)過身份驗證的用戶才能訪問特定的資源。攔截器(Interceptor)是Spring框架提供的一種機制,用于在請求的生命周期中插入自定義邏輯,如身份驗證、日志記錄等。本文將詳細介紹兩種在SpringBoot中使用攔截器來控制用戶登錄并跳轉到指定頁面的方法,以及它們的實現(xiàn)細節(jié)。
二、方法一:基于Session的攔截器
1、攔截器實現(xiàn)
1.1、創(chuàng)建攔截器類
在SpringBoot中,我們可以通過實現(xiàn)HandlerInterceptor
接口來創(chuàng)建一個攔截器。preHandle
方法是在請求處理之前調(diào)用的,如果返回false
,則請求將不會繼續(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","沒有權限"); request.getRequestDispatcher("/index").forward(request,response); return false; }else { return true; } } }
1.2、攔截器配置
接下來,我們需要在WebMvcConfigurer
的實現(xiàn)類中注冊我們的攔截器,并指定攔截路徑和排除路徑。
@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、控制器實現(xiàn)
控制器A01Controller
負責處理登錄請求,并根據(jù)驗證結果重定向到不同的頁面。
@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","賬號或密碼錯誤,請重新登錄"); return "amodule/A01"; } } }
2.2、視圖實現(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、攔截器實現(xiàn)
1.1、創(chuàng)建攔截器類
在第二種方法中,我們同樣創(chuàng)建一個攔截器類MyInterceptor
,但這次我們在用戶未登錄時拋出一個自定義異常。
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
類中注冊攔截器,并設置攔截和排除路徑。
@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)建一個自定義異常LogOutException
,用于在用戶未登錄時拋出。
public class LogOutException extends Exception { public LogOutException() { super(); } public LogOutException(String message) { super(message); } }
2.2、全局異常處理
創(chuàng)建一個全局異常處理類GlobalExceptionHandler
,用于捕獲并處理攔截器拋出的異常。
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(LogOutException.class) public String doLogOutException(LogOutException e) { return "redirect:/doLoginUI"; } }
3、登錄實現(xiàn)
3.1、控制器登錄方法
在控制器中實現(xiàn)登錄邏輯,并在成功登錄后將用戶信息存儲到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è)務層登錄實現(xiàn)
在業(yè)務層實現(xià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("密碼錯誤"); } return true; }
四、總結
本文詳細介紹了兩種在SpringBoot中使用攔截器來控制用戶登錄并跳轉到指定頁面的方法。第一種方法是基于Session的檢查,適用于大多數(shù)需要簡單權限控制的場景。第二種方法是基于異常處理,它提供了更靈活的錯誤處理機制,適用于需要精細控制用戶訪問權限的復雜應用。兩種方法各有優(yōu)勢,開發(fā)者可以根據(jù)實際需求選擇適合的實現(xiàn)方式。
以上就是SpringBoot中使用攔截器攔截跳轉登錄的兩種實現(xiàn)方法的詳細內(nèi)容,更多關于SpringBoot攔截器攔截跳轉登錄的資料請關注腳本之家其它相關文章!
相關文章
springboot手動動態(tài)注入controller和service方式
這篇文章主要介紹了springboot手動動態(tài)注入controller和service方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息
在一次項目開發(fā)中,使用到了Netty網(wǎng)絡應用框架,以及MQTT進行消息數(shù)據(jù)的收發(fā),這其中需要后臺來將獲取到的消息主動推送給前端,所以本文記錄了SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的操作,需要的朋友可以參考下2024-02-02IntelliJ IDEA下SpringBoot如何指定某一個配置文件啟動項目
這篇文章主要介紹了IntelliJ IDEA下SpringBoot如何指定某一個配置文件啟動項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09