• Http学习之使用HttpURLConnection发送post和get请求(3)


    使用HttpURLConnection发送post和get请求

    但我们常常会碰到这样一种情况:

    通过HttpURLConnection来模拟模拟用户登录Web服务器,服务器使用cookie进行用户认证。在模拟登录时,Post表单数据后可以正确登录(登陆成功时会response一个cookie,然后redirect到main page,不成功则redirect到login page),但是在使用HttpURLConnection再次连接服务器其他页面(或者即使是当前的response里是redirect的page)时,服务器都会认为是全新的一个Session。

    解决方法有2步:

    1. 调用HttpURLConnection (send post request to login page)的setInstanceFollowRedirects()方法,参数为false (这样不会去获取redirect page)

    2. 获取HttpURLConnection send post request to login page的session id,然后在之后每一次的connection里都加上该session id

        public static String sessionId = "";  
        public static void sendLoginRequest() throws IOException {
            URL loginUrl = new URL("http://xxx");
            HttpURLConnection connection = (HttpURLConnection) loginUrl.openConnection();
      
      
            // Output to the connection. Default is
            // false, set to true because post
            // method must write something to the
            // connection
            // 设置是否向connection输出,因为这个是post请求,参数要放在
            // http正文内,因此需要设为true
            connection.setDoOutput(true);
            // Read from the connection. Default is true.
            connection.setDoInput(true);
            // Set the post method. Default is GET
            connection.setRequestMethod("POST");
            // Post cannot use caches
            // Post 请求不能使用缓存
            connection.setUseCaches(false);
      
            // This method takes effects to
            // every instances of this class.
            // URLConnection.setFollowRedirects是static函数,作用于所有的URLConnection对象。
            // connection.setFollowRedirects(true);
           
            // This methods only
            // takes effacts to this
            // instance.
            // URLConnection.setInstanceFollowRedirects是成员函数,仅作用于当前函数
            connection.setInstanceFollowRedirects(false);
           
            // Set the content type to urlencoded,
            // because we will write
            // some URL-encoded content to the
            // connection. Settings above must be set before connect!
            // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
            // 意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode
            // 进行编码
            connection.setRequestProperty("Content-Type",
                   "application/x-www-form-urlencoded");
            // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
            // 要注意的是connection.getOutputStream会隐含的进行connect。
            connection.connect();
      
            DataOutputStream out = new DataOutputStream(connection
                   .getOutputStream());
      
              // 要传的参数
            String content = URLEncoder.encode("username", "UTF-8") + "="
                   + URLEncoder.encode("XXX", "UTF-8");
            content += "&" + URLEncoder.encode("password", "UTF-8") + "="
                   + URLEncoder.encode("XXXX", "UTF-8");
      
            // DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面
            out.writeBytes(content);
      
            out.flush();
            out.close(); // flush and close
      
               //Get Session ID
            String key = "";
            if (connection != null) {
                for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) {
                   if (key.equalsIgnoreCase("set-cookie")) {
                       sessionId = connection.getHeaderField(key);
                       sessionId = sessionId.substring(0, sessionId.indexOf(";"));
                   }
                }
            }     
            connection.disconnect();
         }

    然后之后每一次connection都要加上这个session id:

    URL url = new URL("http:......");
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.setRequestProperty("Cookie",this.sessionId);
    connection.connect();
  • 相关阅读:
    win10安装vue
    通过docker安装rabbitmq
    python定时访问主机进程信息并反馈到远程服务器
    win10配置Apache+部署静态html页面
    HTTP协议—HTTP报文格式详解
    python脚本编写(纯干货)
    linux/CentOS的安装(萌新版)
    gradle中调用ant.unzip对zip包解压缩
    通过gradle运行测试脚本
    使用rest-assured测试rest service, 遇到“415 Unsupported Media Type”
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4180515.html
Copyright © 2020-2023  润新知