Java实现用户不可重复登录功能

 总述

前些天,无意之间想到这个问题,感觉挺实用,有必要整理一下。随手写了一个简单的mode,感觉并不算难。思路理顺其实挺简单的。

为实现用户不可同时登陆,只要想想现实中新浪,百度等,只要一处登陆就将另一处的给“挤”下去,就可以知道实现结果为何。然后再逆推之,即可形成较为清晰的思路。我们一起来探讨一下。

首先,我们得明白用户登录使用什么登陆的,即用户在线的原理。这只是将用户的对象存放在了session中而已,然后再frame中进行调用,其他特定页面也进行直接引用就行。那么实现“挤下来”的功能就是让新生成的session有效,让原来存放用户的session失效就行。到此,大体思路已经有了。那怎么实现呢?

想要知道怎么实现,就必须要明白session存放用户对象的过程了。在用户登录之后,我们可以得到用户的对象user,而存放到session中需要执行session.setAttribute(key,value); 我们将用户的userId或是其他的唯一标识存为key,将用户对象存为值。这样就能随时随地调用唯一用户了。user存放的问题解决了,那相同 登录 时session废除的问题呢?

这个其实也不难,我们可以更具session的特性一样,用map进行存贮,将用户的标识存为key,而将其所对应的session存为value,那么当重复用户登录时,只需要取出对应的session,将其invalidate就行了。

至此,实现思路已经明了,聒噪了这么久,大家都急不可耐地想看代码了吧?以下是代码:

前置准备,jsp界面

界面很简单,只是一个简单的登录界面

<form action ="<%=request.getContextPath()%>/UserWXPServlet" method = "post">
  用户名š<input type = "text" name = "username"/><br/>
  密码š<input type = "text" name = "password"/><br/>
  <input type = "submit" value ="提交"/>
</form> 

成功后跳转页面

欢迎:${sessionScope.user.username}登陆!<br/>

我这没有写失败页面,大家可以自己写,失败页面也没什么好说的了

entity和登录的实现

user的javabean

private String username;
private String password;
public User() {
}
public User(String user, String password) {
  super();
  this.username = user;
  this.password = password;
}
public String getUsername() {
  return username;
}
public void setUsername(String username) {
  this.username = username;
}
public String getPassword() {
  return password;
}
public void setPassword(String password) {
  this.password = password;
} 

登录user的service实现方法,这里就不写dao和接口了,一切以简单为

