javaweb实现单点登录,防止重复登录,获取sessionid,对session及时销毁回收,只允许一个用户登录,结合struts2实现

首先我们目的是实现一个单点登录,即只允许单个账户单个登录。

实现异地与同地登录判断

要将先登录的用户强制下线。不免用到session。

单点登录的最大难题:已经登录且重复登录的用户的session怎么web全局操作它

我们来解决它。
基本目的实现的方法之一是{
1.建立一个可以全局存储当前登录人员信息的Map;推荐hashmap,因为更快。
2.建立一个登录人员监听,}
怎么建立全局呢还记得jsp的内置对象application吗,对,就是用它。
使用session的getservetContext()可以得到
它是存在于整个web项目的,只有项目关闭时才会实现,做全局很合适
具体代码在最后
存储哪些属性呢:
1.每个用户的账户(最好必须是
唯一标识
),当做Map的key;
2.每个用户产生的session的id,好吧,可以直接存session对象的,我试过,可以当做Map的value

那么存session对象的好处是什么?你不用拿着session的id去找回session(这步超级麻烦,然而好像网上依旧有许多这样的教程)
就可以直接对已经登录的重复的session进行操作,过程仅仅需要一个强制转化, 直接解决了单点登录的最大问题:已经登录且重复登录的用户的session直接可操作

那么又来了,直接存session没有缺点吗,不可能,你想一个session有可能存着许多的变量,那么这个对象就会变得比较大,如果项目上了级别,耗费资源也是要考虑的

好现在是具体的代码,两部分
1
这是在登录验证的时候的代码,取其精华!强制转换,重复的session获取
即在登录时检查重复登录,当前在线人数及其会话,加入到全局Map

private void query(String sql) {
		try {
			Connection co = Jdbc_DBCP_xiu.getConnection();
			PreparedStatement p = co.prepareStatement(sql);
			ResultSet result = p.executeQuery();
			// 设置登录结果
			if (result.next()) {
				ActionContext.getContext().getSession().put("user", u);
				this.loginflag = true;
				// 获取session
				HttpSession session = ServletActionContext.getRequest().getSession(true);

				// 检查重复登录key_user value_session
				ServletContext application = session.getServletContext();
				@SuppressWarnings("unchecked")
				Map<String, HttpSession> login_map_session = (Map<String, HttpSession>) application
						.getAttribute("login_map_session");
				// hashmap查找更快
				if (login_map_session == null) {
				
					login_map_session = new HashMap<>();
				}
				for (String key : login_map_session.keySet()) {
					// 同时在线
					if (u.equals(key)) {
						// 可尝试,发送信息给未下线的另一用户或强制下线另一用户
						HttpSession otherSession=((HttpSession) (login_map_session.get(key)));// 另一用户(HttpSession) login_map_session.get(key)
						//登录失败
						this.loginflag = false;
						if (session.getId().equals(otherSession.getId())) {
							session.setAttribute("tiplogin", "该用户同一地方多次登录!其已被强制下线");
							//强制本地(同一浏览器)所有重复会话直接下线(一个不留)
							//这三句相当于删除了session
							login_map_session.remove(session.getAttribute("user"));
							session.removeAttribute("user");
							session.getServletContext().setAttribute("login_map_session", login_map_session);
							//实际不下线,留下谁都行
						} else {
							session.setAttribute("tiplogin", "该用户已经在其他地方登录!其已被强制下线");
							//强制异地(不一浏览器)重复会话直接下线
							otherSession.invalidate();
						}
						
						return;
					}
				}
				// 当前在线人数及其会话,加入到全局
				login_map_session.put(u, session);
				application.setAttribute("login_map_session", login_map_session);
				// 当前预备下线

			} else {
				this.loginflag = false;
			}
			Jdbc_DBCP_xiu.release(co, p, result);
		} catch (Exception e1) {
			// TODO 自动生成的 catch 块
			this.loginflag = false;
			
		}

	}

2.session的监听器,实现SessionListener,session登录失效去全局Map中删除

package servlet.listener;

import java.util.Map;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;

@WebListener()
public class LoginListener implements javax.servlet.http.HttpSessionListener {
/**
	 * @author joker
	 * 
	 *  
	 *  登出,map的session删除
	 */

