java解决web一个账号多用户登陆问题

1、建一个session监听类
public class MySessionListener implements HttpSessionListener {
	public static HashMap sessionMap=new HashMap();


	@Override
	public void sessionCreated(HttpSessionEvent httpSessionEvent) {
		// TODO Auto-generated method stub

	}

	
	@Override
	public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
		// TODO Auto-generated method stub
		
		HttpSession httpSession = httpSessionEvent.getSession();
		Student student = (Student) httpSession.getAttribute("student");
		HttpSession session=httpSessionEvent.getSession();
		DelSession(session);
	}

	public static synchronized void DelSession(HttpSession session) {
		if (session != null) {
			// 删除单一登录中记录的变量
			if(session.getAttribute("student")!=null){
				Student tu =(Student)session.getAttribute("student");
				MySessionListener.sessionMap.remove(tu.getNumber());
			}
		}
	}

}

2.在用户 登录方法 中调用
number是登陆方法获取前端请求的数据(学生登陆的账号)

if (null!=MySessionListener.sessionMap.get(number)){
	System.out.println("此账号已登录!");
	forceLogoutUser(number);
	MySessionListener.sessionMap.put(number,getSession());
}else {
	System.out.println("此账号未登录!");
	MySessionListener.sessionMap.put(number,getSession());
}
3.删除用户在map中存的数据
public static void forceLogoutUser(String uid) {
		// 删除单一登录中记录的变量
		if (MySessionListener.sessionMap.get(uid) != null) {
			HttpSession hs = (HttpSession) MySessionListener.sessionMap.get(uid);
			MySessionListener.sessionMap.remove(uid);
			Enumeration e = hs.getAttributeNames();
			while (e.hasMoreElements()) {
				String sessionName = (String) e.nextElement();
				// 清空session
				hs.removeAttribute(sessionName);
			}
			// hs.invalidate();
		}
	}
4.判断此账号是否已登录
//前端ajax请求代码,会给后一个登陆者进行提示
$.ajax({
                        type: "POST",
                        url: "/student/checkLogin?username=" + username,
                        dataType: "JSON",
                        async: false,
                        success: function (data) {
                            if (data.code == 1) {
                                var flag = confirm("此账号已登录!是否继续登录?")
                                if (flag == false) {
                                    //alert("继续登录成功!")
                                    return;
                                }
                            }
                        }
                    })
//后端java代码,此框架为jfinal
public void checkLogin(){
		String number=getPara("username");//此为jfinal框架的获取前端数据方式

		ObjectVo objectVo=new ObjectVo();//自定义的bean

		if (null!=MySessionListener.sessionMap.get(number)){
			System.out.println("此账号已登录!");
			objectVo.setCode(1);
		}else {
			objectVo.setCode(0);
		}
		renderJson(objectVo);
	}
//ObjectVo
public class ObjectVo {
	
	private Integer code;
	private String msg;
	private Object object;
	
