【问题标题】:Programmatically close a jetty client以编程方式关闭码头客户端
【发布时间】:2019-01-21 11:05:33
【问题描述】:

我正在设置一个 jetty 客户端,用于处理 Google 的 oauth2 授权流程

com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver receiver =
                new LocalServerReceiver.Builder().setHost(redirect_host).setPort(redirect_port).build();

如果之前的授权流程失败并且让码头客户端保持打开状态,这将失败

INFO [log:131] jetty-6.1.26
WARN [log:265] failed SocketConnector@180.200.105.100:8085: java.net.BindException: Address already in use
WARN [log:265] failed Server@32c65328: java.net.BindException: Address already in use

请注意,我使用的是固定网址和端口

有什么方法可以以编程方式检查码头客户端是否已经打开,并处理这种情况,例如关闭之前的码头连接? p>

【问题讨论】:

    标签: java oauth-2.0 jetty google-oauth


    【解决方案1】:

    我在使用 google api 连接 youtube 服务时遇到了类似的情况,连接也是基于码头客户端的。

    我通过将我的 localServerReceiver 对象放在一个默认值为“null”的静态类(老实说,是一个单例 Spring Bean)中来解决,在第一次尝试连接时,它创建一个新实例并将其存储在静态类属性。

    在此之后,在任何新的尝试连接之前,我都会调用方法 localServerReceiver.stop() 来取消之前的任何连接。

    类似这样的:

    public class LocaServerReceiverRetriever{
    
    private static LocalServerReceiver localServerReceiver = null;
    
    public static LocalServerReceiver getLocalServerReceiver(){
        if(localServerReceiver == null){
            localServerReceiver = new LocalServerReceiver.Builder().setPort(9001).build();
        }else{
            localServerReceiver.stop();
            localServerReceiver = new LocalServerReceiver.Builder().setPort(9001).build();
        }
        return localServerReceiver ;
    }
    

    }

    然后调用“LocaServerReceiverRetriever.getLocalServerReceiver();”哪里需要。

    它对我有用。 祝你好运

    【讨论】:

    • 感谢分享!您认为这适用于具有多个用户/会话和多个授权请求的 WebApp 吗?
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2018-09-08
    相关资源
    最近更新 更多