在登录方法中加入如下两行语句,作为程序的入口:

SessionListener.isAlreadyEnter(getHttpRequest().getSession(),this.getUserCode(),loginUser)

getHttpRequest().getSession().setAttribute("isLoginIn", "LoginIn");

在SessionListener类中做相关的踢出处理:

    1. import java.util.HashMap;
    2.  
      import java.util.Iterator;
    3.  
      import java.util.Map;
    4.  
      import javax.servlet.ServletRequestEvent;
    5.  
      import javax.servlet.ServletRequestListener;
    6.  
      import javax.servlet.http.HttpServletRequest;
    7.  
      import javax.servlet.http.HttpSession;
    8.  
      import javax.servlet.http.HttpSessionAttributeListener;
    9.  
      import javax.servlet.http.HttpSessionBindingEvent;
    10.  
      import javax.servlet.http.HttpSessionEvent;
    11.  
      import javax.servlet.http.HttpSessionListener;
    12.  
      import org.apache.struts2.ServletActionContext;
    13.  
      import com.hhwy.iepip.framework.message.Message;
    14.  
      import com.opensymphony.xwork2.ActionContext;
    15.  
       
    16.  
      public class SessionListener implements HttpSessionListener,ServletRequestListener,HttpSessionAttributeListener{
    17.  
      public static Map<String, HttpSession> sessionMap = new HashMap<String, HttpSession>();
    18.  
      public static Map<String, HttpSession> sessionMap1 = new HashMap<String, HttpSession>();
    19.  
      private static Boolean onlyOne = Boolean.valueOf(Message.getMessage("session.onlyone"));
    20.  
      private HttpServletRequest request ;
    21.  
       
    22.  
      /**获取request对象*/
    23.  
      public void requestInitialized(ServletRequestEvent event) {
    24.  
      request = (HttpServletRequest)event.getServletRequest();
    25.  
      }
    26.  
       
    27.  
      /**以下是实现HttpSessionListener中的方法:该方法登录与否都会执行**/
    28.  
      public void sessionCreated(HttpSessionEvent se){
    29.  
      }
    30.  
       
    31.  
      /**以下是实现HttpSessionListener中的方法**/
    32.  
      public void sessionDestroyed(HttpSessionEvent se){
    33.  
      hUserName.remove(se.getSession().getId());
    34.  
      UserObject.remove(se.getSession().getId());
    35.  
      if(sessionMap!=null){
    36.  
      sessionMap.remove(se.getSession().getId());
    37.  
      }
    38.  
      if(sessionMap1!=null){
    39.  
      sessionMap1.remove(se.getSession().getId());
    40.  
      }
    41.  
      }
    42.  
      /**
    43.  
      * isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
    44.  
      * <该方法是系统业务的方法,不是处理单个用户登录的问题,以该方法做为程序的入口>
    45.  
      */
    46.  
      public static boolean isAlreadyEnter(HttpSession session,String sUserName,LoginUserInfo loginTriggers){
    47.  
      boolean flag = false;
    48.  
      return flag;
    49.  
      }
    50.  
       
    51.  
      /**
    52.  
      * 此方法,可以在登录时候添加一个session 用以判断是否已经登录,然后再进行登录人登录控制
    53.  
      */
    54.  
      public void attributeAdded(HttpSessionBindingEvent event) {
    55.  
      //如果只允许一个账号一处登陆,单台客户端电脑只允许一个用户登录
    56.  
      if(onlyOne.booleanValue()){
    57.  
      String name = event.getName();
    58.  
      if(name.equals("isLoginIn")){
    59.  
      // 单台客户端电脑只允许一个用户登录
    60.  
      String ipAddr = this.getIpAddr(request);
    61.  
      //如果原先已登录,则踢出原先登陆的
    62.  
      if(sessionMap1.containsKey(ipAddr) ){
    63.  
      try{
    64.  
      sessionMap1.get(ipAddr).invalidate();
    65.  
      }catch(Exception e){}
    66.  
      sessionMap1.remove(ipAddr);
    67.  
      }
    68.  
      if(ipAddr != null && event.getSession().isNew())
    69.  
      sessionMap1.put(ipAddr, event.getSession());
    70.  
       
    71.  
      //只允许一个账号一个客户端登陆
    72.  
      String userName= getUserName(event);
    73.  
      if(sessionMap.containsKey(userName) ){
    74.  
      try{
    75.  
      sessionMap.get(userName).invalidate();
    76.  
      }catch(Exception e){}
    77.  
      sessionMap.remove(userName);
    78.  
      }
    79.  
      if(userName != null && event.getSession().isNew())
    80.  
      sessionMap.put(userName, event.getSession());
    81.  
      }
    82.  
      }
    83.  
      }
    84.  
       
    85.  
      public static String getIpAddr(HttpServletRequest request) {
    86.  
      String ip = request.getHeader("x-forwarded-for");
    87.  
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    88.  
      ip = request.getHeader("Proxy-Client-IP");
    89.  
      }
    90.  
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    91.  
      ip = request.getHeader("WL-Proxy-Client-IP");
    92.  
      }
    93.  
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    94.  
      ip = request.getRemoteAddr();
    95.  
      }
    96.  
      return ip;
    97.  
      }
    98.  
       
    99.  
      /*获取session中存储的用户名*/
    100.  
      private String getUserName(HttpSessionBindingEvent se) {
    101.  
      String userName = null;
    102.  
      return userName;
    103.  
      }
    104.  
       
    105.  
      public void attributeRemoved(HttpSessionBindingEvent event) {
    106.  
      // TODO Auto-generated method stub
    107.  
      }
    108.  
       
    109.  
      public void attributeReplaced(HttpSessionBindingEvent arg0) {
    110.  
      // TODO Auto-generated method stub
    111.  
      }
    112.  
       
    113.  
      public void requestDestroyed(ServletRequestEvent arg0) {
    114.  
      // TODO Auto-generated method stub
    115.  
      }
    116.  

