java中使用session监听实现同帐号登录限制、登录人数限制

yizhihongxing

Java中使用Session监听器可以很好地实现同账号登录限制和登录人数限制的功能。以下是实现这一功能的完整攻略:

一、实现同账号登录限制

1.编写Session监听器

在Web项目中的WEB-INF目录下新建一个名为session的包,并在包中新建一个Java类SessionListener。下面是一个参考示例:

package session;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.HashSet;
import java.util.Set;

public class SessionListener implements HttpSessionListener {

    //在线用户数
    public static int onlineUserCount = 0;

    //存储登录用户的集合
    public static Set<String> userSet = new HashSet<>();

    @Override
    public synchronized void sessionCreated(HttpSessionEvent se) {
        // 新增session时调用此方法
    }

    @Override
    public synchronized void sessionDestroyed(HttpSessionEvent se) {
        // 销毁session时调用此方法
        HttpSession session = se.getSession();
        String username = (String) session.getAttribute("username");
        if (username != null) {
            userSet.remove(username);
            onlineUserCount--;
            session.getServletContext().setAttribute("onlineUserCount", onlineUserCount);
            session.getServletContext().setAttribute("userSet", userSet);
        }
    }
}

在上述代码中,SessionListener实现了HttpSessionListener接口,并重写了其中的两个方法:sessionCreated(HttpServletRequest)sessionDestroyed(HttpServletRequest)。这两个方法分别在Session创建和销毁时被调用。

当一个Session创建时,该Session中存储的User信息将被添加到userSet集合中,同时在线用户数onlineUserCount加1。当一个Session销毁时,该Session中存储的User信息将从userSet集合中移除,同时在线用户数onlineUserCount减1。

2. 注册Session监听器

要使上述实现生效,需要在Web项目的web.xml文件中进行配置。将以下代码添加到web.xml中:

<listener>
    <listener-class>session.SessionListener</listener-class>
</listener>

这段代码定义了一个Listener,它的类名为session.SessionListener,即上面所编写的Session监听器类。这样,在Web项目启动时,该监听器将被自动注册使用。

二、实现登录人数限制

1. 编写Filter过滤器

session包中新建一个名为LoginLimitFilter的Java类。下面是一个参考示例:

package session;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

public class LoginLimitFilter implements Filter {

    //在线用户数最大值
    private int maxUserCount;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String strMaxUserCount = filterConfig.getInitParameter("maxUserCount");
        maxUserCount = Integer.parseInt(strMaxUserCount);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        //获取用户信息
        String username = (String) httpServletRequest.getSession().getAttribute("username");
        if (username == null) {
            chain.doFilter(request, response);
            return;
        }

        //检查在线用户数是否超出限制
        Set<String> userSet = (Set<String>) httpServletRequest.getServletContext().getAttribute("userSet");
        if (userSet == null) {
            userSet = new HashSet<>();
            httpServletRequest.getServletContext().setAttribute("userSet", userSet);
        }

        if (userSet.size() < maxUserCount) {
            chain.doFilter(request, response);
            userSet.add(username);
        } else {
            httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login-limit.jsp");
        }
    }

    @Override
    public void destroy() {

    }
}

在上述代码中,LoginLimitFilter实现了Filter接口,并重写了其中的三个方法:init(FilterConfig)doFilter(ServletRequest, ServletResponse, FilterChain)destroy()。其中,init(FilterConfig)用于初始化Filter,destroy()用于销毁Filter。Filter中最重要的方法是doFilter(ServletRequest, ServletResponse, FilterChain),该方法在进行请求拦截时被调用。

doFilter(ServletRequest, ServletResponse, FilterChain)方法中,首先获取当前用户的信息,若当前用户非登录状态,则继续执行过滤器链;否则,获取当前系统中在线用户的集合,并进行判断。若在线用户数未超出限制,则继续执行过滤器链,并将当前用户加入在线用户集合中;否则,重定向到一个提示页面。

2. 注册Filter过滤器

还需要在Web项目的web.xml文件中进行配置,将以下代码添加到web.xml中:

<filter>
    <filter-name>LoginLimitFilter</filter-name>
    <filter-class>session.LoginLimitFilter</filter-class>
    <init-param>
        <param-name>maxUserCount</param-name>
        <param-value>10</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>LoginLimitFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

