多用户远程登录同时登录 其Session会冲突吗

只需一步,快速开始
扫一扫,极速登录
后使用快捷导航没有帐号?
如何解决浏览器多用户登录时$fr_username冲突
|查看: 1249|回复: 7
经验值 & | &F豆 464 个 &| &F币 0 元
最佳答案 2 条 &| &最后登录
比如在同一台电脑上登录了用户A并打开了填报页面,填报时利用了公式=$fr_username, 那么录入数据库的时候应该为A,这个没错。
这个用户没有把刚才的页面关闭,又在浏览器中打开了决策平台,登录了用户B并打开了填报页面,录入数据库时应该为B,这也没错。
但是问题来了:
这个家伙又切换到第一次打开的页面,填报时仍然为用户A,这个怎么解决呢?照理说,登录登录B用户,应该把A用户踢出了
此帖共有 110 位番薯登录后查看
width:100%">
经验值 & | &F豆 36648 个 &| &F币 12 元
最佳答案 404 条 &| &最后登录
同一浏览器如果同时存在两个用户~如果模板完全没问题浏览器缓存也清楚了~说明是BUG~找企业QQ
width:100%">
经验值 & | &F豆 61743 个 &| &F币 111 元
最佳答案 141 条 &| &最后登录
看什么浏览器的吧,chrome浏览器的话可能会有多个线程,所以有独立session,也有可能刷新下页面A就可以了
这是个漏洞啊,难道让使用者去刷新A页面 去避免这个漏洞啊? 12:16&
width:100%">
经验值 & | &F豆 33825 个 &| &F币 20 元
最佳答案 1097 条 &| &最后登录
楼主,这么长时间了哦,快采纳吧,这个是一个BUG,不知道楼主去提交了BUG没有呢
如果我的意见或方案可以帮助到楼主,希望楼主对我的意见能够采纳,也算是对我努力付出的回报,我的QQ:9961107,在解决完问题后请点击左下方的采纳按钮,选定我的答案为最佳答案,谢谢
希望可以帮到楼主,记得采纳意见哦,或是加我的QQ:9961107
width:100%">
在帆软论坛做出了突出贡献的人,会被授予荣誉勋章
FineReport 8.0测试勋章
V8.0“一个BUG一百块”活动纪念勋章
我可是专业的哦!
Fanruan Certified Reporting Associate
帆软认证报表工程师
Fanruan Certified Reporting Professional 帆软认证报表资深工程师
请叫我雷锋
灌水好是好,可是要有度,不能灌得得意忘形而被@传说哥封了郁闷不已
当他回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞耻,他已经把他的整个生命和全部精力,都献给了帆软论坛
活动进行中
截止报名时间: 20:10
截止报名时间: 20:00
截止报名时间: 09:30
截止报名时间: 09:30
截止报名时间: 09:30
截止报名时间: 09:30
截止报名时间: 09:30
Copyright & ||一台机器同时登录多个用户session互相冲突如何解决?
[问题点数:100分]
一台机器同时登录多个用户session互相冲突如何解决?
[问题点数:100分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2009年11月 挨踢职涯大版内专家分月排行榜第二2009年9月 挨踢职涯大版内专家分月排行榜第二2009年5月 Java大版内专家分月排行榜第二2008年11月 Java大版内专家分月排行榜第二
2010年9月 挨踢职涯大版内专家分月排行榜第三2009年7月 挨踢职涯大版内专家分月排行榜第三2009年4月 挨踢职涯大版内专家分月排行榜第三2008年12月 Java大版内专家分月排行榜第三
2006年4月 总版技术专家分月排行榜第一
2006年3月 总版技术专家分月排行榜第三
2009年6月 挨踢职涯大版内专家分月排行榜第二2009年5月 挨踢职涯大版内专家分月排行榜第二2009年3月 挨踢职涯大版内专家分月排行榜第二2008年12月 挨踢职涯大版内专家分月排行榜第二
2009年6月 Web 开发大版内专家分月排行榜第三
匿名用户不能发表回复!|Java用户登入问题,如果用户登入成功,我将用户对象存放到Session里,如果多个用户同时登入怎么办?_百度知道
Java用户登入问题,如果用户登入成功,我将用户对象存放到Session里,如果多个用户同时登入怎么办?
如果用户登入成功,我将用户对象存放到Session里代码如下:
//将成功登入信息存放到Session
ActionContext.getContext().getSession().put(&user&, users);
如果多个用户同时登入怎么办?我在页面是通过Session直接取出值,如果几个用户同时都登入了,那该...
我补充一下,如果以后项目发布了,用户那边用浏览器登入,就是说,把项目想象成发布以后,假如100个用户在线,那不是前面登入的都被覆盖了吗?
我有更好的答案
第一种方式,每次登录 都需要操作数据库,多了一些不必要的性能开销,而且在登录状态下 万一突然电脑关闭了,那就永远都不能登录了,可用性比较低。但是第二种方式就不一样了,可操作性强,很方便维护所有在线用户的信息。在处理登录的login方法中,先查询数据库验证下该用户是否存在,如果存在 判断该登录账户是否已经锁定了, 然后从application内置作用域对象中取出所有的登录信息,查看该username账户是否已经登录,如果登录了,就友好提示下,反之表示可以登录,将该登录信息以键值对的方式保存在application中。1、将用户的登录信息用一个标志位的字段保存起来,每次登录成功就标记1,注销登录就标记为0,当标记为1的时候不允许别人登录。2、将用户的登录信息保存在application内置作用域内, 然后利用session监听器监听每一个登录用户的登录情况。
采纳率:90%
不会,你妹懂session的原理。。。每次浏览器请求都会传递以的sessionId,服务器会根据对用的sessionId分配对用的session,所以只要不是同一个会话的重复登录就不会覆盖
本回答被提问者采纳
session是和cookie关联的,cookie里面有一个sessionId,所以就算你再多用户同时登陆,session也不会互相干扰的.
ActionContext.getContext().getSession().put(&user&, users);
应该是这样的,一台电脑上,只能一个用户登录,第二个登录则自动覆盖第一个。如果放在服务器上,这样写也不会有任何问题
后面的session,会覆盖前面的session吧多个的话用cookie吧,设个时效
一个页面登陆就覆盖了呗。比如游戏不能双开。
其他6条回答
为您推荐:
其他类似问题
session的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。多用户登陆,session 如何处理? - ThinkPHP框架
登陆成功后,session自动记录ID和NAME。
要是用户修改文章,通过GET进入修改,
要是用户故意在地址栏ID是其它数字。
那么页面自动跳转别人发布的文章修改页面了。
如何session控制呢? 一旦session判断不是自己的文章,不允许进去编辑。
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。Java 多用户登录限制的实现方法_java
作者:用户
本文讲的是Java 多用户登录限制的实现方法_java,
最近比较空闲没有项目做,于是乎捋了捋平时工作会遇到的一些常见问题,首先想到了多用户登录限制问题,下面就对此问题做一点思考讲解。
相关阅读:
Java Web开发防止多用户重复登录的完美解决方案
1、设计场景
  1)同一时刻不允许某个用户
