투케이2K

779. (Android/Java) [유틸 파일] requestGetSslCertificateDownloadHttp : 웹뷰 로드 및 ssl 인증서 다운로드 수행 본문

Android

779. (Android/Java) [유틸 파일] requestGetSslCertificateDownloadHttp : 웹뷰 로드 및 ssl 인증서 다운로드 수행

투케이2K 2024. 4. 23. 20:13

[개발 환경 설정]

개발 툴 : AndroidStudio

 

[소스 코드]

 

    // -----------------------------------------------------------------------------------------
    // TODO [SEARCH FAST] : [GET] : [SslCertificate] : [HTTP] : requestGetSslCertificateDownloadHttp
    // -----------------------------------------------------------------------------------------
    // TODO [호출 방법 소스 코드]
    // -----------------------------------------------------------------------------------------
    // TODO [참고 및 로직 동작] :
    // TODO [1] : HTTPS 특정 주소 웹뷰를 사용해 로드 수행
    // TODO [2] : 정상 로드 완료 시 SslCertificate 인증서 다운로드 수행
    // TODO <uses-permission android:name="android.permission.INTERNET" />
    // -----------------------------------------------------------------------------------------
    /*
    try {

        // [URL 주소 선언]
        String url = "https://naver.com";

        // [헤더 선언]
        Map<String, Object> header = new HashMap<>();

        // [http 요청 수행]
        N_AsyncHttp.requestGetSslCertificateDownloadHttp(A_Webview.this, "SSL 인증서 다운로드 수행", url, header) // [http 요청]
                .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
                .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
                .subscribe(new Observer<SslCertificate>() { // [Observable.create 타입 지정]
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                    }

                    @Override
                    public void onNext(@NonNull SslCertificate value) {
                        S_Log._W_("SSL 인증서 다운 로드 결과 :: onNext", new String[]{String.valueOf(value)});
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        S_Log._W_("SSL 인증서 다운 로드 결과 :: onError :: " + String.valueOf(e.getMessage()), null);
                    }

                    @Override
                    public void onComplete() {
                    }
                });

    }
    catch (Exception e){
        S_Log._printStackTrace_(null, S_FinalMsg.LOG_BUG_STATE, null, e);
    }
    // */
    // -----------------------------------------------------------------------------------------
    public static Observable<SslCertificate> requestGetSslCertificateDownloadHttp(Context mContext, String tag, String url, Map header){

        // [로직 처리 실시]
        return Observable.create(subscriber -> {

            try {

                // ------------------------------------------------------
                // TODO [URL 변수 선언 실시]
                // ------------------------------------------------------
                String urlData = String.valueOf(url);

                if (C_Util.stringNotNull(urlData) == false) {
                    S_Log._F_(mContext, "requestGetSslCertificateDownloadHttp :: [Error] :: URL Data Is Null", null);

                    subscriber.onError(new Throwable("[Error] :: URL Data Is Null"));
                    subscriber.onComplete();
                    return;

                }
                // ------------------------------------------------------


                // ------------------------------------------------------
                // TODO [HTTPS 포함 체크 실시]
                // ------------------------------------------------------
                if (urlData.startsWith("https") == false) {
                    S_Log._F_(mContext, "requestGetSslCertificateDownloadHttp :: [Error] :: Url StartsWith Https Need", null);

                    subscriber.onError(new Throwable("[Error] :: Url StartsWith Https Need"));
                    subscriber.onComplete();
                    return;

                }
                // ------------------------------------------------------


                // ------------------------------------------------------
                // TODO [요청 로그 출력 실시]
                // ------------------------------------------------------
                S_Log._F_(mContext, "requestGetSslCertificateDownloadHttp :: SSL 인증서 다운로드 수행 실시", new String[] {
                        "TAG :: " + String.valueOf(tag),
                        "URL :: " + String.valueOf(urlData),
                        "HEADER :: " + String.valueOf(header)
                });
                // ------------------------------------------------------


                // ------------------------------------------------------
                // TODO [웹뷰 생성 및 기본 값 지정 수행]
                // ------------------------------------------------------
                final WebView mWebview = new WebView( mContext );
                mWebview.clearCache(true); // [디스크 및 쿠키 데이터 모두 지움]
                mWebview.clearHistory(); // [웹뷰 히스토리 지움]
                mWebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); // [웹뷰 로드 캐시 모드 지정]
                mWebview.getSettings().setJavaScriptEnabled(true); // [자바스크립트 허용]

                mWebview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); // [자바스크립트 윈도우 오픈 허용]
                mWebview.getSettings().setDomStorageEnabled(true); // [자바스크립트 웹 스토리지 허용]
                mWebview.getSettings().setMediaPlaybackRequiresUserGesture(false); // [비디오 자동 재생 지원 설정]
                mWebview.getSettings().setDefaultTextEncodingName("UTF-8"); // [인코딩 설정]

                if(Build.VERSION.SDK_INT >= 21) {
                    mWebview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // [HTTPS 이미지 표시]
                }

                // [스케일 확대, 축소 관련]
                mWebview.setInitialScale(8);
                mWebview.scrollTo(0,0);
                mWebview.getSettings().setLoadWithOverviewMode(true);
                mWebview.getSettings().setUseWideViewPort(true);
                mWebview.getSettings().setBuiltInZoomControls(true);
                mWebview.getSettings().setSupportZoom(true);
                mWebview.getSettings().setDisplayZoomControls(false);
                // ------------------------------------------------------


                // ------------------------------------------------------
                // TODO [웹뷰 클라이언트 지정]
                // ------------------------------------------------------
                final boolean[] errorFlag = {false};
                
                mWebview.setWebViewClient(new WebViewClient(){
                    // [로딩이 시작될 때]
                    @Override
                    public void onPageStarted(WebView view, String url, Bitmap favicon) {
                        super.onPageStarted(view, url, favicon);
                        S_Log._W_(S_FinalMsg.LOG_Loading_Start, new String[]{ "URL :: " + String.valueOf(url) });
                    }
                    // [로딩이 완료됐을 때 한번 호출]
                    @Override
                    public void onPageFinished(WebView view, String url) {
                        super.onPageFinished(view, url);
                        S_Log._W_(S_FinalMsg.LOG_Loading_End, new String[]{ "URL :: " + String.valueOf(url) });

                        // TODO [웹뷰 인증서 반환 수행]
                        try {
                            if (errorFlag[0] == false){ // [정상 로드 된 경우 만]
                                
                                // [SSL 인증서 확인]
                                SslCertificate sslCertificate = view.getCertificate();

                                // [리턴 반환]
                                subscriber.onNext(sslCertificate);
                                subscriber.onComplete();
                                return;
                            }
                        }
                        catch (Exception e){
                            subscriber.onError(new Throwable("[Exception] :: [onPageFinished] :: " + String.valueOf(e.getMessage())));
                            subscriber.onComplete();
                            return;
                        }

                    }
                    // [SSL 인증서 에러]
                    @Override
                    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
                        // [E/chromium: [ERROR:ssl_client_socket_impl.cc 에러 해결 위함]
                        S_Log._E_(S_FinalMsg.LOG_Error_State, new String[]{
                                "TIME :: " + S_FinalMsg.LOG_NOW(),
                                "URL :: " + String.valueOf(view.getUrl()),
                                "Error Sort :: " + "onReceivedSslError",
                                "Error Description :: " + "http 요청 SSL 인증서 에러"
                        });

                        // [플래그 값 변경]
                        errorFlag[0] = true;

                        // [리턴 반환]
                        subscriber.onError(new Throwable("[Error] :: [onReceivedSslError] :: http 요청 SSL 인증서 에러"));
                        subscriber.onComplete();
                        return;
                    }
                    // [오류가 났을 경우 응답 콜백 부분]
                    @Override
                    public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                        S_Log._E_(S_FinalMsg.LOG_Error_State, new String[]{
                                "TIME :: " + S_FinalMsg.LOG_NOW(),
                                "URL :: " + String.valueOf(view.getUrl()),
                                "Error Sort :: " + "onReceivedHttpError",
                                "Error Description :: " + "Http 통신 에러",
                                "Error Code :: " + String.valueOf(errorResponse.getStatusCode()),
                                "Error Header :: " + String.valueOf(errorResponse.getResponseHeaders()),
                                "Error Response :: " + String.valueOf(errorResponse.getData())
                        });

                        // [플래그 값 변경]
                        errorFlag[0] = true;

                        // [리턴 반환]
                        subscriber.onError(new Throwable("[Error] :: [onReceivedHttpError] :: Http 통신 에러"));
                        subscriber.onComplete();
                        return;
                    }
                });
                // ------------------------------------------------------


                // ------------------------------------------------------
                // TODO [웹뷰 로그 수행]
                // ------------------------------------------------------
                mWebview.loadUrl(urlData);
                // ------------------------------------------------------

            } catch (final Exception e){
                // ------------------------------------------------------
                // [로그 출력]
                // ------------------------------------------------------
                S_Log._printStackTrace_(mContext, S_FinalMsg.LOG_BUG_STATE, new String[] {
                        "requestGetSslCertificateDownloadHttp :: SSL 인증서 다운로드 [EXCEPTION] 확인",
                        "TAG :: " + String.valueOf(tag),
                        "EXCEPTION :: " + String.valueOf(e.getMessage())
                }, e);
                // ------------------------------------------------------


                // ------------------------------------------------------
                // TODO [리턴 데이터 반환]
                // ------------------------------------------------------
                try {
                    subscriber.onError(new Throwable("[EXCEPTION] : [requestGetSslCertificateDownloadHttp] : " + String.valueOf(e.getMessage())));
                }
                catch (Exception ex){
                    ex.printStackTrace();
                }
                // ------------------------------------------------------
            }

        });
    }

 

반응형
Comments