http url을 https url로 리다이렉트 하기(with. shouldOverrideUrlLoading)

지프치프·2023년 5월 13일
0

Android

목록 보기
66/85
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

QR코드를 스캔하여 웹뷰에 페이지를 띄워주는 앱을 만들고 있었다.
근데 http url인 녀석들이 골머리를 썩게하곤 했는데
간단하게 AndoridManifest에서 평문(clearText)를 허용해주면 되겠지만
보안이 취약한 http를 기본적으로 제한한다는 Android의 정책을 따르고자
http url를 https url로 리다이렉트 하기로 했다.

요즘은 대게 http url로 페이지를 요청하면 서버에서 https url로 리다이렉트 시켜주지만 Android는 WebCleint에서 서버로 요청하기도 전에
에러페이지와 함께 차단해버리니 직접 https url로 변환해서 리다이렉트 해주는 방법 밖에 없었다.

코드

사실 그냥 url에서 'http' 부분을 'https'로 바꿔주기만 하면 된다.
참고로 QR코드는 Zxing을 사용했다.

필자는 https로 바꿔주는 코드를 String의 확장함수로 정의했다.

fun String.replaceHttp() : String {
    val tempUrl = this.substring(4, length)
    return "https".plus(tempUrl)
}

지금 생각해보니 replace를 쓰면 되는데 왜 subString을 썼지?

그리고 WebViewClient에서 사용해주면 되겠다.

    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
        Log.e("onShouldOverrideUrlLoading()")

        return if (view?.url?.startsWith("http://") == true) {
            view.url?.replaceHttp()?.let { view.loadUrl(it) }
            true
        }
        else false
    }

shouldOverrideUrlLoading?

WebViewClient에서는 shouldOverrideUrlLoading이라는 메소드를 제공한다. Android Developer에선 아래와 같이 설명하고 있다.

Give the host application a chance to take control when a URL is about to be loaded in the current WebView. If a WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the URL. If a WebViewClient is provided, returning true causes the current WebView to abort loading the URL, while returning false causes the WebView to continue loading the URL as usual.

WebView에 url이 로드될 때 앱에서 컨트롤 할 기회를 제공하는 메소드라고 한다. onPageStarted()가 실행되기 전에 호출되기 때문에
페이지 로딩을 시작하기 전에 호출되어 url이나 request를 제어할 수 있는 메소드라고 볼 수 있다.
그래서 http url로 페이지 로드를 시작하기 전에 https url로 바꿔서
리다이렉트 할 수 있는 것이다.

반환값으로 Boolean을 반환하는데

  • true를 반환할 경우 url 로딩을 중단한다.
  • false를 반환할 경우 url 로딩을 계속한다.

필자의 경우 url을 replace해서 webView.loadUrl()를 호출하여 로드를 다시 시작하기 때문에 true를 반환해서 기존 로딩을 중단하였다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글