­

SSM項目使用攔截器實現登錄驗證功能

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.獲取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資訊,如下圖。

配置文件實現

    <!--自定義攔截器-->
    <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配置文件