Notice
Recent Posts
Recent Comments
Link
투케이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();
}
// ------------------------------------------------------
}
});
}
반응형
'Android' 카테고리의 다른 글
Comments