用户登录后重定向到要访问页面

代码下载: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);
    }
}

 

  到此,用户登录后重定向到要访问页面的问题完美解决。

posted @ 2016-10-31 10:55  code.world  Views(8586)  Comments(0Edit  收藏  举报