我是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服务器响应我想要的数据吗? 或者我完全错了我在做什么?
我在互联网上搜索了很多,但我无法找到解决方案; - (
(当然,因为我不知道怎么做,而且我不知道要搜索什么) 谢谢你的帮助!