欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中使用攔截器攔截跳轉(zhuǎn)登錄的兩種實(shí)現(xiàn)方法

 更新時(shí)間:2024年11月13日 10:42:51   作者:eqa11  
攔截器(Interceptor)是Spring框架提供的一種機(jī)制,用于在請(qǐng)求的生命周期中插入自定義邏輯,如身份驗(yàn)證、日志記錄等,本文將詳細(xì)介紹兩種在SpringBoot中使用攔截器來控制用戶登錄并跳轉(zhuǎ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)文章

最新評(píng)論