안 드 로 이 드 는 OkHttp 를 사용 하여 방향 을 바 꾸 어 차단 처리 하 는 방법

인터넷 에는 OkHttp 의 튜 토리 얼 이 많 지만 OkHttp 처리 의 방향 을 바 꾸 는 방법 에 관 한 것 은 하나 도 없다.여기 서 재 설정 을 처리 하 는 것 은 재 설정 요 구 를 차단 한 다음 에 우 리 는 스스로 방향 을 바 꾼 웹 페이지 를 요청 한 다음 에 Jsoup 을 통 해 자신 이 필요 로 하 는 웹 페이지 데 이 터 를 분석 하 는 것 이다.예 를 들 어 저 희 는 사용자 의 로그 인 을 모 의 한 다음 에 로그 인 후 뛰 어 넘 는 웹 페이지 의 내용 을 분석 해 달라 고 요청 합 니 다.왜 이런 걸 만들어 요?예 를 들 어 교과 과정 표 의 성적 검사 기능 은 이런 방법 으로 성적 을 얻 을 수 있다.
대략적인 원 리 는 어 떻 습 니까?
먼저 브 라 우 저 는 사용자 로그 인 을 어떻게 하 는 지 알려 드 리 겠 습 니 다.브 라 우 저 는 당신 이 입력 한 계 정과 비밀 번 호 를 POST 요청 을 통 해 가 져 갈 것 입 니 다.물론 다른 필드 도 있 을 수 있 습 니 다.이 POST 요청 은 우리 웹 페이지 와 서버 가 규정 한 것 이기 때 문 입 니 다.로그 인 에 성공 하면 서버 는 Set-Cookie 요청 헤더 필드 를 되 돌려 줍 니 다.Cookie 브 라 우 저가 있 으 면 GET 를 통 해 로그 인 한 웹 페이지 에 접근 할 수 있 습 니 다.이 Cookie 가 없 으 면 로그 인 한 웹 페이지 를 요청 할 수 없 음 을 주의 하 십시오.GET 요청 은 Cookie 요청 헤더 필드 를 설정 하여 서버 가 돌아 온 Cookie 를 가 져 가 야 합 니 다.
브 라 우 저의 행동 을 알 게 된 후에 우 리 는 해 야 할 절차 가 4 단계 라 는 것 을 알 게 되 었 다.
4.567917.스스로 POST 요청 을 하고 자동 으로 방향 을 바 꾸 지 못 하 게 합 니 다.
  • POST 요청 에 대한 응답 을 받 고 해당 하 는 Set-Cookie 필드 의 내용 을 가 져 옵 니 다
  • 해당 내용 을 GET 요청 의 Cookie 요청 헤더 필드 에 추가 한 다음 GET 요청 을 합 니 다
  • 얻 은 GET 요청 의 응답 체 는 바로 우리 가 로그 인 한 웹 페이지 의 내용 입 니 다.정적 웹 페이지 라면 Jsoup 을 통 해 자신 이 원 하 는 정 보 를 분석 할 수 있 습 니 다
  • 캡 처 나 Chorme 브 라 우 저 에서 가 져 온 요청 기능 을 통 해 POST 가 제출 한 폼 이 어떤 지 확인 해 야 합 니 다.Chorme F12 누 르 면 돼 요.

    계 정 비밀 번 호 를 입력 하고 로그 인 을 클릭 하면 됩 니 다.

    로그 인 을 클릭 하면 제어 판 에 방문 기록 이 한 무더기 나 타 났 습 니 다.첫 번 째 는 우리 가 찾 는 것 입 니 다.첫 번 째 Status 표 지 는 302 이 고 302 는 방향 을 바 꾸 는 것 입 니 다.우 리 는(pass.asp)이 요청 을 클릭 하고 POST 요청 헤드 를 봅 니 다(Headers 클릭).

    우 리 는 Set-Cookie 필드 를 보 았 습 니 다.필드 에 대응 하 는 내용 은 우리 가 GET 요청 을 휴대 해 야 하 는 것 입 니 다.

    또한 POST 가 제출 한 폼 내용 을 볼 수 있 습 니 다.일부 사이트 의 제출 매개 변 수 는 암호 화 되 어 있 습 니 다.일반적인 것 을 하려 면 암호 화 하 는 방법 을 찾 아 똑 같은 암호 화 처 리 를 해 야 합 니 다.
    이제 OkHttp 로 작업 을 진행 해 보도 록 하 겠 습 니 다.
    OkHttp 는 쿠키 를 자동 으로 가지 고 요청 하 는 기능 을 제공 하기 때문에 편리 하 게 처리 할 수 있 습 니 다.
    
    final OkHttpClient client = new OkHttpClient().newBuilder()
            .followRedirects(false) //  OkHttp      ,         
            .followSslRedirects(false)
            .cookieJar(new LocalCookieJar())  // OkHttp      Cookie   
            .build();
    
    //CookieJar     Cookie 
    class LocalCookieJar implements CookieJar{
      List<Cookie> cookies;
      @Override
      public List<Cookie> loadForRequest(HttpUrl arg0) {
         if (cookies != null)
            return cookies;
          return new ArrayList<Cookie>();
      }
    
      @Override
      public void saveFromResponse(HttpUrl arg0, List<Cookie> cookies) {
        this.cookies = cookies;
      }
      
    }
    
    
    왜 CookieJar 를 설치 하면 자동 으로 Cookie 를 휴대 할 수 있 습 니까?OkHttp 소스 코드 보 여 드릴 게 요.
    
    /**
      * Populates request with defaults and cookies.
      *
      * <p>This client doesn't specify a default {@code Accept} header because it doesn't know what
      * content types the application is interested in.
      */
     private Request networkRequest(Request request) throws IOException {
      Request.Builder result = request.newBuilder();
    
      //  CookieJar Cookie   ,   Cookie  
      List<Cookie> cookies = client.cookieJar().loadForRequest(request.url());
      if (!cookies.isEmpty()) {
       result.header("Cookie", cookieHeader(cookies));
      }
    
      return result.build();
     }
    
    
    그래서 이제 저희 가 POST 요청 을 하 게 되 었 습 니 다.
    
        final OkHttpClient client = new OkHttpClient().newBuilder()
            .followRedirects(false)
            .followSslRedirects(false)
            .cookieJar(new LocalCookieJar())
            .build();
        //    POST  
        RequestBody body = new FormBody.Builder().add("UserStyle", "student")
            .add("user", "xxx").add("password", "xxx").build();
            
        Request request = new Request.Builder().url("http://222.195.8.201/pass.asp").post(body).build();
        
        client.newCall(request).enqueue(new Callback() {
          
          @Override
          public void onResponse(Call call, Response response) throws IOException {
            /**
             *     CookieJar,            Set-Cookie  ,      addHeader("Cookie", cookie)
             *   Cookie   
             */
    //       List<String> cookies = response.headers("Set-Cookie");
    //       String cookie = "";
    //       for(int i=cookies.size()-1; i>=0; i--){
    //         cookie = cookie+ cookies.get(i).replace("path=/", "") + " ";
    //       }
            
            // GET  
            Request redirectRequest = new Request.Builder().url("http://222.195.8.201/student/asp/Select_Success.asp")
    //          .addHeader("Cookie", cookie)
               .build();
            //               
            Response response2 = client.newCall(redirectRequest).execute();
            String result = response2.body().string();
            System.out.println(result);
          }
          
          @Override
          public void onFailure(Call arg0, IOException arg1) {
            
          }
        });
    
    내용 을 받 으 면 스스로 내용 의 해석 과 전 시 를 할 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기