用戶登錄后重定向到要訪問頁面


代碼下載:login_limit

1、需求場景

  1)分享到其它平台鏈接用戶點擊跳轉相應平台登錄頁面,登錄后重定向到分享頁面

  2)用戶停留在某頁面長時間未操作至session過期,刷新或點擊其他鏈接重定向到登錄頁面,登錄后要求重定向到要訪問頁面

2、需求分析

  考慮到登錄后要重定向到某個頁面,所以在跳轉登錄頁面的時候需要系統存儲當前鏈接,以便在登錄后重定向。思路已經非常清晰,由於我們使用攔截器進行用戶是否登錄判斷,因此只需在攔截器的方法里對當前鏈接進行保存,然后登錄重定向即可。具體代碼如下:

  由於之前已寫過多用戶登錄限制,因此我們只需在這篇博文的基礎上稍作修改即可(具體只需修改登錄攔截器即可),修改后代碼如下(粗體字代碼為修改代碼)

  注:需要注意的是異步請求需被過濾(異步請求不會跳轉頁面,導致登錄后頁面直接顯示請求數據)

package com.utils.interceptor;

import com.entity.User;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 登錄攔截器 1、未登錄跳轉登錄頁面 2、掉線保存當前鏈接,重定向到登錄頁面,登錄后重定向到要訪問頁面 3、用戶被踢掉后給出提示信息
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("now_user");
        //用戶掉線或被擠掉,保存當前鏈接並重定向到登錄頁面
        if (request.getHeader("x-requested-with") == null) {//非ajax(異步)請求,則保存當前訪問鏈接
            String queryUrl = request.getQueryString() == null ? "" : ("?" + request.getQueryString());//獲取參數
            String requestUrl = request.getServletPath() + queryUrl;//httpRequest.getServletPath(),獲取鏈接
            if (session.getAttribute("redirect_link") == null) { session.setAttribute("redirect_link", requestUrl); } } if (user == null) {
            response.sendRedirect(request.getContextPath() + "/other/toLogin");
            return false;
        }

        //多用戶登錄限制判斷,並給出提示信息
        boolean isLogin = false;
        if (user != null) {
            Map<String, String> loginUserMap = (Map<String, String>) session.getServletContext().getAttribute("loginUserMap");
            String sessionId = session.getId();
            for (String key : loginUserMap.keySet()) {
                //用戶已在另一處登錄
                if (key.equals(user.getUserName()) && !loginUserMap.containsValue(sessionId)) {
                    isLogin = true;
                    break;
                }
            }
        }
        if (isLogin) {
            Map<String, String> loginOutTime = (Map<String, String>) session.getServletContext().getAttribute("loginOutTime");
            session.setAttribute("mess", "用戶:" + user.getUserName() + ",於 " + loginOutTime.get(user.getUserName()) + " 已在別處登錄!");
            loginOutTime.remove(user.getUserName());
            session.getServletContext().setAttribute("loginUserMap", loginOutTime);
            response.sendRedirect(request.getContextPath() + "/other/toLogin");
            return false;
        }

        return super.preHandle(request, response, handler);
    }

    @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);
    }
}

 

  到此,用戶登錄后重定向到要訪問頁面的問題完美解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM