java 防止用户重复登录_JAVA 如何避免用户的重复登录

展开全部

读懂下面代码,就知道如何实现 一个用户登陆 踢掉之前登陆的用户了//第一步

// 此监听62616964757a686964616fe4b893e5b19e31333337626166器用来监听用户在对session做操作的时候执行相应的方法

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionAttributeListener;

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

import java.util.*;

public class SessionListener implements HttpSessionListener ,

HttpSessionAttributeListener{

// 保存当前登录的所有用户

public static Map loginUser=

new HashMap();

// 用这个作为session中的key

public static String SESSION_LOGIN_NAME = "user_id_key";

//session创建时调用这个方法

public void sessionCreated(HttpSessionEvent arg0) {

}

//Session失效或者过期的时候调用的这个方法,

public void sessionDestroyed(HttpSessionEvent se) {

// 如果session超时, 则从map中移除这个用户

try {

loginUser.remove(se.getSession());

}catch (Exception e) {

e.printStackTrace();

}

}

//执行setAttribute的时候, 当这个属性本来不存在于Session中时, 调用这个方法.

public void attributeAdded(HttpSessionBindingEvent se) {

// 如果添加的属性是用户名, 则加入map中

if (se.getName().equals(SESSION_LOGIN_NAME)) {

loginUser.put(se.getSession(), Long.valueOf(se.getValue().toString()));

}

}

//当执行removeAttribute时调用的方法

public void attributeRemoved(HttpSessionBindingEvent se) {

// 如果移除的属性是用户名, 则从map中移除

if (se.getName().equals(SESSION_LOGIN_NAME)) {

try {

loginUser.remove(se.getSession());

} catch (Exception e) {

}

}

}

//当执行setAttribute时 ,如果这个属性已经存在, 覆盖属性的时候, 调用这个方法

public void attributeReplaced(HttpSessionBindingEvent se) {

// 如果改变的属性是用户名, 则跟着改变map

if (se.getName().equals(SESSION_LOGIN_NAME)) {

loginUser.put(se.getSession(), Long.valueOf(se.getValue().toString()));

}

}

//别忘了到你的web.xml中去配置一下listener

//第二步

//写一个判断用户是否已经登陆的方法

public boolean isLogonUser(Long userId) {

Set keys = SessionListener.loginUser.keySet();

for (HttpSession key : keys) {

if (SessionListener.loginUser.get(key).equals(userId)) {

return true;

}

}

return false;

}

//第三步

//在用户登陆的action.method,或者是loginServlet.doGet/doPost中

//判断用户名、密码都OK后,再调用第二步的方法,参数为用户ID;true则表示该用户已经登陆

//第四步

//用户窗口关闭/或者用户退出的时候,*一定要   request.getSession().invalidate()

//用户窗口关闭js

//关闭窗口时调用此方法

function window.onunload(){

if((window.screenLeft>=10000 && window.screenTop>=10000)||event.altKey)

{

//清除当前session,使用jquery 提供的方法

$.post("${base}/ClearSession.wp");

// [ ${base}/ClearSession.wp ]这是一个请求,

//请求到自己写的ClearSessionServlet

// 在此ClearSessionServlet中重写doPost方法,

// 内容为 request.getSession().invalidate()

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rust语法丑陋_抛出异常–缓慢而丑陋

rust语法丑陋这篇文章是关于历史经验以及最近应用的性能优化技术的。 几年前,我在特定的应用程序中发誓,我不得不发现隐藏在真正聪明的工程“技术”之下的无证行为。 它是负责开票的典型的整体式Java EE应用程序。 最好忘记确切的代码,但是我…

(0.1)鸿蒙HarmonyOS开发工具DevEco Studio设置

1、打开设置操作框 2.1主题设置(可以工具自己的喜好设置主题) 2.2设置字体 2.3设置注释 2.4设置提示语句忽略大小写(输入小写时,提示语句也会出现大写的关键字等) 2.5设置自动导包(不用导包,工具…

向Java最佳专家的全球专家学习Java

Java with the Best Virtual Conference是您学习微服务,Java 9,Kubernetes以及其他Java的指南! 将于4月17日至18日收听,收听来自Pivotal,RedHat,Microsoft,Oracle和Netflix等公司的行业领导者进…

(0.2)HarmonyOS鸿蒙开发工具DevEco Studio工程文件目录结构

1、基本不会去动添加修改的一些文件夹 2、主要直接使用操作的文件夹entry 3、开发操作main文件夹 也就是说,我们其实主要就只要用到java,resources两个文件夹和config.json一个文件。把代码放java文件夹里面,把开发用到的图片视频等资源放res…

java中static作用_java中static作用详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以修饰静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例&…

(0.3)HarmonyOS鸿蒙开发工具DevEco Studio 模拟器使用

1、登录华为账号 2、打开模拟器 3、选择模拟器 4、将程序运行在模拟器 5、当下面的building进度条完成后

(1.1)HarmonyOS鸿蒙中Ability概念及意义

1、简单理解:在鸿蒙中,可以简单理解为,打开APP后一个页面为一个Ability,而一个页面里面又有很多子页面(切片、片段)为AbilitySlice。 2、意义 一个Ability对应一个Hap包,一个APP则是由多个Hap包…

堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪

堆栈跟踪 堆栈跟踪我们最近在博客中发表的一篇评论带回了有关特定体验的一些回忆。 我希望我没有经历过的那种经历。 在创建Plumbr之前很长一段时间,我正在调试一个应用程序,该应用程序每次在蓝月亮时都会给我一个例外。 详细程度令人震惊: …

Java实现冒泡排序动画展示

原理:每次比较两个相邻的元素,将较大(较小)的元素交换至右边。 思路:每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果满足,就根据需要(从小…

使用Zipkin和Sleuth进行SpringBoot微服务跟踪

在本文中,我们将了解使用Zipkin和Spring cloud sleuth框架的微服务分布式跟踪。 尽管微服务具有自身的挑战,但微服务是出色的架构。 复杂的微服务架构具有与其他微服务的下游和上游依存关系,并且一切都是相互联系的。 在大多数情况下&#x…

空指针异常NullPointerException解决

只需要根据出现空指针异常的情况进行相应更改即可解决。 情况①:一维数组在栈空间中的变量没有指向堆空间中数组元素实体的首地址信息 int[] arr1 new int[]{1,2,3}; arr1 null; System.out.print(arr1[0]);解决方法就是注意让数组不为空null,即它存有数组首地址…

log4j性能 slf4j_Log4j 2:性能接近疯狂

log4j性能 slf4j最近,Apache社区中一位受人尊敬的成员尝试了Log4j 2并在Twitter上写道: TheASF #log4j2摇摇欲坠 ! 性能接近疯狂^^ http://t.co/04K6F4Xkaa — Mark Struberg(struberg) 2013年5月7日 &a…

计算机二级web题目(6)--动态网页技术概述

1 [单选题] 下列不属于动态网页格式的是(D)。 A. ASP B. JSP C. ASPX D. VBS 2 [单选题]相对比较早出现的服务器端动态网页技术是(B)。 A. ASP B. CGI C. JSP D. JavaScript 3 [单选题] PHP中采用的模板技术是(A&#…

java 输入人名_Java 读取控制台输入

Java 提供了我们两种读取控制台输入的方法:一、传统方法public class ReadConsoleOld {public static void main(String[] args) throws IOException {BufferedReader reader new BufferedReader(new InputStreamReader(System.in));while(true){String line read…

JVM体系结构:JVM和JVM体系结构概述

各位读者好! 在本教程中,我们将了解和学习Java虚拟机(JVM)及其体系结构。 本教程将帮助您正确回答以下问题: Java中的JVM是什么? JVM的不同组件 JVM,JRE和JDK之间的区别 1.简介 Java虚拟机&…

java option请求_java – 如何说服spring 4.2将OPTIONS请求传递给控制器

我们在控制器上使用带有RestController注释的spring mvc,我们正在处理控制器中的授权.我们使用相同的代码来设置响应CORS飞行前请求的允许方法.为实现这一目标,我们有:在调度程序servlet的配置中,然后我们有:RequestMapping(value"/some/collection…

计算机二级web题目(7.1)--综合选择题1

(1)程序流程图中带有箭头的线段表示的是(C)。 A、图元关系 B、数据流 C、控制流 D、调用关系 解析:①长方形表示要处理执行的步骤。②菱形表示条件判断。③平行四边形表示输入或输出。 (2)结构化程序设计的基本原则不包括(A&#…

java8 javafx_Java 8的新增功能(第1部分– JavaFX)

java8 javafx免责声明:我不为Oracle工作,也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”,这只是我研究的一部分。 Java 8已在大约两个月前完成了功能,并且开发者预览版即将到来(两周后&#xff0…

Java面向对象(1)--对象的创建使用类的实例化

1、类与对象 类是对一类事物的描述,是抽象的、概念上的定义。 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。 通常都是将类实例化,也就是对象的创建 可以理解为:类 抽象概念的“人”;对象 实实在…