java发送java http post请求求 如何修改referer或者origin的值

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
看了leetcode提交代码的接口,想模拟提交过程,但把从浏览器看到的所有头部都发过去了还是返回405.接口是相关请求header是(去除cookie后)
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,q=0.8,q=0.6
Connection:keep-alive
Content-Length:177
Content-Type:application/charset=UTF-8
Cookie:PHPSESSID=; csrftoken=; _ga=GA1.2..; __atuvc=4%7C18%2C22%7C19%2C12%7C20
Referer:/problems/longest-common-prefix/
User-Agent:Mozilla/5.0 (L Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36
X-CSRFToken:WWVGhawGNjGhzCUlYA3YDzKN0kxfEhoN
X-Requested-With:XMLHttpRequest
用jsoup和postmen把全部参数都发送了还是不成功, 一直返回405. 请问这是某种反爬虫措施还是我哪里有错?尝试了get和post都不行
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
问题解决, 但是没有找到解决方法.确定请求方法是post, 跟换请求库为Okhttp 3.0后请求成功(返回200), 但是数据乱码, 把header里面相关请求类型, 压缩类型(encoding, content-type)等删除后获取成功.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这里有你想要的答案:
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App为了防止CSRF的攻击,我们建议修改浏览器在发送POST请求的时候加上一个Origin字段,这个Origin字段主要是用来标识出最初请求是从哪里发起的。如果浏览器不能确定源在哪里,那么在发送的请求里面Origin字段的值就为空。隐私方面:这种Origin字段的方式比Referer更人性化,因为它尊重了用户的隐私。1、Origin字段里只包含是谁发起的请求,并没有其他信息 (通常情况下是方案,主机和活动文档URL的端口)。跟Referer不一样的是,Origin字段并没有包含涉及到用户隐私的URL路径和请求内容,这个尤其重要。2、Origin字段只存在于POST请求,而Referer则存在于所有类型的请求。随便点击一个超链接(比如从搜索列表里或者企业intranet),并不会发送Origin字段,这样可以防止敏感信息的以外泄露。在应对隐私问题方面,Origin字段的方法可能更能迎合用户的口味。服务端要做的:用Origin字段的方法来防御CSRF攻击的时候,网站需要做到以下几点:1、在所有能改变状态的请求里,包括登陆请求,都必须使用POST方法。对于一些特定的能改变状态的GET请求必须要拒绝,这是为了对抗上文中提到过的论坛张贴的那种危害类型。2、对于那些有Origin字段但是值并不是我们希望的(包括值为空)请求,服务器要一律拒绝。比如,服务器可以拒绝一切Origin字段为外站的请求。安全性分析:虽然Origin字段的设计非常简单,但是用它来防御CSRF攻击可以起到很好的作用。1、去掉Origin字段。由于支持这种方法的浏览器在每次POST请求的时候都会带上源header,那么网站就可以通过查看是否存在这种Origin字段来确定请求是否是由支持这种方法的浏览器发起的。这种设计能有效防止攻击者将一个支持这种方法的浏览器改变成不支持这种方法的浏览器,因为即使你改变浏览器去掉了Origin字段,Origin字段还是存在,只不过值变为空了。这跟Referer很不一样,因为Referer 只要是在请求里去掉了,那服务器就探测不到了。2、DNS重新绑定。在现有的浏览器里面,对于同站的XMLHttpRequests,Origin字段可以被伪造。只依赖网络连接进行身份验证的网站应当使用在第2章里提到的DNS重新绑定的方法,比如验证header里的Host字段。在使用Origin字段来防御CSRF攻击的时候,也需要用到DNS重新绑定的方法,他们是相辅相成的。当然对于在第四章里提到的CSRF防御方法,也需要用到DNS重新绑定的方法。3、插件。如果网站根据crossdomain.xml准备接受一个跨站HTTP请求的时候,攻击者可以在请求里用Flash Player来设置Origin字段。在处理跨站请求的时候,token验证的方法处理的不好,因为token会暴露。为了应对这些攻击,网站不应当接受不可信来源的跨站请求。4、应用。Origin字段跟以下四个用来确定请求来源的建议非常类似。Origin字段以下四个建议的基础上统一并改进了,目前已经有几个组织采用了Origin字段的方法建议。? Cross-Site XMLHttp Request。Cross-Site XMLHttp Request的方法规定了一个Access-Control-Origin 字段,用来确定请求来源。这个字段存在于所有的HTTP方法,但是它只在XMLHttpRequests请求的时候才会带上。我们对Origin字段的设想就是来源于这个建议,而且Cross-Site XMLHttp Request工作组已经接受我们的建议愿意将字段统一命名为Origin。?XDomainRequest。在Internet Explorer 8 Beta 1里有XDomainRequest的API,它在发送HTTP请求的时候将Referer里的路径和请求内容删掉了。被缩减后的Referer字段可以标识请求的来源。我们的实验结果表明这种删减的Referer字段经常会被拒绝,而我们的Origin字段却不会。微软已经发表声明将会采用我们的建议将XDomainRequest里的删减Referer更改为Origin字段。? JSONRequest。在JSONRequest这种设计里,包含有一个Domain字段用来标识发起请求的主机名。相比之下,我们的Origin字段方法不仅包含有主机,还包含请求的方案和端口。JSONRequest规范的设计者已经接受我们的建议愿意将Domain字段更改为Origin字段,以用来防止网络攻击。? Cross-Document Messaging。在HTML5规范里提出了一个建议,就是建立一个新的浏览器API,用来验证客户端在HTML文件之间链接。这种设计里面包含一个不能被覆盖的origin属性,如果不是在客户端的话,在服务端验证这种origin属性的过程与我们验证origin字段的过程其实是一样的。具体实施:我们在服务器和浏览器端都实现了利用origin字段的方法来防止CSRF攻击。在浏览器端我们的实现origin字段方式是,在WebKit添加一个8行代码的补丁,Safari里有我们的开源组件,Firefox里有一个466行代码的插件。在服务器端我们实现origin字段的方式是,在ModSecurity应用防火墙里我们只用3行代码,在Apache里添加一个应用防火墙语言(见图4)。这些规则在POST请求里能验证Host字段和具有合法值的origin字段。在实现这些规则来防御CSRF攻击的时候,网站并不需要做出什么改变,而且这些规则还能确保GET请求没有任何攻击性(前提是浏览器端已经实现了origin字段方法)。
阅读(...) 评论()Java HttpClient 如何伪装微信浏览器进行POST请求 - 攻城狮子的博客 - 博客频道 - CSDN.NET
Java HttpClient 如何伪装微信浏览器进行POST请求
微信-公众号-java-开发
当我用HttpClient的post去请求外部微信支付跳转时得到一个返回值:
{"code":"XXXXXXXXX,"message":"请使用微信打开页面"}
当时通过思考我想到了两个办法:
把这个POST请求放在页面上,通过Ajax去POST请求,由于是微信公众号跳转,所以跳转肯定是用微信跳转的
还是通过后台跳转,想办法发送请求的时候跳过微信识别验证或者直接把请求伪装成微信浏览器请求
第一种办法比较快捷,由于时间问题,肯定比较倾向快速解决:
运行项目后在微信里去点击按钮进行POST请求的时候报 405 这是资源跨域的问题,在网上找了一些办法说在被请求的资源加上 “Access-Control-Allow-Origin”,但是我请求的是第三方,所以这个问题到了这里对于我来说就有点无解,实在由于时间问题不去找其他资料了,这个等空闲了看看能不能实现。
第二种办法和我当初的想法一样,就是卡在这里,既然第一种方法不行那就想想怎么伪装成微信去访问:
去网上找了一些资料,得到的确是在谷歌浏览器开发者模式下手机模式下修改值为:
Mozilla/5.0 (L U; Android 2.3.6; zh- GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255
这样就能用谷歌访问必须要微信访问的页面,我试了用这个模式直接跳转Url去跳转第三方POST,发现有返回跳转页面,而不是“message”:”请使用微信打开页面”,那就按照这个方式走,既然我能伪装浏览器我为何不能伪装后台POST请求的时候伪装的浏览器设置有微信特点的伪装成微信浏览器去访问呢?
逆向思维一下,既然第三方判断我这边请求不是用微信的话,它是通过什么判断的,所以我百度了一下,发现微信可以通过Request(请求)中获取头部中的userAgent值来判断是否是微信内置浏览器,意思就是可以在POST请求上头部信息加上userAgent的值来伪装微信内置浏览器去请求了:
// 请求客户端及参数
CloseableHttpClient client = HttpClients.createDefault();
// Post请求
HttpPost httppost = new HttpPost(url);
//在这里我们给Post请求的头部加上User-Agent来伪装成微信内置浏览器
httppost.setHeader("User-Agent","Mozilla/5.0 (L U; Android 2.3.6; zh- GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255");
//这个是在网上看到的,要加上这个,避免其他错误
httppost.setHeader("Referer", "https://mp.");
//发送Post请求
response = client.execute(httppost);
//.....获取response请求后其他的操作
通过测试,问题解决。
微信的内置浏览器识别是请求的头部是否有 User-Agent 值并且值是否为User-Agent”,”Mozilla/5.0 (L U; Android 2.3.6; zh- GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255 所以以后要进行后台跳转相关微信服务可以通过设置头的 User-Agent的值来进行伪装微信内置浏览器请求
我的热门文章
即使是一小步也想与你分享使用httpclient模拟get/post请求 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 14时,
&无详细内容&
代码片段(1)
1.&[代码][Java]代码&&&&
import java.io.BufferedR
import java.io.IOE
import java.io.InputS
import java.io.InputStreamR
import mons.httpclient.DefaultHttpMethodRetryH
import mons.httpclient.H
import mons.httpclient.HttpC
import mons.httpclient.HttpE
import mons.httpclient.HttpS
import mons.httpclient.NameValueP
import mons.httpclient.cookie.CookieP
import mons.httpclient.methods.GetM
import mons.httpclient.methods.PostM
import mons.httpclient.params.HttpMethodP
public class TestHttpClient {
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义httpClient的实例
HttpClient httpclient = new HttpClient();
//创建get方法的实例
GetMethod getMethod = new GetMethod("");
//使用系统提供的默认恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
//创建post方法实例
PostMethod postMethod = new UTF8PostMethod("");
//填入各个表单域的值
NameValuePair[] data = {new NameValuePair("user_name", "user_name"),new NameValuePair("password","password")};
//将表单的值放入到post方法中
postMethod.setRequestBody(data);
postMethod.getParams().setParameter(
"http.protocol.cookie-policy",CookiePolicy.BROWSER_COMPATIBILITY);
postMethod.setRequestHeader("Referer", "");
//执行GET方法
int statusCode = httpclient.executeMethod(getMethod);
//执行post方法
int statusCode = httpclient.executeMethod(postMethod);
if(statusCode == HttpStatus.SC_MOVED_TEMPORARILY){
Header locationHeader = postMethod.getResponseHeader("Location");
String location =
if(locationHeader != null){
location = locationHeader.getValue();
postMethod = new PostMethod(location);
postMethod.setRequestHeader("Referer", "/login");
NameValuePair[] data1 = {new NameValuePair("user_name", "user_name"),new NameValuePair("password","password")};
postMethod.setRequestBody(data1);
postMethod.getParams().setParameter(
"http.protocol.cookie-policy",CookiePolicy.BROWSER_COMPATIBILITY);
int statusCode1 = httpclient.executeMethod(postMethod);
if(statusCode1 != HttpStatus.SC_OK){
System.out.println("Method is wrong " + postMethod.getStatusLine());
if(statusCode != HttpStatus.SC_OK){
System.out.println("Method is wrong " + postMethod.getStatusLine());
InputStream responseBody = postMethod.getResponseBodyAsStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(responseBody,"utf-8"));
String line = reader.readLine();
while(line != null){
System.out.println(new String(line.getBytes()));
line = reader.readLine();
catch (HttpException e) {
// TODO: handle exception
System.out.println("Please check your provided http address!");
e.printStackTrace();
}catch (IOException e) {
// TODO: handle exception
System.out.println("the line is wrong!");
e.printStackTrace();
getMethod.releaseConnection();//释放链接
postMethod.releaseConnection();
//Inner class for UTF-8 support
public static class UTF8PostMethod extends PostMethod{
public UTF8PostMethod(String url){
super(url);
public String getRequestCharSet() {
//return super.getRequestCharSet();
return "UTF-8";
开源中国-程序员在线工具:
相关的代码(71)
2回/39152阅
58回/33806阅
2回/30149阅
9回/20784阅
1回/20235阅
128回/17754阅
3回/15431阅
18回/13860阅
1回/11852阅
16回/11405阅
开源从代码分享开始
liang伟亮的其它代码

我要回帖

更多关于 java https post请求 的文章

 

随机推荐