	public Integer getCode() {
		return code;
	}
	public void setCode(Integer code) {
		this.code = code;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public Object getObject() {
		return object;
	}
	public void setObject(Object object) {
		this.object = object;
	}
	
}
给被挤掉的用户进行提示
此方法隔十秒进行一次请求,感觉此方式不太好,如果您有好的解决方法,麻烦请告知一下,谢谢
$(function () {
        setInterval(function () {
            $.ajax({
                type: "post",
                url: "/student/checkIsLogout",
                dataType: "JSON",
                success: function(response){
                    if(response.code == 0){
                        alert("您的账号已在其他地方登录,您被迫下线。")
                        window.location.href="/student/login"
                    }
                }
            })
        },10000)
    })
   /**
	 * 检测账号是否被挤掉
	 */
	public void checkIsLogout(){
		ObjectVo objectVo=new ObjectVo();
		if(getSession()!=null){
			Object student = getSessionAttr("student");
			if (student==null){
				System.out.println("session信息不存在,登录失效");
				objectVo.setCode(0);
			}

		}else{
			System.out.println("session信息不存在,登录失效");
			objectVo.setCode(0);
		}
		renderJson(objectVo);
		return;
	}

参考:https://blog.csdn.net/hk9024/article/details/51836824

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是 Java 代码实现秒杀功能的示例。此代码仅提供思路,不保证可用,因此请根据需求进行相应的修改。 ``` import java.util.concurrent.atomic.AtomicInteger; public class SecKill { private static AtomicInteger stock = new AtomicInteger(100); public static void secKill() { if (stock.get() > 0) { System.out.println(Thread.currentThread().getName() + " 抢到了秒杀商品"); stock.decrementAndGet(); } else { System.out.println(Thread.currentThread().getName() + " 抢购失败,商品已经抢完"); } } } ``` 这段代码中使用了 Java 的 `AtomicInteger` 类来维护库存,使用了原子操作来保证线程安全。 在启动秒杀功能时,您可以创建多个线程来模拟用户的抢购行为: ``` public class Main { public static void main(String[] args) { for (int i = 0; i < 150; i++) { new Thread(() -> SecKill.secKill()).start(); } } } ``` 此代码仅作为示例,不保证可用,您可以根据实际需求修改代码。 希望这个代码示例对您有所帮助! ### 回答2: 要使用Java语言开发一个秒杀功能,首先需要明确秒杀功能的具体需求和实现方式。以下是一种简单的实现思路供参考: 1. 数据库设计:需要建立一个商品表和一个订单表。商品表包括商品的唯一ID、名称、库存量等字段;订单表包括订单的唯一ID、商品ID、购买数量、用户ID等字段。 2. 编写Java代码:首先,编写一个Controller层的接口,用于接收前端的秒杀请求。该接口需要对用户的请求进行校验,例如验证用户是否登录、用户是否重复秒杀等。然后,再编写一个Service层的方法,用于处理秒杀的逻辑。在Service层的方法中,将秒杀请求放入消息队列中,通过消息队列进行异步处理,可提高系统的并发能力。同时,需要对库存进行判断,若库存不足,则返回秒杀失败。若库存充足,则生成订单并返回秒杀成功。 3. 引入缓存:由于秒杀活动可能会引起大量的用户访问,为了提高系统性能,可以使用缓存技术。可以使用Redis等内存数据库来缓存商品的库存信息,例如使用Redis的String类型存储商品库存数量,使用对应商品ID作为key,商品库存数量作为value。在秒杀前,可以从Redis中获取商品库存,秒杀成功后,更新Redis中商品的库存数量。 4. 优化数据库访问:在高并发情况下,频繁地访问数据库可能会导致性能问题。可以使用数据库连接池技术来提高数据库的访问效率,减少数据库连接的创建和关闭次数。同时,可以对数据库进行优化,例如通过添加索引、分表分库等方式来提高数据库的读写性能。 5. 安全性保障:在秒杀功能中,为了防止重复秒杀、超卖、恶意请求等问题,可以对接口进行限流、接口安全性校验、防刷等操作。例如限制每个用户在一定时间内的请求次数、验证码验证等措施,以保障秒杀功能的正常运行。 总之,以上仅是一个简单的秒杀功能的实现思路,根据具体需求和实际情况,还需要进行更多细节的设计和开发。 ### 回答3: 秒杀功能是指在一段特定的时间内,用户可以以非常低的价格购买一定数量的商品。使用Java语言开发秒杀功能可以遵循以下步骤: 1. 创建数据库:使用数据库管理系统(例如MySQL)创建一个商品信息表和一个订单表。商品信息表中包含商品ID、名称、库存量、原价、秒杀价等字段;订单表中包含订单ID、用户ID、商品ID、购买数量、订单状态等字段。 2. 后台管理界面:使用Java的框架(例如Spring Boot)搭建一个后台管理界面,以方便管理员管理商品信息和秒杀活动。管理员可以在后台界面中添加、修改和删除商品信息,并设置秒杀活动的开始和结束时间。 3. 用户界面:使用JavaWeb框架(例如Spring MVC)搭建一个用户界面,供用户浏览商品信息和参与秒杀活动。在秒杀活动开始前,用户可以查看商品的详细信息和当前的秒杀价。点击秒杀按钮后,用户需要登录或注册账号,并输入购买数量。系统会判断用户的购买数量是否超过库存量,并根据秒杀规则计算出实际购买的价格。 4. 秒杀逻辑:在秒杀活动开始后,系统需要解决高并发的问题,以保证每个用户都能够正常秒杀。可以使用分布式锁(例如Redis的分布式锁)来控制同时只有一个用户可以进入秒杀流程。用户进入秒杀流程后,系统会判断当前时间是否在秒杀活动时间内,并检查商品的库存量是否足够。如果条件满足,则用户可以生成订单,减少商品的库存量,并返回秒杀成功的提示信息;否则,返回秒杀失败的提示信息。 5. 订单处理:秒杀功能中的订单会涉及到多个模块的交互,因此需要在系统中设计订单处理的模块。当用户秒杀成功后,系统会生成一个未支付的订单,并设置一个有效期。用户需要在一定时间内完成支付,否则订单会被取消。支付成功后,系统会更新订单状态并向用户发送支付成功的通知。 以上是使用Java语言开发秒杀功能的大致步骤,具体实现还需要根据实际需求和系统架构进行细化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值