上述代码定义了一个名为LoginLimitFilter的Filter,该Filter类名为session.LoginLimitFilter,即上面所编写的过滤器类。同时,该过滤器在进行拦截时,在/*的URL模式下执行,表示拦截所有地址的请求。

init-param标签中,定义了一个名为maxUserCount的参数,用于设置在线用户数最大值,默认值为10。在Filter初始化时,这个参数将会被初始化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中使用session监听实现同帐号登录限制、登录人数限制 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • 详解java调用python的几种用法(看这篇就够了)

    下面是详解java调用python的几种用法的完整攻略。 1. 使用ProcessBuilder调用python ProcessBuilder可以通过指定命令行的方式启动子进程。因此使用ProcessBuilder可以很方便地调用python脚本,下面是示例代码: import java.io.*; public class CallPythonProces…

    Java 2023年5月23日
    00
  • Spring MVC+MyBatis+MySQL实现分页功能实例

    来讲解一下“Spring MVC+MyBatis+MySQL实现分页功能实例”的完整攻略。 首先,我们需要简单了解一下Spring MVC、MyBatis和MySQL分页功能的基本使用。 Spring MVC Spring MVC 是 Spring 框架的一个模块,用于开发 Web 应用程序。它是一个基于 MVC 设计模式的框架,提供了一个 Model-Vi…

    Java 2023年6月15日
    00
  • 23基于java教师科研项目管理系统

    背景及意义 目前许多人仍将传统的纸质工具作为信息管理的主要工具,而网络技术的应用只是起到辅助作用。在对网络工具的认知程度上,较为传统的office软件等仍是人们使用的主要工具,而相对全面且专业的信息管理软件仍没有得到大多数人的了解或认可。本选题则旨在通过标签分类管理等方式,实现教研的各种功能,从而达到对科研管理系统的管理。 项目环境 > 前端:html…

    Java 2023年5月5日
    00
  • 微信小程序填写用户头像和昵称实现方法浅析

    微信小程序填写用户头像和昵称实现方法浅析 在开发微信小程序时,需要获取用户信息,其中包括用户头像和昵称。下面将介绍如何实现微信小程序中用户头像和昵称的获取。 获取用户信息的基本步骤 获取用户授权:在小程序中使用 wx.getUserInfo 方法获取用户信息前,必须先执行授权。 wx.getUserInfo({ success: function(res) …

    Java 2023年5月23日
    00
  • 一篇文章带你入门Java基本概念

    一篇文章带你入门Java基本概念 Java是一个广泛应用的高级编程语言,它是一种面向对象的语言,体现了一些在C++中经过多年开发和实践所获得的经验,避免了其它更早的面向对象的语言的一些不足,是一个功能强大且通用性很高的编程语言。 基本概念 Java具有丰富的基本概念,其中一些需要初学者掌握: 类 Java中的类是一个蓝图或者模板,它定义了对象包含的属性和方法…

    Java 2023年5月23日
    00
  • Java多线程Thread基础学习

    Java多线程Thread基础学习 1. 什么是Java多线程? Java多线程是指在一个Java程序的执行过程中,有多个线程在同时执行。多线程的出现,可以提高程序的运行效率,提升用户体验。Java实现多线程的方法比较简单,主要依靠一个Thread类来实现。 2. Thread类的基本操作 在Java中,要实现多线程,我们可以创建一个Thread对象,然后重…

    Java 2023年5月19日
    00
  • 利用Java将2019拆分成三个素数平方和的方法实例

    下面是详细的攻略: 1. 前置知识 在理解“将2019拆分成三个素数平方和”的方法之前,需要掌握以下基本知识: 素数:一个大于1的数,如果仅能被1和它本身整除,则称之为素数。例如:2、3、5、7、11、13等。 平方和:多个数平方后的和。 2. 解法概述 根据题目要求,需要将数字2019拆分成三个素数的平方和。由于2019是一个奇数,所以其中至少一个素数必须…

    Java 2023年5月23日
    00
  • 利用Maven入手Spring Boot第一个程序详解

    利用 Maven 入手 Spring Boot 第一个程序的攻略,可以分为以下几个步骤: 步骤一:创建项目 打开 IntelliJ IDEA 软件,选择 “New Project”。 选择 “Spring Initializr” 选项,然后点击 “Next”。 在 “Project SDK” 下拉框中选择相应的 JDK 版本,然后点击 “Next”。 输入项…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部