【问题标题】:How to handle set-cookie Header in SignalR java Client?如何在 SignalR java 客户端中处理 set-cookie 标头?
【发布时间】:2023-03-28 14:43:01
【问题描述】:

我在 android 中使用 SignalR java 客户端和 .net core3 作为我的 web 服务。 我在来自 webservice 的响应中配置了一个 set-cookie 标头以防止 DDOS attacks ,但现在我无法连接到我的集线器,因为SignalR java 客户端中没有选项来处理 set-cookie 标头。 我该如何解决这个问题?

【问题讨论】:

  • 安装 cookie 管理器:CookieHandler.setDefault(new CookieManager())。然后 Java 会为你处理。

标签: java android .net-core signalr


【解决方案1】:

经过大量搜索后,我来到了这个:

   hubConnection = HubConnectionBuilder.create(HUB_URL).withHandshakeResponseTimeout(60000).withHeaders(mapHeader).setHttpClientBuilderCallback(param1 -> {
                        param1.addInterceptor(new ApiClient.ReceivedCookiesInterceptor(G.context));
                        param1.addInterceptor(new ApiClient.AddCookiesInterceptor(G.context));
                    }).withTransport(TransportEnum.ALL).withAccessTokenProvider(Single.defer(() -> Single.just("An Access Token"))).build();

(setHttpClientBuilderCallback) 会给我一个配置生成器,我可以用它来处理来自响应的setcookie

这是我的ReceivedCookiesInterceptor

 public static class ReceivedCookiesInterceptor implements Interceptor {
        private Context context;

        public ReceivedCookiesInterceptor(Context context) {
            this.context = context;
        }

        @Override
        public Response intercept(Chain chain) throws IOException {
            Response originalResponse = chain.proceed(chain.request());
            if (!originalResponse.headers("Set-Cookie").isEmpty()) {
                Log.i("HubLogin", "intercept: "+originalResponse.headers("Set-Cookie"));
                HashSet<String> cookies = (HashSet<String>) PreferenceManager.getDefaultSharedPreferences(context).getStringSet("PREF_COOKIES", new HashSet<String>());

                for (String header : originalResponse.headers("Set-Cookie")) {
                    cookies.add(header);
                }

                SharedPreferences.Editor memes = PreferenceManager.getDefaultSharedPreferences(context).edit();
                memes.putStringSet("PREF_COOKIES", cookies).apply();
                memes.apply();
            }

            return originalResponse;
        }
    }

这是我的AddCookiesInterceptor:

public static class AddCookiesInterceptor implements Interceptor {
    public static final String PREF_COOKIES = "PREF_COOKIES";
    private Context context;
    public AddCookiesInterceptor(Context context ) {
        this.context = context;
    }

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();

        HashSet<String> preferences = (HashSet<String>) PreferenceManager.getDefaultSharedPreferences(context).getStringSet(PREF_COOKIES, new HashSet<>());

        for (String cookie : preferences) {
            builder.addHeader("Cookie", cookie);
        }
        return chain.proceed(builder.build());
    }
}

【讨论】:

    猜你喜欢
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2014-10-16
    相关资源
    最近更新 更多