1. 程式人生 > >我的shiro之旅: 十五 shiro 登入成功後,跳轉到登入前的頁面

我的shiro之旅: 十五 shiro 登入成功後,跳轉到登入前的頁面

部落格已移至 http://blog.gogl.top

很多時候,我們需要做到,當用戶登入成功後,跳轉回登入前的頁面。如果使用者是點選"登入"連結去到登入頁面進行登入的,我們很容易跟蹤使用者的登入前的頁面。比如,在"登入"連結後加一個url引數,如:http://www.xxx.com/login.html?url=http://www.xxx.com/xx.html,這個url就是當前頁面。使用者瀏覽不同頁面,"登入"連結後面的url跟著改變。這樣,跳轉到登入頁面時都會帶有上一個頁面的url作為引數,登入後也很容易拿到這個引數進行重定向到登入前的頁面。

但當我們用配置/xxx.html=authc這種方式,限制使用者訪問/xxx.html連線時必須是認證過的使用者,否則shiro的filter將會重定向到登入頁面,上面的方法應當好處理了。不過shiro在跳轉前有記錄跳轉前的頁面。前沒有認證的使用者請求需要認證的連結時,shiro在跳轉前會把跳轉過來的頁面連結儲存到session的attribute中,key的值叫shiroSavedRequest,我們可以能過WebUtils類拿到。

當用戶登入成功後,可能通過String url = WebUtils.getSavedRequest(request).getRequestUrl();,拿到跳轉到登入頁面前的url,然後redirect到這個url。其實我們可以看看這個方法的原始碼:

    public static SavedRequest getSavedRequest(ServletRequest request) {
        SavedRequest savedRequest = null;
        Subject subject = SecurityUtils.getSubject();
        Session session = subject.getSession(false);
        if (session != null) {
            savedRequest = (SavedRequest) session.getAttribute(SAVED_REQUEST_KEY);
        }
        return savedRequest;
    }


從session中拿到SaveRequest。不過值得注意的是,這個SaveRequest是在使用者通過上面方式跳轉登入時shiro才會儲存,並且不會改變,除非下一次跳轉再次發生。並不是每一個請求,shiro都會把上一個請求儲存到session中。所以,不能通過WebUtils.getSavedRequest(request)在任何地方呼叫來拿到上一個頁面的請求。這個方法的呼叫,更應該是在使用者登入成功後,重定向到頁面時使用。