• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • java開發筆記:SpringBoot攔截器Interceptor (實現簡單的登陸攔截器[白名單,重定向,模擬登陸])

    標簽: Java(SpringBoot)企業日常開發知識筆記  springboot  interceptor  java

    定義

    攔截器顧名思義是攔截打到控制器的請求然后做一些個性化的定制功能比如說302重定向等等,(Interceptor)攔截器相對于(Filter)過濾器可以攔截細一些的東西比如控制請求的方法和控制器,但是控制不了請求方法中的參數。

     

    使用場景

    最常用的幾個場景

    1. 登陸攔截器:

    • 白名單
    • 測試環境表單模擬登陸
    • 登陸狀態攔截并302重定向login頁面

    2. 國際化

    3. 鑒權

     

    攔截順序

    方法執行順序

    preHandle -> Controller -> postHandle -> afterCompletion

    • postHandle:在控制器后并生成視圖前被調用,此時有機會修改ModelAndView。
    • afterCompletion:(已經渲染視圖)后被執行。

     

    實現一個登陸攔截器為例:(實現模擬登陸以及未登陸的重定向 以及白名單配置)

    Interceptor:

    @Component
    public class TestLoginInterceptor extends HandlerInterceptorAdapter {
        // 登陸url用于重定向
        public static String LOGIN_URL = "/login"; 
        // 測試環境和開發環境可以模擬登陸
        private static Set<String> MOCK_ENABLE_PROFILE = Sets.newHashSet("debug", "test");
    
        @Value("${spring.profiles.active}")
        private String profile;
    
        @Resource
        private TestMemberService testMemberService;
    
        @Autowired
        private RedisUtil redisUtil;
    
        /**
         * 攔截處理
         */
        @Override
        public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
            res.addHeader("Connection", "close");
            String requestUrl = req.getContextPath()+req.getServletPath();
            // 放過登錄請求和健康檢測
            if (requestUrl.startsWith("/login") || requestUrl.startsWith("/health")) {
                return true;
            }
    
            // 模擬登陸
            if(isNotRelease() && StringUtils.isNotEmpty(req.getHeader("x-mock-phone"))) {
                initMockSession(req, res, req.getHeader("x-mock-phone"));
            }
    
            // 認證身份信息
            if (null != redisUtil.get(req)) {
                // 重置身份過期時間
                redisUtil.resetExpire(req);
            }else{
                // 重定向
                String contextPath = req.getContextPath();
                res.sendRedirect(contextPath+LOGIN_URL);
                return false;
            }
            return true;
        }
    
        private void initMockSession(HttpServletRequest req, HttpServletResponse res, String phone) {
            Menber member = testMemberService.getUserInfo(phone);
    
            if (Objects.isNull(member)) {
                return;
            }
    
            SessionUser sessionUser = new AcceptSessionUser();
            sessionUser.setLoginName(member.getMemMobile());
            sessionUser.setUserName(member.getMemName());
            redisUtil.set(req, res, sessionUser);
        }
    
        // 判斷環境是否是測試或開發
        private boolean isNotRelease() {
            String curProfile = StringUtils.lowerCase(profile);
            return MOCK_ENABLE_PROFILE.contains(curProfile);
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            super.afterCompletion(request, response, handler, ex);
        }
    }
    

    注冊攔截器:

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
      @Resource private TestLoginInterceptor loginInterceptor;
    
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/**/*.css","/**/*.js"); // 排除css后綴和js后綴的路徑訪問路徑
      }
    }

     

    轉載請注明出處。

    版權聲明:本文為qq_36652619原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_36652619/article/details/109135187

    智能推薦

    Spring Boot攔截器配置攔截登陸

    一、pom.xml配置     這里很簡單,先引入spring-boot,parent是父模塊,有父模塊統一進行spring-boot版本管理,dependencies中與spring-boot綁定的包不需要再指定版本。 二、新建WebConfigurer     1、如圖,新建config包,用來裝初始化文件,在config之下新建WebConfigure...

    PHP關于檢測用戶是否登陸,以及設置攔截器(簡單實現)

    昨天沒有午休,搞了一下午居然沒搞明白,今天半個小時搞定了,看來還是早上效率高,看了午休還是必須的 進入正題,有注冊系統的網站當然必須有安全機制 ,概述如下 1.登陸 需要檢測用戶的合法性 2.在主頁要檢測是否登陸過,其實就是檢測上面的username是否存在(當然也可以是密碼+用戶名),這個文件只要使用include 放到想要檢測登陸的頁面就可以了 使用:<?php session_star...

    SpringBoot web--RestfulCRUD-demo-登陸&amp;amp;攔截器(學習筆記17)

    1、登錄 上面重定向的問題:http://localhost:8080/crud/main 在用戶不登錄的狀態,依然可以訪問主頁面信息? 2、攔截器  進行登錄檢查 事例:https://download.csdn.net/download/yufang131/10425109 感謝--尚硅谷...

    Spring Boot學習筆記11——web開發06(登陸&攔截器)

    1. 登陸 這個登陸功能先不連接數據庫,只需填寫任意用戶名,密碼是123456即可登陸成功來到后臺 1.1 清緩存 開發期間模板引擎頁面修改以后,要實時生效 禁用模板引擎的緩存 頁面修改完成以后ctrl+f9,重新編譯 1.2 配置首頁 1.3 控制器方法 1.4 添加錯誤提示 運行測試 1.5 重定向 為了解決上面表單重復提交和樣式丟失的問題,我們在前面寫好的mvc配置類MyMvcConfig的...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