Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实现一个类来保持与网站的连接,每个类同时在单独的线程中?_Java_Httpclient_Apache Httpclient 4.x_Htmlunit - Fatal编程技术网

Java 如何实现一个类来保持与网站的连接,每个类同时在单独的线程中?

Java 如何实现一个类来保持与网站的连接,每个类同时在单独的线程中?,java,httpclient,apache-httpclient-4.x,htmlunit,Java,Httpclient,Apache Httpclient 4.x,Htmlunit,我正在使用java中的HTMLUnit作为访问我的网站的“浏览器” 这就是我努力实现的目标: 同时以不同的用户名登录我的网站 保持所有连接处于活动状态,并为每个用户同时向网站发出不同的授权请求 如何找到有效的解决方案 到目前为止,我有一些类“pages”(Selenium样式),它们表示网站上的独立页面,它们都是父页面类的子类。 Page类在其默认构造函数中设置所有子类继承的静态连接。此连接稍后用于访问网站上的其他URL/链接 公共抽象类页面{ 受保护的记录器; 受保护的静态连接; 公共网页()

我正在使用java中的HTMLUnit作为访问我的网站的“浏览器”

这就是我努力实现的目标:

  • 同时以不同的用户名登录我的网站
  • 保持所有连接处于活动状态,并为每个用户同时向网站发出不同的授权请求
  • 如何找到有效的解决方案

    到目前为止,我有一些类“pages”(Selenium样式),它们表示网站上的独立页面,它们都是父页面类的子类。 Page类在其默认构造函数中设置所有子类继承的静态连接。此连接稍后用于访问网站上的其他URL/链接

    公共抽象类页面{
    受保护的记录器;
    受保护的静态连接;
    公共网页(){
    connection=connection.getConnection();
    this.logger=logger.getLogger(this.getClass());
    }
    }
    
    连接类(singleton)返回单个实例,并具有登录网站的方法以及访问网站上其他URL/链接的方法

    公共类连接{
    私有静态最终记录器=Logger.getLogger(ConnectionManager.class);
    专用静态连接;
    私人厨师经理;
    专用网络客户端浏览器;
    专用连接(){
    浏览器=新的网络客户端(BrowserVersion.CHROME);
    cookieManager=browser.getCookieManager();
    cookieManager.setCookiesEnabled(true);
    }
    公共静态连接getConnection(){
    if(连接==null){
    连接=新连接();
    }
    回路连接;
    }
    公共无效登录(字符串url、字符串用户名、字符串密码){
    //加载url、获取表单、填写表单、登录……等等
    }
    …其他方法
    }
    
    然后我就这样使用它:

    Connection=Connection.getConnection();
    连接。登录(“http://somesite“,”用户名“,”密码“);
    SomePage SomePage=新建SomePage();//页面的子类
    somePage.clickSomeLink();
    等
    
    现在,如果我在单独的线程中运行它,静态连接将在所有其他使用它的线程之间共享,对吗

    那么如何让它同时工作呢


    ..我想使用连接的方法,从而在所有页面之间共享该连接,但只针对一个线程。。现在,如果这是一个糟糕的设计并且可以做得更好,我真的很高兴听到一个更好的方法。

    您不应该在线程之间共享类连接的实例,因为内嵌对象
    WebClient
    不是线程安全的,请参阅javadocs了解:

    注意:WebClient实例不是线程安全的。它的目的是 从一根线开始使用

    线程是安全的,但是为什么您希望在用户之间共享cookie呢


    基本原则是,您不应该将
    连接设置为a类,而是为每个用户/线程创建一个新的连接。

    您可能不想在用户之间共享
    网络客户端
    ——如果它存储cookie,那么它们很可能会导致会话相互干扰的问题。另外,如果
    WebClient
    不是线程安全的,您还必须进行额外的同步,以确保没有其他问题。感谢您的回复,是的,正如我在回答中所回答的,我希望每个会话有一个WebClient一个线程,只是不知道如何在不不断创建新实例的情况下在页面之间共享它。谢谢你的回复。是的,CookieManager是我的错,它不会在用户之间共享。至于WebClient,这正是我想要的,每个线程使用一个实例,所以我不必担心线程安全。但是如何将连接(WebClient)传递到其他页面?现在,如果我将其从singleton更改为public Constructor,每个新页面都将创建一个新的连接实例,从而创建WebClient。如何解决这个问题?然后不要在页面内部创建连接,只需创建一个连接并将其作为参数构造函数传递给单个用户的所有页面实例。哦,我以前怎么没有想到这一点,这正是我所需要的。谢谢!