<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    SpringBoot實現登錄攔截器

    VSole2022-03-22 16:20:08

    對于管理系統或其他需要用戶登錄的系統,登錄驗證都是必不可少的環節,在 SpringBoot 開發的項目中,通過實現攔截器來實現用戶登錄攔截并驗證。

    1、SpringBoot 實現登錄攔截的原理

    SpringBoot 通過實現HandlerInterceptor接口實現攔截器,通過實現WebMvcConfigurer接口實現一個配置類,在配置類中注入攔截器,最后再通過 @Configuration 注解注入配置.

    1.1、實現HandlerInterceptor接口

    實現HandlerInterceptor接口需要實現 3 個方法:preHandlepostHandleafterCompletion.

    3 個方法各自的功能如下:

    package blog.interceptor;
    
    import blog.entity.User;
    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;
    
    public class UserLoginInterceptor implements HandlerInterceptor {
    
        /***
         * 在請求處理之前進行調用(Controller方法調用之前)
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("執行了攔截器的preHandle方法");
            try {
                HttpSession session = request.getSession();
                //統一攔截(查詢當前session是否存在user)(這里user會在每次登錄成功后,寫入session)
                User user = (User) session.getAttribute("user");
                if (user != null) {
                    return true;
                }
                response.sendRedirect(request.getContextPath() + "login");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
            //如果設置為false時,被請求時,攔截器執行到此處將不會繼續操作
            //如果設置為true時,請求將會繼續執行后面的操作
        }
    
        /***
         * 請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后)
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("執行了攔截器的postHandle方法");
        }
    
        /***
         * 整個請求結束之后被調用,也就是在DispatchServlet渲染了對應的視圖之后執行(主要用于進行資源清理工作)
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("執行了攔截器的afterCompletion方法");
        }
    }
    
    

    preHandle在 Controller 之前執行,因此攔截器的功能主要就是在這個部分實現:

    1. 檢查 session 中是否有user對象存在;
    2. 如果存在,就返回true,那么 Controller 就會繼續后面的操作;
    3. 如果不存在,就會重定向到登錄界面
    4. 就是通過這個攔截器,使得 Controller 在執行之前,都執行一遍preHandle.

    1.2、實現WebMvcConfigurer接口,注冊攔截器

    實現WebMvcConfigurer接口來實現一個配置類,將上面實現的攔截器的一個對象注冊到這個配置類中.

    package blog.config;
    
    import blog.interceptor.UserLoginInterceptor;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class LoginConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //注冊TestInterceptor攔截器
            InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());
            registration.addPathPatterns("/**"); //所有路徑都被攔截
            registration.excludePathPatterns(    //添加不攔截路徑
                    "/login",                    //登錄路徑
                    "/**/*.html",                //html靜態資源
                    "/**/*.js",                  //js靜態資源
                    "/**/*.css"                  //css靜態資源
            );
        }
    }
    
    

    將攔截器注冊到了攔截器列表中,并且指明了攔截哪些訪問路徑,不攔截哪些訪問路徑,不攔截哪些資源文件;最后再以 @Configuration 注解將配置注入。

    1.3、保持登錄狀態

    只需一次登錄,如果登錄過,下一次再訪問的時候就無需再次進行登錄攔截,可以直接訪問網站里面的內容了。

    在正確登錄之后,就將user保存到session中,再次訪問頁面的時候,登錄攔截器就可以找到這個user對象,就不需要再次攔截到登錄界面了.

    @RequestMapping(value = {"", "/", "/index"}, method = RequestMethod.GET)
    public String index(Model model, HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        model.addAttribute("user", user);
        return "users/index";
    }
    
    @RequestMapping(value = {"/login"}, method = RequestMethod.GET)
    public String loginIndex() {
        return "users/login";
    }
    
    @RequestMapping(value = {"/login"}, method = RequestMethod.POST)
    public String login(@RequestParam(name = "username")String username, @RequestParam(name = "password")String password,
                        Model model, HttpServletRequest request) {
        User user = userService.getPwdByUsername(username);
        String pwd = user.getPassword();
        String password1 = MD5Utils.md5Code(password).toUpperCase();
        String password2 = MD5Utils.md5Code(password1).toUpperCase();
        if (pwd.equals(password2)) {
            model.addAttribute("user", user);
            request.getSession().setAttribute("user", user);
            return "redirect:/index";
        } else {
            return "users/failed";
        }
    }
    
    

    2、代碼實現及示例

    代碼實現如上所示。

    在登錄成功之后,將user信息保存到session中,下一次登錄時瀏覽器根據自己的SESSIONID就可以找到對應的session,就不要再次登錄了,可以從 Chrome 瀏覽器中看到。

    3、效果驗證

    3.1、訪問 localhost:8081/index 頁面:

    被重定向到了 localhost:8081/login,實現了登錄攔截。

    3.2、正確輸入用戶名和密碼登錄

    3.3、再次訪問 localhost:8081/index

    沒有再次被登錄攔截器攔截,證明可以保持登錄.

    作者:Kant101
    https://blog.csdn.net/qq_27198345/article/details/111401610
    session
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    會話機制Cookie/Session:在web應用中,常用的會話追蹤機制是Cookie和Session
    跨語言移植一直是技術領域內難以解決的問題,需要解決語言之間的約束,好在先前我們成功使用 Go 實現了 IIOP 協議通信,有了前車之鑒,所以這次我們將繼續使用跨語言方式實現 Flask Session 偽造。本文以 Apache Superset 權限繞過漏洞(CVE-2023-27524) 為例講述我們是如何在 Go 中實現 Flask 框架的 Session 驗證、生成功能的。
    在一次瀏覽某推中發現了發現了了一個web challenge的賞金ctf,這里從來學習一下由于使session_start()報錯引發的危害。page=showMeTheCode程序分析index.php define; class Session{ public static $id = null; protected static $isInit = false; protected static $started = false; public static function start(){ self::$isInit = true; if (!
    域內定位個人PC的三種方式
    [VNCTF2022]gocalc0復現
    2022-05-07 16:02:38
    看雪論壇作者ID:H3h3QAQ
    跨站請求偽造,也被稱為“OneClick Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。 一、CSRF介紹 CSRF(Cross-site request forgery) 跨站請求偽造,也被稱為“OneClick Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。
    微軟SMB和空會話介紹?
    2022-06-06 07:06:54
    空會話意味著對網絡資源的訪問是在沒有身份驗證的情況下授予的。也稱為匿名或訪客訪問,最常見的是IPC$ "Windows Named Pipe"共享。人們傾向于認為用戶名是唯一的身份驗證機制,在工作組中,這基本上是正確的。
    1.驗證碼復用 漏洞描述 當服務器端受理請求后,沒有將上一次保存的session及時清空,將會導致驗證碼可重復使用 通常情況下在網站注冊、登錄、找回密碼等頁面都會設計驗證碼驗證。如果設計不合理,將會刀子驗證碼在驗證成功一次之后,下次使用的就不在驗證也就說可以重復使用。 案例: 可以看到此處前端登錄雖有驗證碼驗證,但是只驗證一次。后續可一直使用該驗證碼。 測試方法:發送到repeater
    IPC$ (Internet Process Connection) 是共享“命名管道”的資源,它是為了讓進程間通信而開放的命名管道,通過提供可信任的用戶名和口令,連接雙方可以建立安全的通道并以此通道進行加密數據的交換,從而實現對遠程計算機的訪問。IPC$是NT2000的一項新功能,它有一個特點,即在同一時間內,兩個IP之間只允許建立一個連接。
    AuthMatrix 是一個Burp Suite擴展,用于檢測權限授權問題,設置好session就能進行自動化測試。相似功能的插件還有:BurpSuite Authz。Authz會先訪問一遍接口抓包,然后“Send request(s) to Authz”,設置低權限的cookie,“Run”就會使用低權限的cookie去請求,結果會匹配給出相似度百分比,可以查看每個請求的詳細,半自動測試。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类