最近比较空闲没有项目做,于是乎捋了捋平时工作会遇到的一些常见问题,首先想到了多用户登录限制问题,下面就对此问题做一点思考讲解。
相关阅读:
Java Web防止多用户重复登录的完美解决方案
1、设计场景
  1)同一时刻不允许某个用户多地登录
  2)用户已在A处登录,现在从B处登录是允许的,但会把A处挤掉(考虑到用户在A处登录后因某些情况跑到了B处,但还想继续之前的工作,所以需要登录系统)
  3)B处挤掉A后,A再做其它操作的时候系统会给出提示,该用户在别处登录,如不是本人操作可能密码泄漏,请修改密码。
2、思路导图
  每个用户登录的时候,通常我们会将用户信息存入session,以便用户进行操作的时候系统方便得到用户的基本信息。但这个session具有私有性,只对当前用户可见(如果同意用户在不同浏览器登录会得到不同的session,这也是为什么可以多用户登录的根源所在)。那么接着问题就来了,某个用户登录的时候如何能知道自己是否在线,相信聪明的你已经想到,这还不好半,把在线的用户信息存储在一个公共的地方问题不就迎刃而解了么,网上一查,解决方案无出其右,大致为以下两种
  1)数据库中标识在线用户
  2)存储到application中
  经过重重考虑,我们会发现方案一需要解决许多棘手的问题(用户异常退出未来得及修改状态,频繁访问数据库影响性能等),这对于一个要求完美的你来说显然是不合时宜的,于是我们采用了方案二,将在线用户信息保存到application中,具体设计如下。
  1)登录流程图
  2)被挤掉后操作流程图
  1)登录方法
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(String userName, String password, RedirectAttributes redirectAttributes, HttpServletRequest request) {
//判断用户是否已经在线及处理(已在线则剔除)
String loginLimite = limiteLogin.loginLimite(request, userName);
//判断用户名、密码是否正确
String result = userService.login(userName, password);
if (result.equals("success")) {
request.getSession().setAttribute("now_user", userService.findByUserName(userName));
//创建token及验证
String jwtToken = tokenService.createUserAuthToken(userService.findByUserName(userName));//生成token
System.out.println(jwtToken);
UserAuthenticationToken authToken = tokenService.retrieveUserAuthToken(jwtToken);//token解析
System.out.println(authToken.isAuthenticated());
System.out.println("id = " + UserAuthenticationToken.getCurrentToken().getUserUuid());
//用户掉线,登录后重定向到保存的链接
Object url = request.getSession().getAttribute("redirect_link");
if (url != null) {
request.getSession().removeAttribute("redirect_link");
return "redirect:" + url.toString();
return "index";
redirectAttributes.addFlashAttribute("message", result);
return "redirect:/other/toLogin";
  2)登录判断是否已经在线
@Transactional
public class LimiteLogin {
private static Logger log = Logger.getLogger(SessionListener.class);
private static Map&String, String& loginUserMap = new HashMap&&();//存储在线用户
private static Map&String, String& loginOutTime = new HashMap&&();//存储剔除用户时间
@Autowired
private UserService userS
public String loginLimite(HttpServletRequest request, String userName) {
User user = userService.findByUserName(userName);
String sessionId = request.getSession().getId();
for (String key : loginUserMap.keySet()) {
//用户已在另一处登录
if (key.equals(user.getUserName()) && !loginUserMap.containsValue(sessionId)) {
log.info("用户:" + user.getUserName() + ",于" + DateUtil.dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss") + "被剔除!");
loginOutTime.put(user.getUserName(), DateUtil.dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss"));
loginUserMap.remove(user.getUserName());
loginUserMap.put(user.getUserName(), sessionId);
request.getSession().getServletContext().setAttribute("loginUserMap", loginUserMap);
request.getSession().getServletContext().setAttribute("loginOutTime", loginOutTime);
return "success";
  3)登录拦截器(未登录跳转登录页)
public class LoginInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("now_user");
if (session.getAttribute("now_user") == null) {
response.sendRedirect(request.getContextPath() + "/other/toLogin");
//多用户登录限制判断,并给出提示信息
boolean isLogin =
if (user != null) {
Map&String, String& loginUserMap = (Map&String, String&) session.getServletContext().getAttribute("loginUserMap");
String sessionId = session.getId();
for (String key : loginUserMap.keySet()) {
//用户已在另一处登录
if (key.equals(user.getUserName()) && !loginUserMap.containsValue(sessionId)) {
if (isLogin) {
Map&String, String& loginOutTime = (Map&String, String&) session.getServletContext().getAttribute("loginOutTime");
session.setAttribute("mess", "用户:" + user.getUserName() + ",于 " + loginOutTime.get(user.getUserName()) + " 已在别处登录!");
loginOutTime.remove(user.getUserName());
session.getServletContext().setAttribute("loginUserMap", loginOutTime);
response.sendRedirect(request.getContextPath() + "/other/toLogin");
return super.preHandle(request, response, handler);
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
super.afterCompletion(request, response, handler, ex);
  4)在session销毁的时候,把loginUserMap中保存的键值对清除
public classSessionListener implements HttpSessionListener {
private static Logger log = Logger.getLogger(SessionListener.class);
public void sessionCreated(HttpSessionEvent event) {
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
String sessionId = session.getId();
//在session销毁的时候,把loginUserMap中保存的键值对清除
User user = (User) session.getAttribute("now_user");
if (user != null) {
Map&String, String& loginUserMap = (Map&String, String&) event.getSession().getServletContext().getAttribute("loginUserMap");
if(loginUserMap.get(user.getUserName()).equals(sessionId)){
log.info("clean user from application : " + user.getUserName());
loginUserMap.remove(user.getUserName());
event.getSession().getServletContext().setAttribute("loginUserMap", loginUserMap);
  5)web.xml
&!-- session listener 多用户登录限制,退出清除session信息的同时清除application中存放用户登录信息--&
&listener&
&listener-class&com.service.limitelogin.SessionListener&/listener-class&
&/listener&
  6)页面代码(用于给出提示的同时,清除被挤掉用户的session信息,否则提示信息会一直显示) 
&script type="text/javascript"&
$(document).ready(function () {
var message='${mess}';
if (message != "") {
type: 'GET',
async: false,
cache: false,
url: '/other/clearUserSession',
dataType: '',
success: function (data) {
$('#mess').(message);
  7)清除挤掉用户session代码
* 多用户登录限制,清除session信息(登录信息、提示信息)
* @param request
@ResponseBody
@RequestMapping(value = "/clearUserSession")
public String clearUserSession(HttpServletRequest request) {
HttpSession httpSession = request.getSession();
//httpSession.invalidate();
httpSession.removeAttribute("now_user");
httpSession.removeAttribute("mess");
return "success";
到此开发工作完成
4、运行结果
以上所述是小编给大家介绍的Java 多用户登录限制的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对云栖社区网站的支持!
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
多用户登录
多线程实现多用户登录、怎么实现多用户登录、多用户登录限制、java多用户登录、java web多用户登录,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!

我要回帖

更多关于 同一浏览器多用户登录 的文章

 

随机推荐