代碼下載: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); } }
到此,用戶登錄后重定向到要訪問頁面的問題完美解決。