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技术站