SSM專案使用攔截器實現登入驗證功能

曠世奇才927發表於2022-01-22

SSM專案使用攔截器實現登入驗證功能

登入介面實現

 public User queryUser(String UserName, String Password,HttpServletRequest request, HttpServletResponse response) {
        User user = userMapper.queryUser(UserName,Password);
        if(!StringUtils.isEmpty(user)){
            //1.獲取session
            HttpSession session = request.getSession();
            //2.獲取sessionid
            String sessionId = session.getId();
            //3.將sessionid作為key,使用者資訊user作為value,放入session中
            session.setAttribute(sessionId,user);
            //4.將sessionId存到cookie中,"JSESSIONID"為自定義的key值
            Cookie cookie = new Cookie("JSESSIONID",sessionId);
            //5.設定cookie的有效路徑
            cookie.setPath(request.getContextPath());
            //6.將cookie返回給頁面
            response.addCookie(cookie);
        }
        return user;
    }

程式碼思路:

1.使用者輸入賬號密碼登入成功後獲取使用者資訊(User)

2.獲取session,得到sessionid(注:每一個session物件都有一個sessionid)

3.將sessionid作為key,使用者資訊(User)作為value,放入session中

4.建立一個Cookie物件,將"JSESSIONID"作為key,sessionId作為value,放入cookie中

5.設定cookie的有效路徑,將cookie返回給頁面,此時頁面就可以收到key為"JSESSIONID",value為sessionId的cookie資訊,如下圖。

攔截器類程式碼實現

public class Filter extends HandlerInterceptorAdapter {
    private static Logger logger = Logger.getLogger(Filter.class);
    /**
     * 進入攔截器後首先進入的方法
     * 返回false則不再繼續執行
     * 返回true則繼續執行
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler)throws Exception
    {
        //1.定義sessionid變數
        String sessionid = "";
        //2.獲取session物件
        HttpSession session=request.getSession();
        //3.獲取頁面上所有的cookie
        Cookie[] cookies = request.getCookies();
        //4.迴圈尋找名稱為"JSESSIONID"的cookie
        for(Cookie cookie:cookies){
            if(cookie.getName().equals("JSESSIONID")){
                sessionid = cookie.getValue();
            }
        }
        //5.根據sessionid獲取使用者資訊
        User user = (User) session.getAttribute(sessionid);
        if(StringUtils.isEmpty(user)) {
            logger.info("使用者未登入");
            //使用者未登入跳轉到登入頁面
            response.sendRedirect("login");
            return false;
        }
        logger.info("使用者已登入");
        return  true;
    }

}

程式碼思路:

1.自定義一個攔截器類,首先要繼承HandlerInterceptorAdapter,並重寫preHandle方法,在此方法中編寫攔截器的邏輯程式碼

2.獲取cookies陣列,這個陣列有瀏覽器中的所有cookies資訊,迴圈遍歷找到name為"JSESSIONID"的cookies,並獲取到其value值,這個值就是sessionid

3.通過sessionid查詢user物件,如果能獲取物件證明登入過,如果不能獲取到物件證明沒有登入過

4.如果登入過就直接訪問介面,如果沒有登入過就跳轉到登入頁面進行登入

配置檔案實現

    <!--自定義攔截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--配置要攔截的路徑-->
            <mvc:mapping path="/**"/>
            <!--配置登入介面不被攔截-->
            <mvc:exclude-mapping path="/user/login"/>
            <!--指定攔截器類路徑-->
            <bean class="com.lishiqi.Util.Filter"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

配置含義:

1.我們使用攔截器肯定要規定攔截哪些介面,首先我們將所有的介面都攔截

2.然後我們發現問題,此時登入介面也在攔截範圍中,所以我們正常呼叫登入介面之前他也會攔截判斷一下使用者是否登入過,這個時候使用者肯定沒有登入過,那麼就會又跳轉到登入介面,我們再次登入還是跳轉到登入頁面,一直登入不上,所以我們需要把登入介面配置為不攔截

3.然後我們指定我們配置好的攔截器類路徑,這個時候可以在該類中進行登入驗證操作了

4.此配置檔案為spring-mvc.xml配置檔案

相關文章