tomcat服务启动,但是无法访问网站_java获取request的所有参数

tomcat服务启动,但是无法访问网站_java获取request的所有参数废话不说,真接上代码。HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setRequestProperty(“Content-Length”,”0″);中的第二句没有起作用(发出去的http头里,未含有Content-Length字段)。但是这个代码在android平台上跑的时候,第二句是起了作用的。为…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

废话不说,真接上代码。

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

conn.setRequestProperty(“Content-Length”, “0”);

中的第二句没有起作用(发出去的http头里,未含有Content-Length字段)。

但是这个代码在android平台上跑的时候,第二句是起了作用的。

为了找出原因,真接跟到源代码中看:

public void setRequestProperty(String key, String value) {

if (connected)

throw new IllegalStateException(“Already connected”);

if (key == null)

throw new NullPointerException (“key is null”);

if (isExternalMessageHeaderAllowed(key, value)) {

requests.set(key, value);

}

}

private boolean isExternalMessageHeaderAllowed(String key, String value) {

checkMessageHeader(key, value);

if (!isRestrictedHeader(key, value)) {

return true;

}

return false;

}

private boolean isRestrictedHeader(String key, String value) {

if (allowRestrictedHeaders) {

return false;

}

key = key.toLowerCase();

if (restrictedHeaderSet.contains(key)) {

/*

* Exceptions to restricted headers:

*

* Allow “Connection: close”.

*/

if (key.equals(“connection”) && value.equalsIgnoreCase(“close”)) {

return false;

}

return true;

} else if (key.startsWith(“sec-“)) {

return true;

}

return false;

}

由上面代码可以看出,一个属性能不能加到request中,由allowRestrictedHeaders和restrictedHeaderSet决定的。如果key在restrictedHeaderSet,而且allowRestrictedHeaders为false时,这个key的值是不能加到request中的。

继续来看restrictedHeaderSet和allowRestrictedHeaders是哪里来的。在静态初始化代码中发现allowRestrictedHeaders是由安全管理器的返回值决定的。

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

allowRestrictedHeaders = ((Boolean)java.security.AccessController.doPrivileged(

new sun.security.action.GetBooleanAction(

“sun.net.http.allowRestrictedHeaders”))).booleanValue();

if (!allowRestrictedHeaders) {

restrictedHeaderSet = new HashSet(restrictedHeaders.length);

for (int i=0; i < restrictedHeaders.length; i++) {

restrictedHeaderSet.add(restrictedHeaders[i].toLowerCase());

}

} else {

restrictedHeaderSet = null;

}

数组的声明如下:

private 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″,

“Content-Transfer-Encoding”,

//”Date”,

“Expect”,

“Host”,

“Keep-Alive”,

“Origin”,

// “Referer”,

// “TE”,

“Trailer”,

“Transfer-Encoding”,

“Upgrade”,

//”User-Agent”,

“Via”

};

由此可以看出Content-Length,Host,Transfer-Encoding等都是加不进去的。

但这是为什么呢?又应该如何解决呢?

于是搜索了下。

找到下面两篇。

http://stackoverflow.com/questions/6056125/why-does-content-length-http-header-field-use-a-value-other-than-the-one-given-i/6056230#6056230

http://lxy2330.iteye.com/blog/1882836

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

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

按第二篇里的做法,是失败的。

试着的JVM启动参数里面加,但失败了。

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

System.setProperty(“sun.net.http.allowRestrictedHeaders”, “true”);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195197.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何在linux中安装VMwareTools

    如何在linux中安装VMwareToolsvmwaretools是虚拟机VMwareWorkstation自带的一款工具,它的作用就是使用户可以从物理主机直接往虚拟机里面拖文件。如果不安装它,我们是无法进行虚拟机和物理机之间的文件传输的,当然它的功效不止于此,平时我们操作虚拟机的时候,在物理机和虚拟机之间必须使用CTRL切换,如果安装之后我们就不必使用键盘切换,直接便可退出,使得虚拟机真正成为了电脑的一部分,那么这么神奇的vmware

    2022年5月25日
    34
  • spdlog使用

    spdlog使用目录Spdlog优点Example简单封装与使用使用中遇到的问题Spdlog优点只需包含头文件 无需依赖第三方库 支持跨平台 支持多线程 源码地址:https://github.com/gabime/spdlog Example////Copyright(c)2015GabiMelman.//DistributedundertheMITLicense(http://opensource.org/licenses/MIT)/.

    2022年6月23日
    165
  • urlopen error errno111(英雄联盟报错error)

    原因获取地址信息失败,通常是由于自动选择的DNS服务器不行解决方法更换DNS服务器控制面板(win+R+control)->网络和Internet2.打开网络共享中心3.打开当前连接的网络,以wifi为例4.打开属性5.打开Internet协议版本46.选择使用特定DNS服务器地址,并设置为114.114.114.1148.设置完成后,错误解决…

    2022年4月18日
    54
  • 数据库 之 关系模式范式

    数据库 之 关系模式范式主要有6种范式:第一范式(1NF),第二范式(2NF),第三范式(3NF),巴德斯科范式(BCNF),第四范式(4NF),第五范式(5NF),按从左至右的顺序一种比一种要求更严格。要符合某一种范式必须

    2022年7月1日
    25
  • 拼多多下载安装_快影下载安装

    拼多多下载安装_快影下载安装SQLite的最新版本可以从这里下载。下面我们以Windows版本sqlite-3_5_1.zip为例介绍其安装方法。(大家可以选择下载安装适合自己的版本)下载后,将sqlite-3_5_1.zip解压缩至C:/sqlite目录即完成安装。C:/sqlite目录构造为:C:/sqlite|+–sqlite3.exe打开一个CMD命令窗口

    2025年7月6日
    0
  • matlab语法 axis on,matlabaxis

    matlab语法 axis on,matlabaxis编程语言中文网今天精心准备的是《matlabaxis》,下面是详解!Matlab里axis这个函数怎么用,举个例子!axis函数可以用于操作普通的坐标属性(轴的缩放和外观)。比如:axis([xminxmaxyminymax]):可以设置当前坐标轴x轴和y轴的限制范围axis([xminxmaxyminymaxzminzmaxcmincmax])可以设置x,y…

    2022年6月13日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号