精华内容
下载资源
问答
  • session多个账户登录
    万次阅读
    2017-10-11 17:53:06

    首先session是同一PC同一浏览器共享的.比如如下代码:

    public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
        {
            HttpSession hs = request.getSession();   
            //存入session
            String user = request.getParameter("user");
            hs.setAttribute("user", user);
            response.sendRedirect("index.jsp");
        }
    

    解决办法1:限制同一浏览器多个账户登录,方法是根据key获取session的值 session.getAttribute(key),判断这个结果是不是空,不是空,就说明已登录。

    解决方法2:不同帐户共用一个session,将信息以(key,value)形式放入session,然后所有的请求都加上userid参数,所有从session中取数据出来都通过getXXByUserId。这种实现对现有框架改动较大,而且不仅仅是放在session中的用户信息需要根据byuserid来提取而是所有的会话里面的信息都要byuserid的来弄。故不建议采取这种做法。

    更多相关内容
  • 同一个浏览器上登录多个三员账号,后登陆的会覆盖前面的session,但是前面的页面没有退出(后续请求使用的是后登录的用户的session),导致日志记录等获取的当前操作主体不准确 解决: 在 login 方法中加入以下...

    SpringBoot Shiro 框架实现同一个浏览只能一个账号登录

    问题点:

    同一个浏览器上登录多个三员账号,后登陆的会覆盖前面的session,但是前面的页面没有退出(后续请求使用的是后登录的用户的session),导致日志记录等获取的当前操作主体不准确

    解决:

    在 login 方法中加入以下方法

      Subject subject = SecurityUtils.getSubject();
    if(subject.getPrincipal()!= null){
        String msg2= "同一个浏览器同时只能一个账号登录,请退出前一个账号后再重试";
        return  ResultResponseUtil.error(msg2);
    }
    

    SpringBoot Shiro 框架同一浏览器三员先后登录打开多个页签,session 覆盖问题
    问题点:

    界面菜单未刷新(cookie 存储的最后一个登录的用户信息),导致界面日志查询等操作的角色后台获取与前端不一致,数据展示异常

    解决

    Index.html 首页

    function checkUserRole(){
        let username =  $("#username").val();
        setInterval(function () {
            $.ajax({
                url: "/public/checkRole",
                type: "get",
                data: {"username":$("#username").html()},
                success: function (result) {
                    if (("fail" == result)) {
                        window.location.href = "/public/index";
                    }
                },
                error: function (data) {
                    toastr.error("网络错误,请重试", "错误提示");
                }
            })
        },5000)
    };
    
    
    
    //会话失效退出
    timer = null;
    window.onmousemove = function() {
        let onlineTime = 0;
        clearTimeout(timer);
        timer = setTimeout(function(){
            window.location="/public/logout";
        }, 1000 * 60);
    }
    

    后台接口

    @GetMapping("/checkRole")
    @ResponseBody
    public String checkRole(HttpServletRequest request){
        String res = "fail";
        String userName =  request.getParameter("username");
    
        if(SecurityUtils.getSubject() !=null && SecurityUtils.getSubject().getPrincipal()!= null ){
            User user = (User)SecurityUtils.getSubject().getPrincipal();
            if(user.getUsername().equals(userName)){
                res = "suc";
            }
        }
        return res;
    }
    
    展开全文
  • 但第二用户登录之后第一用户登录session就被覆盖了 ``` HttpSession session=request.getSession(); session.getServletContext().setAttribute(SystemConstants.USER_SESSION_KEY,user.getId()); ``` ...
  • 可用于web开发使用,将资源解压,选择对应的CRX文件放于谷歌浏览器扩展程序中,使用该插件可以免去频繁退出登录不同账号的烦恼,避免浪费不必要的开发时间,实乃开发必备之利器
  • 在项目中需要利用userId和时间戳生成订单,这就要保证一用户在同一...刚开始以为很简单,直接后者登录时直接查询当前用户信息是否已经存在在session中,如果存在移除掉前者的session信息就可以,因为每sessio...

    在项目中需要利用userId和时间戳生成订单,这就要保证一个用户在同一时间只能在一个客户端上进行操作,而且为了账号的安全性。所以就想实现QQ那样的后者挤掉前者的功能。

    由于自己是一边学一边写的项目,所以对session这些功能的特性没有充分的了解。刚开始以为很简单,直接后者登录时直接查询当前用户信息是否已经存在在session中,如果存在移除掉前者的session信息就可以,因为每个session都有自己的sessionId。这简直不要太简单。结果无知就是天真。首先思路没啥问题,等到去写方法得时候太发现session是每个会话独有的,其他的连接是不能访问其他连接的session的,而且也没有直接通过sessionId移除session这种方法。

    于是百度看看别人都是怎么做的。也是利用的session。思路是把session和用户状态存储到一个临时表中,然后给了两种方案,一种是hashMap,一种是servletcontext。两种都不是很了解。于是百度,一下是关于两种的解释:

    hashMao百度百科

    servletcontext百度百科

    二者比较之后我觉得servletcontext简单易操作,而且整个服务器端可以共享数据,服务器启动自动生成,关闭即销毁。刚好符合需求。开搞。先上最终效果:

     可以看到左边浏览器已经登录了迪丽热巴账号,右边再去登录,这时左边不管是页面刷新还是跳转其他页面,都会重定向到登陆页,并提示账号在其他地方登录!

    上代码;

    登录成功时,将用户信息存入session中,取出sessionId和用户Id,以用户id为key(因为每个用户id都是唯一的,sessionId会改变的)。

     UserInfo userInfo = userRepositories.findByAccountAndPassword(account,password);
                session.setAttribute("loginUser",userInfo);/*登录成功把用户信息存入session中,便于调用*/
                String userId = String.valueOf(userInfo.getId());/*获取当前用户id并初始化为String类型*/
                String sessionId = session.getId();/*获取当前会话的sessionId*/
                ServletContext servletContext = GetServletContext.getServletContext();
                servletContext.setAttribute(userId,sessionId);/*以用户id为key,sessionId为value存储到容器中*/
                session.removeAttribute("loginState");
                return "登录成功";

     然后写一个检查session的方法,判断当前session中是否有用户登录信息,没有的话说明没登录,返回true,如果存在登录信息,取出当前sessionId以及servletcontext中此用户id对应的sessionId,判断两个sessionId是否相等,相等的话,说明是同一个连接会话,也返回true。不相等的话,就说明后面登录的sessionId已经覆盖掉了之前servletcontext中的sessionId,存在异地登录,返回false。

    public class CheckSession{
        
        public static boolean checkSession(){
            HttpSession session = GetSession.getSession();
            UserInfo userInfo = (UserInfo) session.getAttribute("loginUser");
            if (userInfo == null){
                return true;
            }else{
                ServletContext servletContext = GetServletContext.getServletContext();
                String sessionId = session.getId();
                String userId = String.valueOf(userInfo.getId());
                String oldSessionId = (String) servletContext.getAttribute(userId);
                if (oldSessionId == null || oldSessionId.equals(sessionId)){/*如果不存在此用户的sessionId(一般不可能)
                                                                             或者新旧id相等,说明是同一个登录*/
                    return true;
                }else {
                    return false;/*否则就是不同客户端登录,返回false*/
                }
            }
    
        }
    }

    然后写一个移除session的方法,因为我这里每个页面拦截判断后都需要执行。

    public class DelSecondUser {
        public static void delSecondUser(){
            HttpSession session = GetRequest.getRequest().getSession();
            session.removeAttribute("loginUser");
            session.setAttribute("loginState","1");/*存储一个状态,用于前端判断是多客户端登录,账号被挤掉了*/
        }
    }

    关于在普通类方法中怎么获得session等,可以查看我上一篇博客:springboot普通类获取session等

    然后去拦截器那里进行判断:

    @GetMapping({"/index", ""})
        public String index(ModelMap modelMap) {
            if (!CheckSession.checkSession()) {
                DelSecondUser.delSecondUser();
                return "redirect:user";
            } else {
               
                return "index";
            }
        }

    这里我是用@GetMapping来拦截路径请求的,首先就执行checksession判断,如果返回的是false,说明账号已经在其他地方登录了,那么这个就得会话的session就得被移除,所以执行delSecondUser方法,并重定向到登陆页。不是的话就进行正常逻辑操作。每个页面都进行这个逻辑判断。就可以实现只要刷新或跳转页面就会退出。

    至于怎么在登录页判断是不是被挤掉账号而过来的进行提示

    记得我们在移除session的那个方法里写了这样一个语句。

     session.setAttribute("loginState","1");/*存储一个状态,用于前端判断是多客户端登录,账号被挤掉了*/

    如果是被挤到的,那么给前端一个1的状态。

    然后在登录页放一个隐藏的标签来接收它:

    <span style="display:none;"th:if="${session.loginState!=null}"th:text="${session.loginState}" id="ifLogin"></span><!--如果是1代表是被挤掉而重定向过来的-->
    <span style="display: none;" th:if="${session.loginState==null}" th:text="0" id="ifLogin"></span><!--默认是0-->

    在登录页的js里写一个判断方法:

    //判断是不是被挤出登录
    function ifLogin(){
        var state = $('#ifLogin').text().trim();
        if (state == "1"){
            layer.confirm('您的账号在其他地方登录,请确认是否本人操作?', {
                btn: ['是我本人操作','不是我,立即修改密码'] //按钮
                ,closeBtn:0
                ,title:"警告"
                ,btnAlign: 'c'
            }, function(){
                layer.msg('好的!请注意保护个人账号安全!',{icon:6});
            }, function(){
                location.href="forgetPd";
            });
        }
    }

    每次进入页面都进行判断,是不是1,是1就给出提示。

    如果在登录界面再次登录,那么就移除掉这loginstate状态,前面登录那里有写到。

    但是有一种情况,比如涉及到用户登录的情况下才能执行的业务逻辑,假如a客户端用户1正在充值,订单号是需要从session中取出用户id加时间戳生成的,这时候b客户端突然有人用用户1的账号登录了,a客户端的session被移除了,但是a客户端页面没刷新,用户1可以继续点击充值按钮,这时候后台取不到session信息,报错。

    所以我们在后台需要执行一个判断,如果取不到session,直接返回一个结果前端判断即可,如果取得到则继续业务操作就行。

    至此此功能完整实现。

    由于本人比较小白,所以表述上有啥错误或者有更好的方法,欢迎大佬们指正和指教*^_^*

    展开全文
  • 主要介绍了Session过期后自动跳转到登录页面实例代码,非常不错具有参考借鉴价值,需要的朋友可以参考下
  • spring session 实现单用户多账号登录

    千次阅读 2017-03-05 17:05:39
    spring session 实现单用户多账号登录 spring session 初始化官网有这样一句话: Multiple Browser Sessions - Spring Session supports managing multiple users’ sessions in a single browser

    spring session 实现单用户多账号登录

    前言

    昨天在查看 spring session 官网时发现一段有趣的话(http://projects.spring.io/spring-session/):

    Multiple Browser Sessions - Spring Session supports managing multiple users’ sessions in a single browser instance (i.e. multiple authenticated accounts similar to Google).

    这段话大意就是说 spring session 支持一个用户在浏览器上登录多个账户的功能。一般情况下,我们是通过开启多个浏览器同时登录某个系统,实现自己多个账户的同时操作。其实,Chrome 浏览器已经实现了多个 Google 账户在浏览器上的操作。

    个人参考案例

    个人博客 : https://zggdczfr.cn/
    个人参考案例(如果认可的话请给个star) : https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B10

    正式实现

    这里我用的是 spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战,这个前天的案例。
    通过仔细阅读官方的操作文档 Spring Session - Multiple Sessions,我稍微理解了该如何来使用多账户登录。一般情况下,我们登录访问系统时,Spring Session 会默认一个请求参数_s为 0.通过修改这个参数,来启用 SpringSession 为用户分配新的 SessionId。

    实现机制

    通过稍微阅读 SpringSession 源码 与几位大神的博客,我大概知道了其中的机制。
    * spring session通过增加session alias概念来实现多用户session,每一个用户都映射成一个session alias。当有多个session时,spring会生成“alias1 sessionid1 alias2 sessid2…….”这样的cookie值结构。
    * 每当spring session提交时如果有新session生成,会触发onNewSession动作生成新的session cookie。

    onNewSession 是 Spring Session 源码之中一个重要的方法

    注意:如果只有一个session id,则和普通session cookie一样处理,cookie值就是session id。如果存在多个session id,就会形成上面提到的那种 alias 结构的 session cookie。

    问题

    等我信心满满等按照官网操作方法去搞时,却失败了,爆了个异常

    java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value

    报得我一脸蒙蔽……google之后,原来是 Tomcat 在 8.5.X 版本后不使用 Servlet 3.1 的标准,改用RFC 6265 来实现。这样子的话,会导致报文输入时多了个空格(字符32)。

    解决方案

    重写 Tomcat 的解析方法,代码来源于Github,并经过修改。

    @Configuration
    public class CookieConfig {
    
        @Bean
        public EmbeddedServletContainerCustomizer customizer(){
            return new EmbeddedServletContainerCustomizer() {
                @Override
                public void customize(ConfigurableEmbeddedServletContainer container) {
                    TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
                    tomcat.addContextCustomizers(
                            new TomcatContextCustomizer() {
                                @Override
                                public void customize(Context context) {
                                    context.setCookieProcessor(new LegacyCookieProcessor());
                                }
                            });
                }
            };
        }
    }

    将方法重写后注入 bean 中,交给容器去管理。

    测试

    启动工程,在同一个浏览器中分别访问
    http://localhost:8080/session?_s=0
    http://localhost:8080/session?_s=1
    http://localhost:8080/session?_s=2

    我们可以看到结果(三个sessionId都不一样):

    {"SessionId":"a1d59666-10a4-4dc3-a1b0-1166cda8aab2","ServerPort":"服务端口号为 8080"}
    
    {"SessionId":"21177055-70e2-426c-9292-40ccf825078b","ServerPort":"服务端口号为 8080"}
    
    {"SessionId":"1eade000-f2e1-4bf9-9aef-1510d39441e4","ServerPort":"服务端口号为 8080"}

    参考资料

    展开全文
  • 第一步在登录页面 public ActionResult login(string url) { if (Session["UserId"] != null && Session["UserId"].ToString() != "")//这根据自己的开发项目编写,这是判断seesion用户是否存在 ...
  • 项目是BS架构,在使用spring-session掌管的了session以后,很灵活的解决了分布的session处理,但是万恶的运营提出了万恶的需求,让同一账户只能在单个设备上登录,如果新的设备登录了相同账号,原来的的账户登录状态...
  • 在处理一个账号只能一处登录时,登录会出现异常,如下 14:51:44.689] DEBUG org.springframework.web.servlet.FrameworkServlet 991 processRequest - Could not complete request org.apache.shiro.session.Unknow....
  • 本文主要介绍在 Express 框架中,如何使用 Session 来实现用户登录身份验证。对express session实现登录验证相关知识,感兴趣的朋友一起看看吧
  • 主要介绍了Django Session和Cookie分别实现记住用户登录状态操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 本篇文章主要介绍了Java Web之限制用户多处登录实例代码,可以限制单个用户在多个终端登录。非常具有实用价值,需要的朋友可以参考下。
  • 主要介绍了Springboot中登录后关于cookie和session拦截案例,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • asp.net下一个账号不允许多个用户同时在线,重复登陆的代码,需要的朋友可以参考下。
  • 配置连接数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends....生成session表 python manage.py makemigrations python manage.py migrate 登录时记住保存用户登录信息 # 登录验证 def logi
  • Ajax请求前的ajaxSend函数处理,考虑各种参数情况的处理,将当前登录sessionID绑定至参数中,供服务器拦截器验证使用。 注:此函数放置全局JS文件。 3:springmvc全局拦截器,拦截所有请求,获取用户唯一标识...
  • 浏览器在请求服务器时,服务器都会创建一个sessionsession负责浏览器与服务器之间的会话。session的存在是为了维护浏览器和服务器之间交互时保留一些交互数据,例如用户行为或者用户信息等。每会话都有自己的...
  • session实现用户登录

    千次阅读 2021-06-09 11:02:47
    如何通过session实现用户登录后,在多个页面将数据保存在session中,不要保存着request中;两种方式清除session:服务器清除 和程序员写程序清除 服务器清除 setMaxInactiveInterval() 写在 session.setAttribute()...
  • 单页面应用多个账号登录问题

    千次阅读 2020-08-27 17:57:00
    前提:前端项目中用了很本地缓存,后端是通过SESSION会话识别账号,一个账号登录后在新窗口再登录其他账号会导致SESSION被覆盖,从而导致前面账号数据显示后面账号的,数据会串。 解决方案: 1.token,后端说他们...
  • 登录的时候监听登录session,把sessionid和用户表示存在redis。(key:用户表示 ;value:sessionid)。 session监听:实现HttpSessionListener,HttpSessionAttributeListener。 2.写一过滤器,过滤请求的...
  • 主要介绍了C#有效防止同一账号多登录的方法,有效防止同一账号多登录的方法很,比如用数据库来记录用户登录情况、用Application来保存用户登录信息、用Cache来保存信息等,感兴趣的小伙伴们可以参考一下
  • Python 版本:3.7.9 确认好 pip3 已经配置好 cmd 命令检查有如下的画面 代码段 ...#校验登录帐号密码地址 ...#账号密码,userName,passwd 只是别称,根据网站自己定义 formData={"userName": ...#设定一header heade
  • 这样一个账号可以在多个地方进行登录。在这个基础上修改实现一个账号只能登录一次,再次登录会把上次的登录的给挤掉,类似于QQ。      难点:怎么通过sessionId销毁session。因为Servlet2.1之后不支持...
  • Session box插件,实现网页多账号登录

    千次阅读 2020-01-13 17:49:20
    SessionBox 在WEB开发中,服务器可以为每个用户的浏览器创建一个会话对象(session对象)。在需要保存用户数据时,服务器程序...但在实际上网过程中,人们可能会在同一网站使用到多个账号。特别是在社交网络里,几...
  • 对于数据库运维人员来说创建session或者查询时产生问题是常规情况,下面介绍一种很有效且不借助第三方工具的方式来解决类似问题,需要的朋友可以参考下
  • session登录机制

    千次阅读 2018-05-22 12:15:32
    由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。(也可以用其他存储方式比如redis) Session对象是有生命周期的 Session实例是轻量级的,所谓轻量级:是指他的创建和删除不需要...
  • 2. 支持session会话,也就是说设置了长时间登录过期,如果用户没有登录,直接进查询列表页面,会重定向到登录页面去,如果用户登录了后,把浏览器关掉,直接输入列表查询页面,会直接进入列表页面的。 3. 列表数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,489
精华内容 36,195
关键字:

session多个账户登录