这个实现利用的是struts2的拦截器,大家也可以试着用filter+servlet来实现,原理都是一样的。
memcache的安装与拦截器的配置可以在我的文章里找到,我就不赘述了。
首先我们看下思路:
我们看到多台web服务器共享一台memcache服务器,这个memcache就是存储用户登录信息的作用。
在memcached中以map(key,value)形式存储数据,我们就可以用登录名作key,每一个浏览器访问节点的sessionId作value,用户登录更新对应登录名的sessionId,这样用户在做与服务器通信的操作时查询一次memcache看其中存储的sessionId是不是与自己的对应,不对应就说明已经有人再另一个地方登陆了,这时就可以把此用户踢掉了。这个原理比较简单,仔细想想就明白了。
下面是一段登录的代码
// 用户名
String usrName = request.getParameter(Constants.USER_NAME);
// 密码
String passwd = request.getParameter(Constants.USER_PASSWD);
// 请求的类型
String method = ServletActionContext.getRequest().getMethod();
boolean isGet = "GET".equalsIgnoreCase(method);// 如果为GET
// 如果是地址栏输入网址提交
if (isGet)
throw new LoginException("-1053");// 禁止get方式登录
// 判断是否输入了用户名,密码
if (StringUtils.hasText(usrName) && StringUtils.hasText(passwd)) {
// 验证登陆
boolean loginSuccess = loginService.login(usrName, passwd);
// 登录成功
if (loginSuccess) {
// 存储登录信息至memcache
boolean putSuccess = MemcacheHelper.setMap(usrName, request.getSession().getId());
if (putSuccess) {
request.setAttribute(Constants.SUCCESS, "SUCCESS");
request.setAttribute(Constants.PATH, path);
return SUCCESS;
} else {
throw new LoginException("-1011");// 登录失败,请重试
}
}
}
throw new LoginException("-1001");// 用户名,密码必须输入!
这段代码比较简单,就是把新登录的sessionId放到memcache里替换前面的。
关键在于连接器中对于sessionId的比对,拦截器代码:
// 此处去memcache查是否是正在使用用户
String sessionId = (String) MemcacheHelper.getValue(user.getLoginName());
String thisSessionId = request.getSession().getId();
logger.debug("从memcache取值,session值:" + sessionId);
/** 判断memcache是否有值 */
if (!StringUtils.hasText(sessionId)) {
logger.error("查询memcache失败");
request.getSession().invalidate();
// 返回登录页面
if (isAjax) {
response.sendError(1011, "登录信息获取失败,请重新登录");
response.flushBuffer();
} else
throw new LoginException("-1011");
}
/** 判断服务器session是否有值 */
if (!StringUtils.hasText(thisSessionId)) {
logger.error("服务器登录信息获取失败");
request.getSession().invalidate();
if (isAjax) {
response.sendError(1011, "登录信息获取失败,请重新登录");
response.flushBuffer();
} else
throw new LoginException("-1011");
}
/** 当memcache中存储登录用户与此用户对应正确时 */
if (!sessionId.equals(thisSessionId)) {
logger.error("该用户已在其他地点登录");
request.getSession().invalidate();
if (isAjax) {
response.sendError(1010, "该用户已在其他地点登录");
response.flushBuffer();
} else
throw new LoginException("-1010");
}
判断memcache里存的值是不是该用户的,不是就踢了@_@
- 大小: 19.8 KB
分享到:
相关推荐
通过设置Application对象中的特定键值对,可以实现简单的防止重复登录功能。 ##### 实现步骤: 1. **检查Application对象中是否存在该用户名:** 在用户尝试登录时,首先检查Application对象中是否已经存在该用户名...
如果检测到同一令牌的多个登录,服务器可吊销旧令牌并生成新的,防止重复登录。 3. **数据库锁定**:在用户登录时,系统可以在数据库中设置一个状态字段,表示用户当前已登录。如果检测到另一登录尝试,可以检查该...
本文将深入分析一个具体的EA示例代码,探讨其如何实现防止重复下单的功能,并在此基础上扩展相关的知识点。 #### 代码概览 给定的代码主要由三个部分组成:初始化函数`init()`、启动函数`start()`以及两个辅助函数...
通过上述方式,我们能够利用Redis实现一个简单的分布式锁,从而防止方法重复调用,有效应对防刷单等并发控制场景。在实际应用中,还需要结合业务需求和系统特性,对锁的实现进行优化,以保证系统的稳定性和性能。
在本案例中,由于项目组认为Struts2的标签性能不佳,所以选择了自定义拦截器来实现防止重复提交。 首先,我们来看如何创建自定义拦截器。在Struts2中,拦截器是基于AOP(面向切面编程)的概念,可以对Action的调用...
本文将详细探讨如何实现登录防止重复提交,并重点介绍生成随机验证码以及通过session验证的方法。 1. 随机验证码的生成与存储: 验证码是一种常用的防止恶意自动操作的方法,它通常由一串随机字符或数字组成,用户...
如果随后尝试启动第二个实例,操作系统会检测到互斥对象已经存在,并阻止新实例的创建,从而实现了防止程序重复运行的目的。 #### 实现步骤 1. **添加引用**:首先,在项目中添加对`System.Threading`命名空间的...
在这个"struts2实现的简单登陆 附加拦截器防止重复提交"的项目中,我们将深入探讨Struts2如何处理用户登录以及如何通过拦截器来防止重复提交的问题。 首先,我们来理解一下Struts2的核心概念。Struts2框架基于...
2. **使用预处理指令**:如上述防止重复包含的方法,在每个头文件中使用`#ifndef`和`#endif`来包裹头文件内容。 #### 五、总结 综上所述,防止变量重复定义、头文件重复包含以及处理嵌套包含是确保程序编译正确性...
这个扩展类的使用非常简单,只需要将它添加到你的工程中,然后在需要防止重复点击的按钮上引入对应的头文件。这通常意味着你需要在按钮的相关代码文件中导入这个扩展类的头文件,例如: ```swift #import "UIButton...
验证码方法是防止页面刷新重复提交最简单、最effective 的方法。该方法的基本原理是,每次提交表单时,服务器生成一个随机验证码,并将其存储在 Session 中。当用户提交表单时,服务器会验证该验证码是否正确,如果...
在本例中,要实现一个简单的登录验证过滤器,可以阻止未登录用户访问除了登录页面以外的其他后台管理页面。通过实现javax.servlet.Filter接口,我们创建了一个LoginFilter类。这个过滤器会在每个请求到达目标页面...
本文将详细介绍如何通过一个简单的实现方式来防止用户重复登录,该方法主要利用了ASP.NET中的`Application`对象以及Cookies进行状态管理。 #### 实现原理 在本例中,通过`Application`对象来跟踪当前登录用户的...
防止表单重复提交的方法(简单的token方式),内附实现代码及实现思路。
### ASP.NET中防止刷新页面造成表单重复提交 在Web应用程序开发中,特别是在使用ASP.NET进行网站构建时,一个常见的问题是表单重复提交。这通常发生在用户通过按下浏览器的F5键来刷新页面的情况下,此时之前的表单...
### AJAX 防止按钮重复提交 在Web应用开发中,为了避免用户因网络延迟或误操作而导致的数据重复提交问题,通常会采取一定的措施来确保数据的一致性和完整性。本篇文章将详细探讨如何通过AJAX技术结合JavaScript来...
8. **表单重定向(Redirect after Post)**:这是一种经典的防止重复提交的方法,提交表单后立即重定向到新的URL,这样即使用户再次点击提交,也会被重定向页面拦截。 9. **使用HTML5的formnovalidate属性**:对于...
一个常见的问题是:如何防止用户在一个客户端登录后,在另一个客户端进行重复登录?通常情况下,为了保障账号安全,我们需要在用户第一次登录后阻止其在其他设备上的再次登录,除非该用户先在当前设备上正常退出。 ...
为了解决这一问题,我们可以采用自定义注解结合Redis来实现一个防止表单重复提交的解决方案。 首先,让我们理解自定义注解的核心思想。注解是一种元数据,它提供了在代码中添加信息的方式,这些信息可以被编译器或...
首先,我们来看标题中的核心概念:C#防止重复操作和C#+Cookies防止重复操作。在C#的Web应用中,通常使用ASP.NET框架。当用户进行投票、点赞或评论等操作时,服务器端会检查该请求是否已经处理过。通过在用户的浏览器...