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

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


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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • KDE自动登录

    KDE自动登录

    2021年8月18日
  • 软件工程:数据流图和结构图怎么画?

    软件工程:数据流图和结构图怎么画?文章目录Step1:根据软件的功能描述,绘制数据流图:Step2:根据数据流图,分级绘制结构图:•边界划分:•第一级分解:•第二级分解:•精化减少耦合:Step1:根据软件的功能描述,绘制数据流图:问题表述:假设的仪表板将完成下述功能:(1)通过模数转换实现传感器和微处理机接口;(2)在发光二极管面板上显示数据;(3)指示每小时英里数(mph),行驶的里程,每加仑油行驶的英里数(mpg)等等;(4)指示加速或减速;(5)超速警告:如果车速超过55英里/小时,则发出超速警告铃声。首先了

    2022年6月15日
  • 优化算法——人工蜂群算法(ABC)

    优化算法——人工蜂群算法(ABC)一、人工蜂群算法的介绍人工蜂群算法(ArtificialBeeColony,ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群智能算法的一种。二、人工蜂群算法的原理1、原理标准的ABC算法通过模拟

    2022年5月23日
  • 逻辑漏洞概述[通俗易懂]

    逻辑漏洞概述[通俗易懂]访问:主体与客体之间的信息流动。主动的是主体,被动的是客体。主体访问客体的四个步骤:身份标识-&amp;gt;身份验证(数据库匹配信息,判断身份是否合法)-&amp;gt;授权(判断身份是谁,管理员或正常账户)-&amp;gt;审计(记录操作)访问控制模型:自主访问控住(DAC大部分使用):由客体的属主自主对客体进行管理,自主决定是否将访问权限授予其他主体。强制访问控制(MAC军方或重要政府部门用):安全…

    2022年4月28日
  • windows安装wget命令_linux安装命令install

    windows安装wget命令_linux安装命令install今天给服务器安装新LNMP环境时,wget时提示-bash:wgetcommandnotfound,很明显没有安装wget软件包。一般linux最小化安装时,wget不会默认被安装。可以通过以下两种方法来安装:1、rpm安装rpm下载源地址:http://mirrors.163.com/centos/6.2/os/x86_64/Packages/下载wget的RPM包:htt…

    2022年4月20日
  • myeclipse6.5注册码在线生成_机器码生成注册码在线

    myeclipse6.5注册码在线生成_机器码生成注册码在线在线生成网址http://key.858game.com/index.jspmyeclipse8.5注册码列表:      lipengxin      yLR8ZC-855575-645657520873808      2016-01-0310:18:40                       myeclipse10.注册

    2022年9月29日

发表回复

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

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