技术经验分享:HttpURLConnection411错误解决

简介: 技术经验分享:HttpURLConnection411错误解决

"

1.问题描述

Java HttpURLConnection类发送Http请求链接外网返回ResponseCode为411,对方为.NET服务器,网上查明原因可能来自以下:

1、可能是没有传http中的content-length参数,这个一般都有。

2、可能是因为请求方式错误的,本来只是获取数据,应该使用GET的方式;但是你使用的是POST的方式。

首先第一个方法:

conn.setRequestProperty(""Content-Length"", """"+info.getBytes().length);

设置后还是411错误

第二个方法:将请求方式改为GET, 成功。

但联调方反馈请求方式没有变,依然为POST,很纳闷.....下班后,用浏览器Http在线测试工具试了一下,发现添加参数Content-Length后,POST方式也能请求成功。

反过来,打印日志,发现属性""Content-Length""为NULL...也就是HTTPURLConnection调用setRequestProperty无效。所以这里也提醒自己,自测万无一失能避免沟通浪费。

这里推荐http测试用fiddler。定位到问题就好查了。

这个人总结的很好,自己也去看了源码。

?12345678910111213141516171819202122232425private static final Set restrictedHeaderSet; private static final String【】 restrictedHeaders = { / Restricted by XMLHttpRequest2 / //""Accept-Charset"", //""Accept-Encoding"", ""Access-Control-Request-Headers"", ""Access-Control-Request-Method"", ""Connection"", / close is allowed / ""Content-Length"", //""Cookie"", //""Cookie2"", //代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg0MTUwMA==.html

""Content-Transfer-Encoding"", //""Date"", ""Expect"", ""Host"", ""Keep-Alive"", ""Origin"", // ""Referer"", // ""TE"", ""Trailer"", ""Transfer-Encoding"", ""Upgrade"", //""User-Agent"", ""Via"" };

在静态初始化代码中发现allowRestrictedHeaders是由安全管理器的返回值决定的。

restrictedHeaderSet的内容是由restrictedHeaders数组决定的。

大概原因就是出于安全考虑,这些字段尽量不要被改动。sun就做了这一套安全机制。

解决方法是在JVM启动时加入sun.NET.http.allowRestrictedHeaders属性为true。

?12First, the order of the headers is irrelevant.Second, in order to manually override the host header you need to set sun.net.http.allowRestrictedHeaders=trueeither in code

直接在程序里面加下面代码。然后就OK了。

?1System.setProperty(""sun.net.http.allowRestrictedHeaders"", ""true"");

HttpURLConnection接口

2. DoOutput和DoInput说明

httpUrlConnection.setDoOutput(true)

httpUrlConnection.setDoInput(true)

这两个方法在develope的httpUrlConnection方法中找不到的。

get请求用不到conn.getOutputStream(),因为参数直接追加在地址后面,因此默认是false。

post请求(比如:文件上传)需要往服务区传输大量的数据,这些数据是放在http的body里面的,因此需//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg0MzA3Ng==.html

要在建立连接以后,往服务端写数据。

因为总是使用conn.getInputStream()获取服务端的响应,因此默认值是true。

坚持不懈


"
image.png
相关文章
|
前端开发 数据安全/隐私保护
前端传给后端的token是哪里来的?
前端传给后端的token是哪里来的?
1758 0
|
缓存 前端开发 UED
前端常见的HTTP状态码
【4月更文挑战第6天】HTTP状态码是服务器对请求的响应状态,分为1xx(处理中)、2xx(成功)、3xx(重定向)、4xx(客户端错误)和5xx(服务器错误)五大类。常见的如200(成功)、404(未找到)、500(服务器内部错误)。理解这些状态码有助于优化前端应用的请求处理和调试。
657 1
|
5月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
377 3
Jasypt加密数据库配置信息
|
6月前
|
Android开发 开发者
HarmonyOS实战:3秒实现一个自定义轮播图
本文介绍如何在HarmonyOS中快速实现一个自定义轮播图。通过使用Swiper控件,结合LazyForEach懒加载技术提高性能,并实现循环播放、自动播放、自定义播放间隔、横向/竖向轮播及自定义指示器等功能。文章详细解析了技术实现步骤,包括数据源接口的实现和指示器的定制,帮助开发者轻松上手,建议点赞收藏!
211 1
|
网络安全
[ansible]建立ssh互信
[ansible]建立ssh互信
192 3
|
存储 机器学习/深度学习 并行计算
95% 的算法都是基于这 6 种算法思想 (详细介绍)
95% 的算法都是基于这 6 种算法思想 (详细介绍)
468 4
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
726 0
|
关系型数据库 MySQL
MySQL:The server quit without updating PID file
MySQL:The server quit without updating PID file
384 0
|
设计模式 开发框架 前端开发
使用 FastEndpoints 来垂直切割Web API的控制器方法
使用 FastEndpoints 来垂直切割Web API的控制器方法
|
开发框架 前端开发 JavaScript
探索现代Web开发中的框架选择:Blazor、Angular和React的全面比较与分析
【8月更文挑战第31天】随着Web开发技术的发展,选择合适的框架对项目成功至关重要。本文对比了三大前端框架:Blazor、Angular和React。Blazor是微软推出的.NET Web客户端开发框架,支持C#编写前端代码;Angular由Google支持,基于TypeScript,适用于大型应用;React是由Facebook维护的高效JavaScript库。
428 0