Java发布请求到Django服务器 - > 403错误代码

时间:2015-11-26 15:41:07

标签: java django cookies

我是Java的新手,我有一个小项目作为学习任务。 第一部分很简单,但现在我卡住了。

我希望通过Java中的帖子请求获取网站的一些信息。 但棘手的部分是crsf保护,我不知道如何处理它,因为如果我尝试发出POST请求,我会得到错误代码: 服务器返回HTTP响应代码:403为URL:http://v1stats.desy.de:8080

有人告诉我,我必须通过获取请求获取csrf-token并使用此令牌进行发布请求,告诉保护系统我不是机器人。

所以我这样做了:

URL url = new URL(http://v1stats.desy.de:8080);
        try {

                URLConnection conn = url.openConnection();
                Map<String, List<String>> map = conn.getHeaderFields();

                for (Map.Entry entry : map.entrySet()) {
                    System.out.println(entry.getKey() + ": " + entry.getValue());
                }

                token = map.get("Set-Cookie").toString();
                token = (String) token.subSequence(1, token.indexOf(";"));

            } catch (Exception e) {
                e.printStackTrace();
            }

结果是:

X-Frame-Options: [SAMEORIGIN]
null: [HTTP/1.0 200 OK]
Server: [WSGIServer/0.1 Python/2.7.6]
Set-Cookie: [csrftoken=IzUo1yexx5scFLroXOIKAhf56wHDFUMg; expires=Thu, 24-Nov-2016 14:39:10 GMT; Max-Age=31449600; Path=/]
Vary: [Cookie]
Date: [Thu, 26 Nov 2015 14:39:10 GMT]
Content-Type: [text/html; charset=utf-8]

之后,我有了令牌。

我的POST请求代码是:

Map<String,Object> params = new LinkedHashMap<>();

     params.put("start", "27/10/2015");
     params.put("end", "27/10/2015");
     params.put("room", "Basketballfeld");
     params.put("organizer", "");
     params.put("eventname", "");
     params.put("description", "");

     StringBuilder postData = new StringBuilder();
     for (Map.Entry<String,Object> param : params.entrySet()) {
         if (postData.length() != 0) 
             postData.append('&');
         postData.append(URLEncoder.encode(param.getKey(), "UTF-8") + "=");           
         postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
     }

     System.out.println(postData);
     byte[] postDataBytes = postData.toString().getBytes("UTF-8");

     HttpURLConnection conn = (HttpURLConnection)url.openConnection();

     conn.setRequestMethod("POST");
     conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
     conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
     conn.setDoOutput(true);
     conn.getOutputStream().write(postDataBytes);

     Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

postData锁定如下:

start=27%2F10%2F2015&end=27%2F10%2F2015&room=Basketballfeld&organizer=&eventname=&description=

有人可以告诉我我要做什么,发送带有请求的crsf令牌以确保Django服务器响应我想要的数据吗? 或者我完全错了我在做什么?

我在互联网上搜索了很多,但我无法找到解决方案; - (

(当然,因为我不知道怎么做,而且我不知道要搜索什么) 谢谢你的帮助!

0 个答案:

没有答案