SSH版最大会话连接数的更多相关文章

  1. 《linux就该这么学》课堂笔记13 网络会话、ssh、远程会话

    1.常见的网卡绑定驱动有三种模式—mode0.mode1和mode6 mode0(平衡负载模式):平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术. ...

  2. ORA-00020: maximum number of processes (40) exceeded模拟会话连接数满

    问题描述:在正式生产环境中,有的库建的process和session连接数目设置的较小,导致后期满了无法连接.因为正式库无法进行停库修改,只能释放连接,做个测试模拟 1. 修改现有最大会话与进程连接数 ...

  3. 解决SSH会话连接超时问题

    用SSH客户端连接linux服务器时,经常会出现与服务器会话连接中断现象,照成这个问题的原因便是SSH服务有自己独特的会话连接机制.记得在一年前就有朋友问过我这个问题,那时候我便是草草打发,结果自己现 ...

  4. 阿里云(ECS)Linux客户端SSH会话连接超时OperationTimedOut

    问题描述:使用SecureCRT等SSH客户端连接Linux服务器时,提示Operation timed out. 问题原因:SSH服务未配置或注释掉向SSH客户端连接会话发送频率和时间. 解决方法: ...

  5. SSH的端口转发:本地转发Local Forward和远程转发Remote Forward

    关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...

  6. Android手机SSH Client客户端推荐JuiceSSH

    Windows上建立ssh服务器 参见: http://www.cnblogs.com/xred/archive/2012/04/21/2461627.html Android手机SSH Client ...

  7. SSH服务端配置、优化加速、安全防护

    CentOS7自带的SSH服务是OpenSSH中的一个独立守护进程SSHD.由于使用telnet在网络中是明文传输所以用其管理服务器是非常不安全的不安全,SSH协议族可以用来对服务器的管理以及在计算机 ...

  8. Redhat 6.7 x64升级SSH到OpenSSH_7.4p1完整文档

    原文链接:https://www.cnblogs.com/xshrim/p/6472679.html 导语 Redhat企业级系统的6.7版自带SSH版本为OpenSSH_5.3p1, 基于审计和安全 ...

  9. SSH的端口转发

    这里是一篇很好的介绍SSH PortForwarding的文章http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 可以将远端服务器一 ...

随机推荐

  1. part1:6-Linux文本编辑器vi

    vi编辑器简介: vi是Linux系统的第一个全屏幕交互式编辑器:vim则是vi的升级版得到广大用户青睐. vim有三种工作模式:命令行模式.插入模式.底行模式 命令行模式常用功能键: yy:复制当前 ...

  2. XAMPP Apache + MariaDB + PHP + Perl

    https://www.apachefriends.org/zh_cn/index.html 什么是XAMPP? XAMPP是最流行的PHP开发环境 XAMPP是完全免费且易于安装的Apache发行版 ...

  3. 2018.10.12 NOIP模拟 字符处理(模拟)

    传送门 sb模拟,考试跟着sb了90分. 代码

  4. phalapi框架where条件查询

    // WHERE name = 'dogstar' AND age = 18 $user->where(array('name' => 'dogstar', 'age' => 18) ...

  5. 优秀前端工程师必备:" checkbox & radio--单钩 & 多钩 "大比较:你是♂||♀ , 还是 ♂&♀

    1 单选: type="radio"  需求: 男女input只能选择一个 <input type="radio" name="sex" ...

  6. SPSS—非线性回归(模型表达式)案例解析

    非线性回归过程是用来建立因变量与一组自变量之间的非线性关系,它不像线性模型那样有众多的假设条件,可以在自变量和因变量之间建立任何形式的模型    非线性,能够通过变量转换成为线性模型——称之为本质线性 ...

  7. 201709019工作日记--sleep、wait、notify的使用详解

    1. sleep()和wait()的区分 (1)这两个方法来自不同的类分别是,sleep来自Thread类,wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在 ...

  8. 201709012工作日记--activity与service的通信机制

    service生命周期 Service主要包含本地类和远程类. Service不是Thread,Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 ...

  9. java分层

    一.为什么要分层. 以前的我们,写代码的时候,都在main()方法中,出现了错误,就慢慢调试,这样浪费了我们很长的时间,而我们程序员的时间是非常宝贵的 但是当我们使用分层架构的时候,就可以清晰明确的知 ...

  10. 转: JaxbContext生成xml文件或java类对象转化注解

    JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换.在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版 ...