zoukankan      html  css  js  c++  java
  • 用户登录后重定向到要访问页面

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

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

  • 相关阅读:
    那些书本上不曾告诉你的秘密
    附件十四面的数学模型与自动化算法分析
    ICAO 附件十四面课件分享
    风螺旋线的公式与特性
    How to describe the wind sprial in computer system?
    性能分析中看到螺旋线的影子
    风螺旋线的画法比较(三)
    风螺旋线的画法比较(二)
    风螺旋线的画法比较(一)
    网卡工作原理和wireshark混杂模式
  • 原文地址:https://www.cnblogs.com/sunjf/p/springmvc_login.html
Copyright © 2011-2022 走看看