javaWeb不允许两个客户端同时使用一个账号登录系统(支持多个tomcat)
2018-03-27 18:38
507 查看
(本代码需要在redis环境下才能实现)
思路:
1.在登录的时候监听登录的session,把sessionid和用户表示存在redis。(key:用户表示 ;value:sessionid)。
session监听:实现HttpSessionListener,HttpSessionAttributeListener。
2.写一个过滤器,过滤请求的session。
代码:
1.session监听
public void attributeAdded(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String name = event.getName();
log.info("当前session名称:" + name);
//判断当前是不是登录
if(name.equals("LoginSession")){
log.info(" ----------登录session监听------strat--------------");
//根据name来获取登录的session
String sessionid = event.getSession().getId(); //获取当前登录的sessionid
/**
这里你要连接你的redis。具体代码百度一下
*/
//把用户表示和sessionid存入缓存,并且给一个时间 为了防止直接关闭浏览器导致session不过期。一直存在于缓存。
JedisCluster cluster = new JedisCluster(nodes);
//判断缓存里面有没有sessionid
cluster.set(uid, sessionid);
cluster.expire(uid, 300);
log.info(loginUser.getNickname()+"登录中!");
log.info(" ----------登录session监听------end--------------");
}
}
2.过滤器
public class SessionFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@SuppressWarnings("null")
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain nextFilter) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = (HttpSession) request.getSession();
if(request.isRequestedSessionIdValid())
//获取当前请求的sessionid
String sessionid = session.getId();
LoginSession login = (LoginSession) request.getSession().getAttribute("LoginSession");
if(login != null){
String uid = login.getUid();
//从缓存中取得当前uid的sessionid
JedisCluster cluster = new JedisCluster(nodes);
String redis_sessionid = cluster.get(uid);
cluster.expire(uid, 300);//redis失效时间刷新
//判断请求session是不是被另外一个客户登录
if(redis_sessionid != null){
//如果当前的sessionId和redis的sessionid不一致,那是因为有人登陆了这个账号
if(!redis_sessionid.equals(sessionid)){
session.invalidate();//让当前请求的session失效
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<script language='JavaScript' type='text/JavaScript'>");
out.println("alert('您的账号在异地登录,已被迫下线!')");
out.println("history.back();");
out.println("</script>");
out.close();
response.sendRedirect("/index.jsp");
return;
}
}
}
}else{
request.getSession().invalidate();
}
nextFilter.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
思路:
1.在登录的时候监听登录的session,把sessionid和用户表示存在redis。(key:用户表示 ;value:sessionid)。
session监听:实现HttpSessionListener,HttpSessionAttributeListener。
2.写一个过滤器,过滤请求的session。
代码:
1.session监听
public void attributeAdded(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String name = event.getName();
log.info("当前session名称:" + name);
//判断当前是不是登录
if(name.equals("LoginSession")){
log.info(" ----------登录session监听------strat--------------");
//根据name来获取登录的session
String sessionid = event.getSession().getId(); //获取当前登录的sessionid
/**
这里你要连接你的redis。具体代码百度一下
*/
//把用户表示和sessionid存入缓存,并且给一个时间 为了防止直接关闭浏览器导致session不过期。一直存在于缓存。
JedisCluster cluster = new JedisCluster(nodes);
//判断缓存里面有没有sessionid
cluster.set(uid, sessionid);
cluster.expire(uid, 300);
log.info(loginUser.getNickname()+"登录中!");
log.info(" ----------登录session监听------end--------------");
}
}
2.过滤器
public class SessionFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@SuppressWarnings("null")
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain nextFilter) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = (HttpSession) request.getSession();
if(request.isRequestedSessionIdValid())
//获取当前请求的sessionid
String sessionid = session.getId();
LoginSession login = (LoginSession) request.getSession().getAttribute("LoginSession");
if(login != null){
String uid = login.getUid();
//从缓存中取得当前uid的sessionid
JedisCluster cluster = new JedisCluster(nodes);
String redis_sessionid = cluster.get(uid);
cluster.expire(uid, 300);//redis失效时间刷新
//判断请求session是不是被另外一个客户登录
if(redis_sessionid != null){
//如果当前的sessionId和redis的sessionid不一致,那是因为有人登陆了这个账号
if(!redis_sessionid.equals(sessionid)){
session.invalidate();//让当前请求的session失效
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<script language='JavaScript' type='text/JavaScript'>");
out.println("alert('您的账号在异地登录,已被迫下线!')");
out.println("history.back();");
out.println("</script>");
out.close();
response.sendRedirect("/index.jsp");
return;
}
}
}
}else{
request.getSession().invalidate();
}
nextFilter.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
相关文章推荐
- 在windows server里,对于同一个账号,禁止或允许多个用户使用该账户,同时登录
- javaweb实现一个账号只能同时被一个人使用(Java实现)
- Asp.net 实现只能允许一个账号同时只能在一个地方登录
- Git-在一个电脑上同时使用两个Git的账号
- 如何在一个电脑上同时使用两个Git的账号
- 两个账号同时登录,后登录的账号将前一个账号挤掉
- 一个系统同时运行两个 多个 Tomcat
- 让Linux系统允许使用root账号远程登录
- Asp.net 实现只能允许一个账号同时只能在一个地方登录
- springsecurity中如何做到多个用户不能使用同一个账号同时登陆系统
- 如何创建一个只允许使用sftp登录且只能访问特定目录的账号
- 使用template扩展已有的DDX_Text函数,使扩展能够同时支持各种数据类型的一个例子
- asp.net 单用户登录(系统中只允许同一账户的一个存在--排它多处登录)
- 一个账号不允许多个用户同时在线,重复登陆
- 修改内核文件使系统同时支持多个特定usbserial设备
- FreeBSD添加一个新用户并允许其使用ssh通过公私钥的方式登录
- GTalk小技巧 同一个系统同时登陆两个帐号
- VB.Net + asp.net的一个web系统,使用SQL2000数据库 现在运行时偶尔会出现一个奇怪现象,一个用户登录时,登录后的界面竟然是另一个用户
- 使用路由器让两台电脑同时用一个adsl账号上网
- 不要在同一客户端同时使用超过两个的 HTTP 长连接