//登录页面 login.jsp

pageEncoding="UTF-8"%>

登录

String msg = (String)(request.getAttribute("msg")==null?"":request.getAttribute("msg"));

%>

function show(){

if(''!=''){

alert('');

}

}

用户登录

用户名

密 码

//主页面 main.jsp

pageEncoding="UTF-8"%>

登录成功

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","No-cache");

response.setDateHeader("Expires", -1);

response.setHeader("Cache-Control", "No-store");

String userName = "";

userName = (String)(session.getAttribute("userName")==null?"":session.getAttribute("userName"));

%>

var count;

var userMsg = '';

var i =0;

function checkUserOnline(){

$.ajax({

type:"post",

url:"${pageContext.request.contextPath}/checkUserOnline.do",

dataType : "text",

success:function(data){

userMsg = data;

//alert(JSON.stringify(userMsg))

},

error:function(){

alert("获取用户信息失败!");

clearInterval(count);

reLogin();

}

});

if(userMsg=='null'||userMsg==''|| userMsg == 'undefined'){

return;

}else{

//alert(JSON.stringify(userMsg));

clearInterval(count);

reLogin();

}

}

function reLogin(){

window.location = "login.jsp";

}

function checkLogin(){

alert("检查");

count = setInterval("checkUserOnline()",5000);

}

