欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

调用别人接口如何跳过登陆

程序员文章站 2024-01-10 10:12:46
...

背景

有时候在接口对接数据时,常常会碰到这样的问题,就是请求接口的时候,他没有返回你想要的数据,而是返回一个“登录界面”的html,你说蛋疼不蛋疼......

而出现这种情况是需要进行登录验证的,那么,我们该如何做呢?

实现

利用cookie跳过登录

利用Cookie跳过登录原理就是登录过一次,查看登录后的header和cookie信息,将其关键信息拿下来,然后将这些信息加入你的接口请求头信息中。

在没登录的时候,去请求这个接口肯定是拿不到数据的,所以我们就需要让其将登录的接口url提供过来

思路如下:

  1. 首先需要对方提供登录的接口url(当然得包括登录用户跟密码这些参数);
  2. 我们在从url里面获取用户登录的cookie;
  3. 有了登录cookie之后,在调用方法接口的时候,我们将cookie给塞进去
  4. 调用方法接口成功返回数据而不再是登录的html。

参数说明

  1. String cookie = conn.getHeaderField("Set-Cookie"); getHeaderField(“”)方法,及获取链接内的参数,此处获取的是cookie,注意:HttpURLConnection中的cookie命名为“Set-Cookie”

    cookie取出来的值为"JSESSIONID=xxx; Path=/xxx; HttpOnly",我们所需要的信息就是这个JSESSIONID,将其取出来

代码

  1. 获取cookie代码
public static String getJsessionId(String path,String data) throws Exception {
        URL url = new URL(path);
        //打开和url之间的连接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        
        //获取cookie
        String jsessionId = conn.getHeaderField("Set-Cookie").split(";")[0].split("=")[1].trim();
        
    	return jsessionId;
    }

 2. 接口对接数据代码

public static String interfaceUtil(String path,String data,String jsessionId) {
    	 StringBuffer sb = new StringBuffer();
        try {
        	String str = "";
            URL url = new URL(path);
            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            PrintWriter out = null;
            //请求方式
//            conn.setRequestMethod("POST");
           //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); 
            
            //利用cookie跳过拦截
            conn.setRequestProperty("Cookie", "JSESSIONID="+jsessionId); 
            
            conn.setDoOutput(true);
            conn.setDoInput(true);
            //获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            //发送请求参数即数据
            out.print(data);
            //缓冲数据
            out.flush();
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while ((str = br.readLine()) != null) {
               sb.append(str);
            }
            //关闭流
            is.close();
            
            //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
            //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

延伸

对于HttpURLConnection这个类,我们可以深入一下(因为上述获取cookie的时候也是费了不少劲,所以想详说一下)

针对于获取Header问题的两个方法

1. getHeaderFields();
2. getHeaderField();
  1. getHeaderFields()

    这个方法是HttpURLConnection获取到的所有的头参数,