用户登录后重定向到要访问页面
代码下载: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); } }
到此,用户登录后重定向到要访问页面的问题完美解决。