public boolean dologin(User user){
    Properties pro = new Properties();
    InputStream is = UserWXPServlet.class.getClassLoader().getResourceAsStream("user_wxp.properties");
    String password = null;
    System.out.println(is+"--------->"+pro);
    if(user==null){
      return false;
    }
    try {
      pro.load(is);
      password = pro.getProperty(user.getUsername());
      if(user.getPassword()!=null&&user.getPassword().equals(password)){
        System.out.println("登陆成功");
        return true;
      }
    } catch (IOException e) {
      e.printStackTrace();
    }finally{
      if(is!=null){
        try {
          is.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return false;
  } 

登录成功返回true,失败则返回false。

Servlet和相应的逻辑工具类

接下来的代码就到了真正操作用户的代码了

本人在这里定义了两个类,一个工具类,一个核心servlet处理类

在工具类中加入了一些公共的元素,如以下代码:

/**
   * 每一个用户存放一个session。便于各种操作!!!
   */
  public static Map<String, HttpSession> mapSession = new HashMap<String,HttpSession>();
用户退出的代码(必须飞废除session或是remove相应的用户对象):
[java] view plain copy
public static void userLogout(String username){
  if(mapSession.get(username)!=null){
    //得到需要退出的用户的session
    HttpSession session = mapSession.get(username);
    //在map<username,session>中移除该用户,记住想要退出该用户,必须将该session废除或是remove掉user
    mapSession.remove(username);
    //得到session的所属性合集
    Enumeration e = session.getAttributeNames();
    //删除所有属性
    while(e.hasMoreElements()){
      String sessionName = (String) e.nextElement();
      session.removeAttribute(sessionName);
    }
    //废除该session
    session.invalidate();
  }
} 

Servlet的代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  String username = request.getParameter("username");
  String password = request.getParameter("password");
  User user = new User(username, password);
  UserService userService = new UserService();
  HttpSession session = request.getSession();
  if(userService.dologin(user)){
    //登录成功之后将用户插入到session中
    session.setAttribute("user", user);
    if(cheackSession(username)){
      //如果该session在此之前已经存在,则将该用户进行退出操作
      DbUtil.userLogout(username);
    }
    //将新的session存放到map<username,session>中
    DbUtil.mapSession.put(username, session);
    //操作成功,跳转,此处最好为重定向,让别人知道登录成功了
    request.getRequestDispatcher("login").forward(request, response);
    return ;
  }
  //此处跳转到失败页面,如果读者有兴趣,可以自行添加
} 

其中cheackSession(username) 的代码如下:

/**
 * 检查是否已经含有此session
 * @param username
 * @return true:已经存在,该删! false:未存在
 */
private boolean cheackSession(String username){
  HttpSession session = DbUtil.mapSession.get(username);
  if(session!=null){
    return true;
  }
  return false;
} 

最后附上Servlet的xml配置

<servlet>
  <description>
  用于测试 ,用户不可重复登录
  </description>
  <display-name>UserWXPServlet</display-name>
  <servlet-name>UserWXPServlet</servlet-name>
  <servlet-class>com.fingard.rabbit.wxp_test.Servlet.UserWXPServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>UserWXPServlet</servlet-name>
  <url-pattern>/UserWXPServlet</url-pattern>
</servlet-mapping> 

以上所述是小编给大家介绍的Java实现用户不可重复登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java实现用户自动登录

    自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录. 自动登录是指用户将用户的登录信息,人,保存到本地的文件中Cookie中. Name,value -声明时 new Cookie(key,value); Path-默认值,即为当前保存cookie的这个serlvet所在的路径. 如果Cookie在这样的路径:http://loclhost:8080/project/abc/AServlet 则Cookie的路径为: http://loclhost/project/a

  • java实现 微博登录、微信登录、qq登录实现代码

    微信,微博,QQ,这是现在目前用的最多的手机 APP,我们做产品哪能不跟他们不沾边,对于登录,我想谁也不想要多少个帐号密码,根本记不住! 为了增加用户体验,用户能够快速的注册登录,第三方账号进行登录注册的的需求也就由此而诞生 1.微信 1) 微信登录也是最坑人的,需要花300大洋成为开发者账户,没办法谁让微信用户群体大呢所以也就只好认了:然后登录网站后台需要创建网站应用,填写授权回调域(登录网站的域名)只填写域名即可 申请地址: https://open.weixin.qq.com/cgi-bi

  • java实现微博后台登录发送微博

    首先你需要有个微博开发者账号,我们需要的是App Key和App Secre及redirect_URI,公司原本就有所以这一步 省下来了,百度搜下有很多. 好了现在开始: 首先我在网上找到了这个代码,这里写链接内容 本来挺高兴的一次性解决了嘛:可是报错 "token刷新失败",看了下代码 返回的是 200 不是302 ,额有点懵了,不管了先研究研究为什么会这样吧,我将他生成的网址放到浏览器上看了下,进入的是授权页面,不会需要先登录.F12 看了下确实也是 200 ,于是我估计是不是因为

  • 解决java后台登录前后cookie不一致问题

    最近公司安全组提了一个bug,要求我们登录前后cookie不一致,这是一个奇葩的bug. 需求如下: 思路分析: 我的解决方案:在登录页面把Cookie中的JSESSIONID 删除掉,就可以实现cookie前后不一致,这种做法是治标不治本,简单粗暴,但是还是满足了需求. //删除cookie中的JSESSIONID document.cookie = "JSESSIONID=0;path=/;expires="+(new Date(0)).toGMTString(); 另外一种解决方

  • java 验证用户是否已经登录与实现自动登录方法详解

    验证用户是否已经登录 package cn.hongxin.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import jav

  • JavaWeb使用Cookie模拟实现自动登录功能(不需用户名和密码)

    其中包含两个jsp文件,分别为login.jsp和index.jsp 代码如下: login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

  • Java web过滤器验证登录防止未登录进入界面

    今天用ssh2写了个简单的系统,发现了一个问题,我这系统必须先登录成功才能进入主页,但我在浏览器里直接输入主页地址,发现也能进入,这个肯定不好,毫无安全性可言,后经查资料发现需要登录过滤器,就试了下,发现果然可以避免未经登录即可进入主页的危险,下面是我整理出的详细步骤: 1.首先写一个权限过滤filter类,实现Filter接口 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.Filter

  • Java用户登录验证代码

    废话不多说了,关键代码如下所示: import java.util.*; public class Demo04 { public static void main(String[] args){ //声明变量 String root="jim";//用户名 int passwd=123456;//密码 int time=0;//循环次数 int sum=0;//总计次数 Scanner input=new Scanner(System.in);//获取键盘输入 //for循环内 fo

  • Java简易登录注册小程序

    登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的地方,详见其它博客. 功能介绍:简单的登录注册系统,使用了数据库sqlserver.单例模式.正则表达式以及图形化开发等知识. 1.在登录界面,可以登录或者注册用户. 注册用户界面,按照正则表达式规定的格式要求来输入信息,若有误,则重新输入. 2.点击注册,首先连接SQLserver数据库,连接成功则会判断该用户名是否已经存在,若存在,则给出提示.反之则进行注册. 3.登录界面,点击登录按钮时,首先与数据库

  • Java 多用户登录限制的实现方法

    最近比较空闲没有项目做,于是乎捋了捋平时工作会遇到的一些常见问题,首先想到了多用户登录限制问题,下面就对此问题做一点思考讲解. 相关阅读: Java Web开发防止多用户重复登录的完美解决方案 1.设计场景 1)同一时刻不允许某个用户多地登录 2)用户已在A处登录,现在从B处登录是允许的,但会把A处挤掉(考虑到用户在A处登录后因某些情况跑到了B处,但还想继续之前的工作,所以需要登录系统) 3)B处挤掉A后,A再做其它操作的时候系统会给出提示,该用户在别处登录,如不是本人操作可能密码泄漏,请修改密

随机推荐