java实现当前用户登录挤掉后台用户登录_我是你家后院的花栗鼠啊的博客-程序员宝宝_多备登录挤掉已登录用户

技术标签: java  开发笔记  

思路说明:首先创建一个map,因为map是不可重复的键值对。使用登录用户的id作为key,当用户登录的时候,就产生一个session作为value。将其保存一起。此时改账号在别处登录的时候,会产生一个相当的key,但是不同的value。这是使用拦截器写代码清楚上一次的map。然后保存这一次的。这样已登录的用户就会被当前用户挤下来。

核心代码如下:

1.登录的时候创建map

        ServletContext application=request.getSession().getServletContext();
            String userIdSession = String.valueOf(user.get(0).getUserid());
            @SuppressWarnings("unchecked")
            Map<String, String> loginMap = (Map<String, String>)application.getAttribute("loginMap");
            if(loginMap==null){
                loginMap = new HashMap<String, String>();
            }
            loginMap.put(userIdSession,request.getSession().getId());
            application.setAttribute("loginMap", loginMap);

2.写一个全局拦截器,实现Filter接口,在doFiter方法里面写如下代码

      // 获取request
        HttpServletRequest request=(HttpServletRequest)args0;
        SessionInfo sessionInfo=SessionHelper.getSessionInfo(request);
        SessionInfo adminSession = SessionHelper.getAdminSessionInfo(request);
        
        HttpServletResponse response=(HttpServletResponse)args1;
        
        String uri = request.getRequestURI();
        
        if(uri.indexOf("login")!=-1 || uri.indexOf("changeImage")!=-1){
            chain.doFilter(request, response);
            return;
        }
        
        //前台同时只能一个账号在线
        ServletContext application=request.getSession().getServletContext();
        Map<String, String> loginMap = (Map<String, String>)application.getAttribute("loginMap");
        if(loginMap!=null && !StringUtils.isNull(sessionInfo)){
            for(String key:loginMap.keySet()) {
                
                if (String.valueOf(sessionInfo.getUser().getUserid()).equals(key)) {
                    if(!request.getSession().getId().equals(loginMap.get(key))) {
                        String content_path = request.getContextPath();
                        request.removeAttribute("loginMap");
                        response.sendRedirect(content_path+"/visitor/users/login.do?flag=VALID");
                        System.out.println(content_path+"/visitor/users/login.do?flag=VALID");
                        return;
                    }
                }
            }
        }

3.web.xml里面配置

  <listener>
    <description>spring监听器</description>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener </listener-class>
  </listener>
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>SecurityInvalidate</filter-name>
    <filter-class>com.project.filter.EmallAntiSqlInjectionfilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SecurityInvalidate</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40552337/article/details/100119105

智能推荐

Linux内核socket(一)_SweeNeil的博客-程序员宝宝

要了解内核socket需要先对内核socket的结构进行了解。其中比较重要的就是struct socket和struct sock两个结构体。每个socket数据结构都有一个sock数据结构成员,sock是对socket的扩充,两者一一对应,socket-&gt;sk指向对应的sock,sock-&gt;socket 指向对应的socket;socket和sock是同一事物的两个侧面,...

【java刷算法】牛客—剑指offer3栈、数组、递归、二分法的初步练习_风铃听雨~的博客-程序员宝宝

今天一起来练习栈、数组、递归、二分法吧,基本的小算法哦!!

栈的链式存储结构(c语言实现)_会有那么一天oc的博客-程序员宝宝

#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;stdlib.h&amp;gt;#define T 1#define F 0typedef int Status;typedef int ElemType;typedef struct StackNode//链式存储的结点{ ElemType data;//数据域 struct StackNode* nex...

SpringSecurity入门及进阶:登录,记住登录,获取当前登录用户,修改密码_zhenshanrenhao的博客-程序员宝宝

配置文件package com.falun.conf;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;i...

springboot+redis使用_大道至简知易行难的博客-程序员宝宝

1.引入 spring-boot-starter-redis&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-redis&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt;# ...

matlab bar中画显著性水平线,科学网—【MATLAB】如何画水平errorbar - 叶瑞杰的博文..._立夏之光的博客-程序员宝宝

垂直errorbar很容易实现,水平errorbar也经常用到,但网上很多方法都很复杂,在这里介绍一种相对简单的方法:实例:方法1:figure;err=data_std*ones(size(depth,2));errorbar(depth,data_av,err,'-r','linewidth',2) %先画垂直方向的errorbarhold on;plot(depth,data_av,'k-'...

随便推点

6 Greenplum 对JSON的支持_盒马coding的博客-程序员宝宝_greenplum6 jsonlines

6 Greenplum 对JSON的支持6.1 JSON概述JSON作为结构化的数据,目前越来越受到开发者的爱戴,它简单灵活易于理解。是作为储存数据的一种比较使用的一种格式,greenplum从5.0开始便很好的支持了JSON数据。 参考资料:https://hashrocket.com/blog/posts/faster-json-generation-with-postgres...

哪一刻让你觉得世人皆苦?_子桓私塾的博客-程序员宝宝

今年有两个时刻,让我有种众生皆苦的感觉。第一个是:安装师傅给安装空调的时候。父母以前在北方,我把他们接到广东养老。给他们买的是4房,需要5个空调。安装师傅从上午,一直安装到晚上,中途完全没有吃饭。就给他们喝了点水,给饭也不吃。就说都装完了回去吃,都饿习惯了。看到一身汗,不停的忙,真的蛮不容易的。我自己买的房,在二十多层。有个空调外机有问题,安装师傅需要拆护栏,拆纱窗,再拆窗户。有一个安装师傅需要高空作业,爬到窗户外,另一个师傅在屋里。在屋里的安装师傅把外机搬出窗户,看那个师傅估计也就一米六,空调外机一

php使用curl请求时,以x-www-form-urlencoded 方式发送遇到的问题_yangmaolin1234的博客-程序员宝宝_php curl x-www-form-urlencoded

curl_setopt($curl, CURLOPT_HTTPHEADER, array(‘Content-Type: application/x-www-form-urlencoded’));方式from-data试发送的数据用的是array格式,而方式为 x-www-form-urlencoded 时需要用key=value&amp;key=value的格式发送,发送的是string型的数据。from-data数据的为:​​​​​​data=[′name′=&gt;′xiaoming′,′sex′

jQuery讲解(一)_qq_15130625的博客-程序员宝宝

  &amp;lt;!-- 引入jquery文件 --&amp;gt; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery-1.4.4.js&quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&quot;text/javascript&quot;&amp;gt; /**第一步加载html页面*/

AH00558: apache2: Could not reliably determine the server‘s fully qualified domain name, usin_小阳是我的博客-程序员宝宝_apache2 ah00558

问题AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‘ServerName’ directive globally to suppress this message解决方案:https://www.cnblogs...._1671465600

java数组转lost_java016.集合_weixin_39714565的博客-程序员宝宝

ArrayList去除集合中字符串的重复值public static ArrayList getSingle(ArrayList list) {ArrayList newList = new ArrayList();//创建一个新集合Iterator it = list.iterator();//获取迭代器while(it.hasNext()) {//判断老集合中是否...

推荐文章

热门文章

相关标签