java 登录下线_java 实现 一个账号只能在一个地方登陆,其他地方被下线

其实方法有很多的,我这献丑了。

使用理解java 四大作用域。

思路:理解java 四大作用域的关键。

第一个地方登陆:

1.得到请求的SessionId 和 登陆的 用户名

2.把SessionId 存到application里,用户名存到当前session里

ActionContext ac =ActionContext.getContext();

Map applicationMap=ac.getApplication();

Map sesisonMap =ac.getSession();

//请求的sessionId

String currentSeesionId=getRequest().getSession().getId();

applicationMap.put(loanUserE.getUname(), currentSeesionId);

sesisonMap.put(CommonVar.SSO_LOGIN_NAME_KEY,loanUserE.getUname());

第二个地方登陆:

1.获取浏览器的  SessionId 和取得  登陆的用户名

2.在当前的session 里取得  用户名对应的关键字  ,用关键字在application里获取SessionId ,

作比较,不相等就跳到登陆。

拦截器:

/**初始化参数获得*/ActionContext actionContext=arg0.getInvocationContext();/**HttpServletRequest参数*/HttpServletRequest request=(HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);/**HttpServletResponse参数*/HttpServletResponse response=(HttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE);/**Session参数*/Map sessionMap =actionContext.getSession();

Map appcationMap =actionContext.getApplication();

String loginName= null;//上下文对象中的sessionId

String sessionId = null;if (!sessionMap.isEmpty()) {

loginName=(String) sessionMap.get(CommonVar.SSO_LOGIN_NAME_KEY);

}if (null !=loginName) {

sessionId=(String) appcationMap.get(loginName);

}//当前会话的sessionId

String currentSessionId =request.getSession().getId();if (!currentSessionId.equals(sessionId)) {return "loanUserLogin";

}

原文:http://www.cnblogs.com/loveweiwei/p/4139668.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个账号只能一个在线的方法有很多种,其中一种比较常见的做法是使用token机制,在用户登录时生成一个token,并将其存储在服务端,同时将token返回给客户端。客户端在后续的请求中需要携带该token,服务端会验证token的有效性,从而判断用户是否已经登录。 在实现下线功能时,我们可以在用户登录时将其token与账号信息存储到一个全局的Map中。当用户再次登录时,我们可以先从Map中查找是否存在该账号的token,如果存在,则说明该账号已经登录,我们可以将其对应的token删除并让其下线,然后再将新的token存储到Map中,以保证同一个账号只能一个在线。具体实现可以参考以下代码: ```java @Component public class UserLoginInterceptor extends HandlerInterceptorAdapter { // 存储token和账号的映射关系 private static final Map<String, String> TOKEN_MAP = new ConcurrentHashMap<>(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); if (StringUtils.isNotBlank(token)) { String username = TOKEN_MAP.get(token); if (StringUtils.isNotBlank(username)) { // 说明该账号已经登录,将其踢下线 TOKEN_MAP.remove(token); // TODO: 发送下线通知 } // 将新的token存储到Map中 TOKEN_MAP.put(token, username); } return true; } } ``` 在上述代码中,我们使用了一个ConcurrentHashMap来存储token和账号的映射关系。在用户请求到达时,我们首先从请求头中获取token,然后在Map中查找该token对应的账号信息。如果存在该账号信息,则说明该账号已经登录,我们可以将其踢下线。最后,我们将新的token存储到Map中,以保证同一个账号只能一个在线。需要注意的是,我们在删除旧的token之前可以发送一个下线通知,以便让用户知道自己被踢下线了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值