如何在同一会话中点击多个URL并在java中使用一个身份验证

时间:2017-06-14 12:47:31

标签: java rest session authentication

我必须打一个休息网址,在此之前我通过传递用户名/密码来登录另一个用于登录目的的网址。我从第一个网址得到200 OK。现在,当我尝试使用另一个REST URL时,它给我401错误。代码如下"

    String urlParameters  = "username=a&password=b&rememberme=false";
    byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
    int    postDataLength = postData.length;
    URL url = new URL("myloginurl");
    HttpURLConnection  con = (HttpURLConnection) url.openConnection();
    con.setDoOutput(true);
    con.setRequestMethod("POST");
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    con.setRequestProperty("charset", "UTF-8");
    con.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
    con.setUseCaches( false );
    try( DataOutputStream wr = new DataOutputStream( con.getOutputStream())) {
       wr.write( postData );
    }
    int respCode = con.getResponseCode();
    if(respCode==200){
        urlParameters = "id=x&col1=y&op1=z&val1=t";
        postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
        postDataLength = postData.length;
        url = new URL("myanotherurl");
        con.setDoOutput(true);
        con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        con.setRequestProperty("charset", "UTF-8");
        con.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
        con.setUseCaches( false );
        try( DataOutputStream wr = new DataOutputStream( con.getOutputStream())) {
            wr.write( postData );
        }
        System.out.println(con.getResponseCode());
    }

任何人都可以指出我在做错的地方。另请告诉我有没有更好的方法来编写此代码。

由于

1 个答案:

答案 0 :(得分:0)

服务器应在第一个请求中以新cookie的形式返回会话ID。您必须在第二个请求中包含该cookie,以便服务器可以识别您的身份。 Cookie在http标头中发送。

从第一个请求获得响应代码后,您可以获取新的cookie值,如:

  String cookieValue = con.getHeaderFields()
    .getOrDefault("Set-Cookie", Collections.emptyList())
    .stream()
    .map(str -> str.split(";")[0])
    .collect(joining("; "));

然后在下一个请求中使用该值作为cookie:

 con.setRequestProperty("Cookie", cookieValue);