限制同一个会话只允许一个账号登录,针对ie7、e8多标签同一会话问题

package com.anxiesoft.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;

public class SessionFilter implements Filter {
 private Map<String,Long> sessions;
 private String loginedCode; 
 LogHelper log = new LogHelper(this.getClass());

 @Override
 public void destroy() {
  log.info("..........destroy..............");
  if (sessions != null) {
   sessions.clear();
   sessions = null;
  }
 }

 @Override
 public void doFilter(ServletRequest req, ServletResponse resp,
   FilterChain chain) throws IOException, ServletException {
  HttpServletRequest request = (HttpServletRequest) req;
  HttpSession session = request.getSession();
  String sessionId = session.getId();
  String url = request.getRequestURL().toString();
  String queryString = request.getQueryString();
  Map parameterMap = request.getParameterMap();
  log.info("来自Ip[" + request.getRemoteAddr() + "]的sessionId:" + sessionId);
  RequestDispatcher dispatcher = request.getRequestDispatcher("/admin/util/session.jsp");
  if (StringUtils.isNotEmpty(url)) {
   if (url.contains("/admin/login.do")) {
    if ("act=logout".equals(queryString)) {
     sessions.remove(sessionId);
     chain.doFilter(req, resp);
     return;
    }
    if (parameterMap.size() == 0) {
     chain.doFilter(req, resp);
     return;
    }
    if (parameterMap.size() == 4) {
     Long logintime = NumberUtils.toLong(request.getParameter("logintime"));
     if (!sessions.containsKey(sessionId)) {
      sessions.put(sessionId,logintime);
      loginedCode = (String) session.getAttribute(Constants.SESSION_VERIFYCODE);
      chain.doFilter(req, resp);
      return;
     } else {
      if (UsersSession.getInstance().getUserid(request) == null) {
       sessions.remove(sessionId);
       chain.doFilter(req, resp);
       return;
      }else{
       Long sessionLoginTime = sessions.get(sessionId);
       if(sessionLoginTime.intValue()==logintime.intValue()){
        chain.doFilter(req, resp);
        return;
       }else{
        session.setAttribute(Constants.SESSION_VERIFYCODE, loginedCode);
        dispatcher.forward(req, resp);
        return;
       }
      }
     }
    }
   } else {
    chain.doFilter(req, resp);
    return;
   }
  } else {
   log.error("web服务器崩溃。。。");
  }
 }

 @Override
 public void init(FilterConfig arg0) throws ServletException {
  log.info("..........init..............");
  sessions = new HashMap<String,Long>();
 }

}
 
表单提交时,需要提交用户名、密码、验证码、登录时间共4个参数。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值