同一账号,后一用户登录,前一个用户则被踢掉

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同一账号,后一用户登录,前一个用户则被踢掉相关的知识,希望对你有一定的参考价值。

原理:将已登录用户保存在数据库或者application或静态List(Map)里,

主要保存 session对象,登录账号id 等

每一个用户进行登录时去查看是否已经登陆过,

如果已登录,则取出其session然后将登陆账号id从session里移除

 

在过滤器里进行登录与否的判断

下面是一些详细步骤:

1、登录页面  login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<center>
<h1>用户登录</h1>
<hr>
<form action="LoginServlet">
<table>
<tr><th>  用户名:</th><td><input type="text" name="username"/></td></tr>
<tr><th>   密码:</th><td> <input type="password" name="password"/></td></tr>
<tr><td></td><td> <input type="submit" value="登录"></td></tr>
</table> 
<br>
<br>
</form>
</center>

</body>
</html>

2、main_frame.jsp 登录成功后的主页面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <%  String name = (String)request.getSession().getAttribute("username");  
         %>  
        
欢迎你,<%=name%> 

<a href="ManyServlet">操作一下</a>
</body>


</html>

3、session过期(未登陆)的页面 session.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
会话已过期
</body>
<script type="text/javascript">
setTimeout(function (){
    window.location.href = "${pageContext.request.contextPath}/login.jsp";
    window.close();
}, 2000);
</script>
</html>

4、被踢下线的页面 multisession.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
你的账号在别处登录,你已被迫下线。
</body>
<script type="text/javascript">
setTimeout(function (){
    window.location.href = "<%=request.getContextPath()%>/login.jsp";
}, 2000);
</script>
</html>

 

5、进行登录的servlet

package session;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private Map<String, HttpSession> userMap = new HashMap<String, HttpSession>();
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        HttpSession session = request.getSession();
        request.getSession().setAttribute("username", username);
        if(!userMap.containsKey(username))
        {
            System.out.println("新的会话ID:"+session.getId());
            userMap.put(username, session);
        }else {
            HttpSession session2 = userMap.get(username);
            if(!session2.getId().equals(session.getId()))
            {
                System.out.println("新的会话ID:"+session.getId());
                System.out.println("session已失效");
                System.out.println("已失效Id:" + session2.getId());
                 session2.removeAttribute("username");
                 session2.setAttribute("usermsg", "yes");
                userMap.put(username, session);
            }
      
        }
        String url = "main_frame.jsp";
        response.sendRedirect(url);
       
        
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

6、过滤器 SessionFilter.java

package filter;

import java.io.IOException;
import java.util.StringTokenizer;

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

import com.utils.SysUtils;


/**
 * Servlet Filter implementation class SessionFilter
 */
public class SessionFilter implements Filter {

    protected boolean ignore = false;                    //忽略
    protected String noFilterPath;              //不过滤的路径
    protected String sessionTimeoutPage;        //Session过期转向的页面
    /**
     * Default constructor. 
     */
    public SessionFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here

        // pass the request along the filter chain
        
       if(this.ignore)
    {
        chain.doFilter(request, response);
        return;
    }
        
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp= (HttpServletResponse) response;
        HttpSession session = req.getSession();
        
        String username = (String) session.getAttribute("username");
        boolean isLogin = username!=null;
        
       
        if(!isLogin)
        {
            String servletPath = req.getServletPath(); //当前服务端路径
            if(!isMatchPath(noFilterPath, servletPath)) //如果不匹配则转到Login页面
            {
                String url = req.getRequestURI() + (req.getQueryString() != null ? "?" + req.getQueryString() : "");
                    if(session.getAttribute("usermsg")!= null&&!session.getAttribute("usermsg").equals("") )
                    {
                        resp.sendRedirect(req.getContextPath()+"/multisession.jsp");
                        return;
                    }
                    resp.sendRedirect(req.getContextPath()+"/session.jsp");
                    System.out.println("Session is timeout. 地址为:" + url);
                    return;
              
            }
            
            
        }
        chain.doFilter(request, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
        this.ignore = "true".equalsIgnoreCase(fConfig.getInitParameter("ignore"));
        this.noFilterPath = fConfig.getInitParameter("noFilterPath");
    }
    /**
     * 是否匹配过虑路径
     *
     * @param filterPath 过滤路径
     * @param path       访问的地址
     * @return 匹配返回true,否则返回false
     */
    public boolean isMatchPath(String filterPath, String path)
    {
    /*    StringTokenizer token = new StringTokenizer(filterPath, path);
        while(token.hasMoreTokens())
        {
            String patter = SysUtils.trim(token.nextToken());
            boolean match = SysUtils.wildcardMatch(patter, path);
            if(match)
            {
              return true;  
            }
        }
        return false;*/
        if(filterPath.contains(path))
        {
            return true;
        }
        return false;
    }

}

7、进行额外业务servlet    ManyServlet.java

package session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ManyServlet
 */
public class ManyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ManyServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("业务逻辑哈哈");
        String url = "haha.jsp";
        response.sendRedirect(url);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

 

对应的jsp haha.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
嘿,你好。
</body>
</html>

web.xml 中fileter的配置

  <filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>filter.SessionFilter</filter-class>
    <init-param>
      <param-name>ignore</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>sessionTimeoutPage</param-name>
      <param-value>/error.jsp</param-value>
    </init-param>
     <init-param>
            <param-name>noFilterPath</param-name>
            <param-value>/login.jsp, /LoginServlet, /session.jsp, /multisession.jsp, /index.jsp
            </param-value>
        </init-param>
  </filter>
  <filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>*</url-pattern>
  </filter-mapping>

 

以上是关于同一账号,后一用户登录,前一个用户则被踢掉的主要内容,如果未能解决你的问题,请参考以下文章

在同一台电脑上能否开启多个客户端,多个用户能否同时登录同一个账号?

Win 2008 r2 远程桌面多用户登陆,一用户多登陆配置

如何打开win2008多用户远程桌面连接

数据库存储数据导致被踢下线问题

Win 2008 r2 远程桌面多用户登陆,一用户多登陆配置

(转)-Linux系统下强制踢掉登录用户