Java 实现用户不可重复登录功能
这里有新鲜出炉的 Java 设计模式, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 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>
来源: http://www.phperz.com/article/18/0210/359037.html