SpringBoot中使用攔截器攔截跳轉(zhuǎn)登錄的兩種實現(xiàn)方法
一、引言
在SpringBoot應用中,權(quán)限控制是一個重要的功能,它確保了只有經(jīng)過身份驗證的用戶才能訪問特定的資源。攔截器(Interceptor)是Spring框架提供的一種機制,用于在請求的生命周期中插入自定義邏輯,如身份驗證、日志記錄等。本文將詳細介紹兩種在SpringBoot中使用攔截器來控制用戶登錄并跳轉(zhuǎn)到指定頁面的方法,以及它們的實現(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","沒有權(quán)限");
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ù)驗證結(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","賬號或密碼錯誤,請重新登錄");
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;
}
四、總結(jié)
本文詳細介紹了兩種在SpringBoot中使用攔截器來控制用戶登錄并跳轉(zhuǎn)到指定頁面的方法。第一種方法是基于Session的檢查,適用于大多數(shù)需要簡單權(quán)限控制的場景。第二種方法是基于異常處理,它提供了更靈活的錯誤處理機制,適用于需要精細控制用戶訪問權(quán)限的復雜應用。兩種方法各有優(yōu)勢,開發(fā)者可以根據(jù)實際需求選擇適合的實現(xiàn)方式。
以上就是SpringBoot中使用攔截器攔截跳轉(zhuǎn)登錄的兩種實現(xiàn)方法的詳細內(nèi)容,更多關于SpringBoot攔截器攔截跳轉(zhuǎn)登錄的資料請關注腳本之家其它相關文章!
相關文章
springboot手動動態(tài)注入controller和service方式
這篇文章主要介紹了springboot手動動態(tài)注入controller和service方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息
在一次項目開發(fā)中,使用到了Netty網(wǎng)絡應用框架,以及MQTT進行消息數(shù)據(jù)的收發(fā),這其中需要后臺來將獲取到的消息主動推送給前端,所以本文記錄了SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的操作,需要的朋友可以參考下2024-02-02
IntelliJ IDEA下SpringBoot如何指定某一個配置文件啟動項目
這篇文章主要介紹了IntelliJ IDEA下SpringBoot如何指定某一個配置文件啟動項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
java 實現(xiàn)單鏈表逆轉(zhuǎn)詳解及實例代碼
這篇文章主要介紹了java 實現(xiàn)單鏈表逆轉(zhuǎn)實例代碼的相關資料,需要的朋友可以參考下2017-02-02