if(!"".equals(userName)){

out.print("登陆成功!
用户名:"+userName+"");

}

%>

//控制类 LoginController

package com.zjn.oneLogin.dengLu;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.HashMap;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class LoginController{

/**

* 用户和Session绑定关系

*/

public static final Map USER_SESSION = new HashMap();

/**

* seeionId和用户的绑定关系

*/

public static final Map SESSIONID_USER = new HashMap();

@RequestMapping("/login")

@ResponseBody

public MaptoLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{

//获取请求命令

request.setCharacterEncoding("utf-8");

String servletPath = request.getServletPath();//获取请求路径

String uri = servletPath.substring(1, servletPath.lastIndexOf(".do"));

try{

//登录

if ("login".equals(uri)){

HttpSession session = request.getSession();

String userName = request.getParameter("userName");

String password = request.getParameter("password");

if (userName != null && !"".equals(userName.trim())){

//登录成功

if (login(userName, password)){

//处理用户登录(保持同一时间同一账号只能在一处登录)

userLoginHandle(request);

//添加用户与HttpSession的绑定

USER_SESSION.put(userName.trim(), session);

//添加sessionId和用户的绑定

SESSIONID_USER.put(session.getId(), userName);

System.out.println("添加sessionId和用户的绑定 ==="+session.getId());

System.out.println("用户[" + userName + "] 已上线...");

session.setAttribute("userName", userName);

session.removeAttribute("userMsg");//从session中移除用户信息

//重定向到首页

response.sendRedirect("main.jsp");

}

//登录失败

else{

System.out.println("用户[" + userName + "] 登录失败...");

request.setAttribute("msg", "登录失败,请重新登录!");

//response.sendRedirect("login.jsp");

request.getRequestDispatcher("login.jsp").forward(request, response);

}

}

else{

System.out.println("用户[" + userName + "] 登录失败...");

request.setAttribute("msg", "登录失败,请重新登录!");

//response.sendRedirect("login.jsp");

request.getRequestDispatcher("login.jsp").forward(request, response);//跳转到用户页面,返回请求响应对象

}

}else if ("reLogin".equals(uri)){

//重新登陆

HttpSession session = request.getSession();

String userName = (String)session.getAttribute("userName");

if (session != null){

//销毁相关session

//USER_SESSION.remove(SESSIONID_USER.remove(session.getId()));

session.invalidate();

}

if (userName != null && !"".equals(userName)){

System.out.println("用户[" + userName + "] 已下线...");

}

//重定向到登录页面

response.sendRedirect("login.jsp");

}

}

catch (Exception e){

System.out.println(e.getClass() + e.getMessage());

PrintWriter out = response.getWriter();

out.print("服务器内部错误!");

}

return null;

}

/**

*

* Description:用户登录时的处理

* @param request

* @see

*/

private void userLoginHandle(HttpServletRequest request){

//当前登录的用户

String userName = request.getParameter("userName");

System.out.println("userName=="+userName);

//当前sessionId

//String sessionId = request.getSession().getId();

//删除当前sessionId绑定的用户,用户--HttpSession

//USER_SESSION.remove(SESSIONID_USER.remove(sessionId));

//删除当前登录用户已绑定的HttpSession

HttpSession session = USER_SESSION.remove(userName);//map中的remove方法返回删除value值

if (session != null){

//删除已登录的sessionId绑定的用户

SESSIONID_USER.remove(session.getId());

session.removeAttribute("userName");

session.setAttribute("userMsg", "您的账号已经在另一处登录,您被迫下线!");

}

}

/**

*

* Description: 模拟DB登录判断

* @param userName 用户

* @param password 密码

* @return

* @see

*/

private boolean login(String userName, String password){

return ("peizhongxian".equals(userName) && "123456".equals(password));

}

/**

* 判断用户是否同时登陆同一个用户

*

* */

@RequestMapping(value="/checkUserOnline")

@ResponseBody

public void checkUserOnline(HttpServletRequest request,HttpServletResponse response) throws IOException{

HttpSession session=request.getSession();

PrintWriter out = response.getWriter();

out.print(session.getAttribute("userMsg"));

}

}

//监听器 MyListener

package com.zjn.oneLogin.dengLu;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

public class MyListener implements HttpSessionListener {

/**

* 实现HttpSessionListener接口监听 监听session的创建事件

*/

public void sessionCreated(HttpSessionEvent se){

String sessionId = se.getSession().getId();

System.out.println("创建session sessionId= " + sessionId);

}

/**

* 实现HttpSessionListener接口监听 监听session的销毁事件

*/

public void sessionDestroyed(HttpSessionEvent se){

String sessionId = se.getSession().getId();

System.out.println("sessionId========="+sessionId);

//当前session销毁时删除当前session绑定的用户信息

//同时删除当前session绑定用户的HttpSession

LoginController.USER_SESSION.remove(LoginController.SESSIONID_USER.remove(sessionId));

System.out.println("销毁session sessionId= " + sessionId);

}

}

//web.xml 文件

com.zjn.oneLogin.dengLu.MyListener

java确定同一用户登录_java保持同一时间同一账号只能在一处登录相关推荐

  1. jeesite限制用户只能在一处登录

    jeesite限制用户只能在一处登录 /*** 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用*/@Overrideprotected AuthorizationInfo doGetAut ...

  2. 您已登录了一个相同的QQ账号,不能重复登录”的解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 在使用QQ聊天软件时,遇到过这样的情况,在自己电脑上登录QQ,提示"您已登录了一个相同的QQ账号,不能重复登录&qu ...

  3. uniapp之登录(短信验证码,账号密码,第三方登录)

    uni.getProvider(OBJECT) uni.login(OBJECT) uni.getUserInfo(OBJECT) ------------2021/12/17更新---------- ...

  4. asp.net 使用application实现单点登录(一个账号只能在一个地方登录)

    登陆用户名密码验证通过之后输入以下代码: Hashtable hOnline = (Hashtable)Application["Online"]; if(hOnline != n ...

  5. java 微信获取用户地理位置_Java微信公众平台之获取地理位置

    本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系 ...

  6. java获取默认用户目录_Java获取当前路径

    1.利用System.getProperty()函数获取当前路径: System.out.println(System.getProperty("user.dir"));//use ...

  7. java 微信获取用户地理位置_Java微信公众平台开发之获取地理位置

    本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系 ...

  8. java 一周前日期_java获取当前时间前一周、前一月、前一年的时间

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calend ...

  9. java 中jtextfield访问限制_java.swing JtextField 中怎么限制只能输入数字

    2016-04-05 回答 看代码: import java.awt.borderlayout; import javax.swing.jframe; import javax.swing.jlabe ...

  10. java 只有日期的类_JAVA日期和时间类彻底解决(1)[转]

    What's your time zone? JAVA日期和时间类彻底解决(1)Page 1 of 3 你是否在苦苦挣扎在JAVA语言中的日期和时间中?当你在计算机上显示日期和时间时,, 是否要快一个 ...

最新文章

  1. html缩进快捷键_Mac技巧|如何高效使用苹果便笺?利用便笺快捷键快速完成操作!
  2. san-hot-loader 应用及原理实现
  3. LINUX framebuffer
  4. 贪心算法 (Greedy Algorithm)
  5. github page+jekyll搭建个人博客总结
  6. php 类中输出所有属性,PHP基于反射获取一个类中所有属性
  7. 云计算时代:哪些企业适合上云?
  8. 计算机网络(3)——三种常见的数据交换技术
  9. 炫龙T50热键功能键
  10. 黑苹果双系统时间不一致_黑苹果与Windows系统时间不对(不同步)的解决办法...
  11. python图像音频处理-通过图像傅里叶变换判断相位和幅度的重要性
  12. (转)神奇的数据挖掘
  13. 防火墙——隧道技术类型
  14. SpringBoot2后端项目-验证码图片生成
  15. 《高效能人士的七个习惯》分享
  16. 适配器模式【Adapter Pattern】
  17. matlab 函数句柄@的介绍_什么是函数句柄(转)
  18. crontab每周一到周五
  19. VUE源码:模板引擎mustache
  20. linux netstat安装包,linux软件管理之rpm、yum netstat命令

热门文章

  1. 《R in Action》读书笔记(2)
  2. 移动脱机 Outlook 数据文件 (.ost)
  3. C#笔记30:Trace、Debug和TraceSource的使用以及日志设计
  4. 在SSRS报表中,显示图片
  5. Spring之AOP理解
  6. 统一认证 - Apereo CAS 客户端的集成以及小结
  7. 易改衣完成 5000 万 A 轮融资,唯品会战略投资
  8. Java IO流学习总结(转)
  9. php ZeroMQ 的使用
  10. MAC安装软件 brew 问题记录