本文简单列举几个java开发的Listener,以及模拟单态登录的简单demo
ServletContextListener
ServletContextAttributeListener
HttpSessionAttributeListener
httpSessionActivationListener
HttpSessionBindingListener
ServletRequestListener
ServletRequestAttributeListener
具体作用可以查看Servlet的源码
单态登录就是一个ip登录了账号并且没有session没有过期的情况下,那么其他ip无法登录这个账号,当然这个简单的demo只是模拟一下,比较粗糙
package listener;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class contextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
ServletContext context = arg0.getServletContext();
Map
map = new HashMap
();
context.setAttribute("userMap", map);
}
}
package listener;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener
public class sessionListener implements HttpSessionAttributeListener{
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
//获取用户对应的session
HttpSession httpSession = arg0.getSession();
//获取用户名
String username = (String)httpSession.getAttribute("username");
//检查userMap是否存在username这个key
ServletContext context = httpSession.getServletContext();
Map
map =(Map
) context.getAttribute("userMap");
if(map.containsKey(username)){
httpSession.setAttribute("username", null);
}else{
map.put(username, httpSession);
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
}
package Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name="loginServlet",urlPatterns={"/loginServlet.do"},loadOnStartup=-1)
public class loginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
HttpSession httpSession = req.getSession();
httpSession.setAttribute("username", username);
if(httpSession.getAttribute("username")==null){
req.setAttribute("exception", new RuntimeException("the user has logined in other"));
req.getRequestDispatcher("error.jsp").forward(req, resp);
return;
}
req.getRequestDispatcher("success.jsp").forward(req, resp);
}
}
运行结果:
当然只是简单模拟一下,要怎么去适配应用场景需要自己去优化