时间:2021-05-20
总述
前些天,无意之间想到这个问题,感觉挺实用,有必要整理一下。随手写了一个简单的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 copypublic 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实现用户不可重复登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Java+Ajax实现的用户名重复检验功能。分享给大家供大家参考,具体如下:今天,我来教大家怎么实现Java+Ajax实现用户名重复检验。实体类代
本文讲述了PHP实现用户登录的案例代码。分享给大家供大家参考,具体如下:需求分析:在Web应用开发中,经常需要实现用户登录的功能。假设一个名为username的
用PHP实现简单的用户登录界面,供大家参考,具体内容如下首先要实现用户登录界面需要一个html登录表单用户名:密码:重复密码:然后开始按照流程图写PHP代码再P
本文实例讲述了WordPress如何实现用户自动登录功能的方法,其实就是很简单的让用户记住登录密码了,下次自动登录即可.分享给大家供大家参考。具体方法如下:如果
用户登录。同Spring整合Struts与Hibernate实现用户登录。可用Spring的IOC容器来管理Hibern-ate的SessionFactory,