首页 > 解决方案 > 在多个登录的 Web 用户之间分隔变量的值

问题描述

我在我的jsp页面中制作了一个进度条,显示了[上传excel文件->将数据从excel文件中提取到java变量->使用这些变量,创建.mp4文件->创建文件后,插入数据库]

我之前的做法是:

在 serviceImpl 中声明私有字符串 xxxx 并在那里制作 getter/setter,并从控制器中使用

serviceImpl.getVARIABLE(); 

(这在 jsp 中作为 ajax 使用,有间隔)

有效。但是只有当登录用户是单数时它才能正常工作。

如果有 2 个用户同时登录,上传不同的文件,例如进度条必须看起来像

但不是那样,变量得到了同步并且像

并且进度出现错误,它在没有完成工作的情况下完成了该方法。

我意识到它非常明显,我的代码非常愚蠢,因为我只是在 serviceImpl 字段中声明了变量并继续使用 setter/getter。

所以我从 serviceImpl 中删除了声明的变量并添加HttpSession session了方法,使用

session.setAttribute("xxx", xxx);

并从控制器中获取变量的值

session.getAttribute("xxx");

它只与一个用户再次合作。我花了一整天的时间来改变它,当它不起作用时,我终于意识到它也很明显。session.setAttribute原因 当我的代码都登录时,我的代码怎么知道我 的会话来自用户 A 或 B....

所以我面临着一堵墙,我来寻求帮助。我应该如何区分用户 A 和 B 之间的变量?

控制器:

内部方法A:

 a = (int) session.getAttribute("currentStateCount");
 b = (int) session.getAttribute("totalRowCount");

服务实现:

内部方法B:

 session.setAttribute("currentStateCount", 12+);

内部方法C:

  session.setAttribute("totalRowCount", total);

我应该如何使用我的代码来防止变量在不同用户之间同步?如果我的问题或我的 java 技能太愚蠢,我很抱歉.. 也很抱歉英语不好。请帮帮我,谢谢。


你好,我刚刚意识到这不是我的进度条的问题。

我从 serviceImpl 上传、提取、插入文件的方法一次不支持两个文件。

当用户A正在上传文件并且用户B在中间开始上传时,它不会接受用户B,它会等待用户A完成并向用户B发送JDBC连接错误。所以最后只有第一个开始文件上传的人会工作。好伤心,请问有什么办法可以解决吗??

标签: javaspring

解决方案


这个问题看起来与ServiceImpl一次只处理一个项目的实现有关。

从那时起,我看到了三个解决方案:

  1. 在 ServiceImpl 上添加一个“isBusy()”并拒绝新请求,直到处理完现有请求。不是真正的用户友好,但实施起来应该不会太难
  2. 将 ServiceImpl 的范围更改为具有多个实例。会话范围应该可以解决部分问题,但您仍然必须管理同一会话中的同一用户可以提交多个文件的事实。使用现在更有意义的解决方案 1 可以禁止使用 :)
  3. 改进 ServiceImpl 以管理许多文件(最好对其进行限制,因此在此处再次使用解决方案 1 会很好:))但是您需要更新方法以指定您想要反馈的文件/结果

如果没有更多关于 ServiceImpl 的详细信息,就很难为这些解决方案提供示例并确认哪一个实际上是最好的。

编辑:在您的 ServiceImpl 中添加一个关于我期望的骨架示例,其中实现了解决方案 3。

import java.io.File;
import java.util.HashMap;
import java.util.Map;

class Scratch {
    public interface Worker{
        public void process(File file);
        public int getStatus();
        public int getTotal();
    }

    public class ServiceImpl{
        Map<File, Worker> workers = new HashMap<>();
        private static final int MAX = 10;

        public void process(File file){
            if(workers.size() < MAX) {
                Worker worker = null; // replace by actual implementation :)
                workers.put(file, worker);
            }else{
                throw new ArrayIndexOutOfBoundsException("max number of simultaneous operations reached, try again later");
            }
        }

        public int getStatus(File f){
            return workers.get(f).getStatus();
        }

        public int getTotal(File f){
            return workers.get(f).getTotal();
        }

        public void clean(File f){
            Worker worker = workers.get(f);
            if(worker.getStatus() == worker.getTotal()){
                workers.remove(worker);
            }else{
                throw new UnsupportedOperationException("process is not over, cannot clean it");
            }
        }


    }
}

推荐阅读