• <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 Session攔截器實現登陸功能

    標簽: idea  springboot  spring

    本人新手,不足之處,請諒解。 有不足之處,歡迎提出。

    下面開始給大家介紹具體的實現:
    先說下具體用到的幾個類:
    在這里插入圖片描述
    1.在這里先給大家說下Session的主要內容( 檢查session登陸的信息,判斷是否是首頁登陸,(是則通過,不是跳轉登陸頁面)判斷是否是ajax的請求,是則直接放行)

    HandlerInterceptor :SpringWebMVC的處理器攔截器,類似于Servlet開發中的過濾器Filter,用于處理器進行預處理和后處理
    preHandle:方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行調用。
    postHandle:postHandle是進行處理器攔截用的,它的執行時間是在處理器進行處理之后,也就是在Controller的方法調用之后執行,但是它會在DispatcherServlet進行視圖的渲染之前執行,也就是說在這個方法中你可以對ModelAndView進行操作。
    afterCompletion:調用前提:preHandle返回true,調用時間DispatcherServlet進行視圖的渲染之后

    下面我來貼出具體代碼

    package com.example.admins.system;
    
    
    import com.example.admins.Bean.UserBean_a;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @describe Session攔截器
     */
    public class SessionInterceptor implements HandlerInterceptor {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(SessionInterceptor.class);
    
        /**
         * 檢查session中的登錄信息,區別ajax
         */
        @Override                                      //獲取請求 和發送請求到服務器中   定義類的名稱
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //獲取類的名稱  賦值給requestURI  參數 進行相關的調用
            String requestURI = request.getRequestURI();
            //在控制臺輸出  獲取到的所有的相關的路徑
            LOGGER.info("Session 檢查,請求 URI:" + requestURI);
            // 再次獲取參數賦值給uri的問題
            String uri = request.getRequestURI();
            //判斷非空
            if (uri != null) {
                //todo 判斷是否的登陸的首頁  登陸則通過
                //String類型有一個方法:contains(),該方法是判斷字符串中是否有子字符串。如果有則返回true,如果沒有則返回false。  page/login是我的登陸頁面
                if (uri.contains("/page/login")) {// 登錄請求直接放行 對于某些不需要驗證的uri可以特殊處理
    
                    return true;
    
                }
                //todo 判斷是否已經登錄    此處的("user") 是登陸中獲取的,判斷是否登陸
                UserBean_a member = (UserBean_a) request.getSession().getAttribute("user");
                if (member == null) {
                    if (isAjax(request)) {
                        LOGGER.info("是ajax請求");
                        //指定格式防止亂碼
                        response.setHeader("Cache-Control", "no-cache");
                        response.setHeader("Content-Type", "text/json;charset=utf-8");
                        response.setCharacterEncoding("UTF-8");
                    } else {
                        //重定向頁面 如果沒有登錄就跳轉到登錄頁面   page/login是我的登陸頁面
                        response.sendRedirect(request.getContextPath() + "/page/login");
                        //停止 運行
                        return false;
                    }
    
                }
            }
            //繼續 運行
            return true;
        }
    
        /**
         * 處理成功才進入post處理
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            //LOGGER.info(">>>>>>>>>>>請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后)");
    
        }
    
        /**
         * 處理完后進入,不論是否拋除異常
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            //LOGGER.info(">>>>>>>>>>>在整個請求結束之后被調用,也就是在DispatcherServlet 渲染了對應的視圖之后執行(主要是用于進行資源清理工作)");
        }
    
        /**
         * @param request
         * @return
         * @describe 判斷是否是ajax請求
         */
        private boolean isAjax(HttpServletRequest request) {
            String xrw = request.getHeader("X-Requested-With");
            if ("XMLHttpRequest".equalsIgnoreCase(xrw)) {
                return true;
            }
            return false;
        }
    }
    
    

    2.下面我來給大家介紹,攔截器的主要類
    這個類的位置也很關鍵,請大家注意,這是我遇到的坑
    在這里插入圖片描述

    代碼貼上:

    package com.example.admins;
    
    import com.example.admins.system.SessionInterceptor;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.*;
    
    //放在主類上不包括其他東西
    //WebMvcConfigurerAdapter這個類,重寫這個類中的方法可以讓我們增加額外的配置
    @Configuration
    public class WebAppConfigurer implements WebMvcConfigurer {
    //addResourceLocations指的是文件放置的目錄
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 多個攔截器組成一個攔截器鏈 
            registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
        }
    //addResoureHandler指的是對外暴露的訪問路徑 此處一般默認即可
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            // 靜態資源攔截器
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        }
    }
    

    我說下我在這個類中遇到的坑:excludePathPatterns("/static/**"); 是放行本類中的一些css/js 等樣式,大家在此處應該注意下: 1.是不是所有的樣式在static中 2.直接貼圖,
    在這里插入圖片描述確認頁面的樣式是不是從static 中進去 如果不是他可能會把你的樣式進行攔截。此處是本人的坑,希望大家注意;

    3.最后我來說下:登陸中對此類的應該 控制臺的登陸代碼
    貼代碼:
    此處的 User 是我們在第一條 登陸判斷的時候的 User ,他從控制臺獲取登陸的數據,來判斷你是否登陸
    登錄成功之后將用戶信息保存到session里
    session.setAttribute(“user”, userBean1);

    //登陸
        @RequestMapping(value = "/index")
        @ResponseBody
        public String lo(UserBean_a userBean, HttpSession session) {
    
            System.out.println("------------控制臺前端輸入的獲取的賬號輸入的" + userBean.getUsername());
    
             UserBean_a userBean1 = userService.userLogin(userBean);
            System.out.println("------------userBean1的賬號" +userBean1);
           
            if (userBean1 != null) {          
                System.out.println(userBean1);
                log.debug("用戶登陸成功--{}", JSONObject.toJSONString(userBean1));
                // 登錄成功之后將用戶信息保存到session里
                session.setAttribute("user", userBean1);
                /* System.out.println(md5Pass);*/
                return userBean1.toString();
            }
            log.debug("用戶登陸失敗--{}", JSONObject.toJSONString(userBean1));
            return null;
        }
    

    這樣就完成了登陸攔截請求。

    一個新手、沒背景的野雞大學掙脫出來的野小子,主要以不斷
    學習,不斷記錄,用思維認知去看這個世界。寫作、閱讀、分享,用獨自的思考和感悟分享給互聯網里的每一位技術人。
    不愛學習的我們,無力的掙扎吧!

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

    智能推薦

    SpringBoot(39) —— Shiro實現登陸攔截

    1.實現登陸攔截 實現登陸攔截其實就是使用shiro攔截沒有經過認證的用戶的請求,當用戶在沒有認證的情況下就請求資源時,就將其重定向到登陸認證頁面,這一點和spring security一樣 要實現認證+授權,本質上還是在使用過濾器/攔截器,而spring security只是把這些都封裝好了,我們直接調用封裝之后的方法就可以使用;而Shiro對于過濾器/攔截器的封裝沒有spring securi...

    SpringBoot 實現攔截器

    攔截器在實際工作中使用比較廣泛且相當重要,它的主要作用是攔截用戶的請求并進行相應的處理。比如通過它來進行權限驗證,或者是來判斷用戶是否登陸,等等。在SpringMVC中,我們可以通過XML配置文件來配置一個攔截器,操作起來也很簡單。在SpringBoot中我們需要通過代碼的形式來配置一個攔截器,同樣操作起來也十分簡單,下面我們一起來看一下吧。 項目結構 這是一個實現攔截器的小測試項目,包括以下幾個...

    Springboot攔截器實現

    Springboot實現攔截器的兩種方法 1:實現接口:HandlerInterceptor 2:繼承HandlerInterceptor 的實現類 HandlerInterceptorAdapter 接口方法 接口 接口名稱 說明 preHandle 前置處理 在實際的Handle執行前執行;返回類型為boolean,如果返回為False,則Handle本身及postHandle/afterCo...

    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_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

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