	public void sessionCreated(HttpSessionEvent se) {
		// TODO 自动生成的方法存根
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// TODO 自动生成的方法存根
		HttpSession s = se.getSession();
		// 保存到整个web中
		//登出
		if (s.getAttribute("user") != null) {
			@SuppressWarnings("unchecked")
			Map<String, HttpSession> login_map_session = (Map<String, HttpSession>) s.getServletContext().getAttribute("login_map_session");
			login_map_session.remove(s.getAttribute("user"));
			s.getServletContext().setAttribute("login_map_session", login_map_session);
		} 
	}
}

再加一点自己的前端,爽歪歪

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaWeb中使用session实现登录,具体步骤如下: 1. 用户在登录页面输入用户名和密码,点击登录按钮。 2. 服务器接收到登录请求,验证用户名和密码是否正确。 3. 如果验证通过,服务器创建一个session对象,并将用户信息保存在session中。 4. 服务器将sessionID返回给客户端,客户端保存session ID。 5. 用户在后续的请求中,将session ID发送给服务器。 6. 服务器根据session ID获取session对象,判断用户是否已经登录。 7. 如果用户已经登录,服务器返回用户信息,否则返回登录页面。 通过使用session实现登录,可以保证用户的安全性和数据的完整性,同时也方便了用户的操作。 ### 回答2: Javaweb是运用Java技术开发web应用程序的技术,它允许开发者创建具有动态交互特性的应用。在Javaweb开发中,登录一个基础且常见的功能。通过使用session,可实现用户的登录验证和保持登录状态的功能。 Session是一种服务器端的会话跟踪机制,它存储了服务器与客户端之间的一些交互信息。在Javaweb开发中,当用户登录时,服务器会为该用户创建一个session,并将sessionID存储在客户端的cookie中。在后续的请求中,客户端每次请求都会将该sessionID传回服务器,服务器通过sessionID获取该用户的session。 当用户输入账号和密码并提交表单时,服务器会验证该用户的信息是否合法,如果合法则为该用户创建一个session,并将用户名信息存储在session中。之后在每一个请求中,服务器都会根据sessionIDsession获取该用户的登录状态,从而控制该用户的操作。如果用户的session过期或被清除,则需要重新登录获取新的session。 以下是实现登录功能的步骤: 1. 在登录页面,用户提供用户名和密码,通过表单提交至服务器。 2. 服务器接收到请求后,对用户名和密码进行验证。 3. 如果验证通过,则创建一个session,将用户的信息存入session中。 4. 将该sessionID存储在客户端的cookie中,或在请求参数中返回sessionID。 5. 用户在后续的请求中,发送包含sessionID的请求参数至服务器。 6. 服务器获取到该sessionID后,根据sessionID获取该用户的session,并通过session中的信息对用户状态进行验证。 7. 服务器根据用户状态决定是否响应请求。如果登录未过期,则响应请求,否则拒绝响应。 通过session实现登录功能可以使用户在一定时间范围内保持登录状态,并且在此期间内进行操作时不需要反复验证登录状态。同时也可以在session中存储用户信息,方便其他模块进行后续操作。但是需要注意的是,session需要占用服务器的内存资源,因此需要及时清理过期的session以释放资源。 ### 回答3: JavaWeb是基于Java语言开发的一种Web服务平台,其中的Session是用来存储用户登录信息的一个重要机制。通过Session实现登录,能够保证用户信息的安全性和可靠性,为网站的管理提供了便利性。 Session指的是Web服务器为每一个用户创建的一个随机字符串。当用户第一次登录网站时,服务器会创建一个Session,并以Session ID作为Session的标识符,将这个Session ID存储到用户的浏览器中,以便每次浏览器发送请求时,服务器都能够查找到所对应的Session。 在JavaWeb中,使用Session实现登录的具体步骤如下: 1.创建一个JSP页面,其中包括了一个表单,用于用户输入用户名和密码。 2.在JSP页面中引用JavaBean类,通过Bean类的方法获取用户名和密码,并将其存储在Session中。 3.编写Servlet程序,在其中读取Session中的用户名和密码,并验证用户的登录信息。 4.如果用户输入的用户名和密码正确,则将用户的信息存储在Session中,并跳转到网站的主页面。 5.如果用户输入的用户名和密码不正确,则将错误信息显示在登录页面中,并提示用户重新输入。 通过使用Session实现登录,可以有效地避免用户信息被泄露和被篡改的风险,提高网站的安全性和可靠性。同时,它也能够为网站管理者提供便利的管理功能,例如对用户登录时间、登录次数、登录状态等信息进行统计和分析,从而更好地掌握网站的运行情况,并及时调整网站的运营策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值