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)
上一篇 2025年10月21日 下午11:22
下一篇 2025年10月22日 上午7:01


相关推荐

  • TCP 报文分析

    TCP 报文分析TCP 数据格式握手通讯过程握手通讯 完成事宜 建立通讯 确认双方消息发送的 sequencenumb 确认 windowsize 握手 抓包分析 TCP 握手的三个报包 1 发送方请求建立连接包括信息 请求建立连接 SYN 1 ACK 0 发送方 SequenceNumb WindowSize 协商值 64240 2 8 window 2 Windowscale 包 2 服务方同意建立连接包括信息 同意建立连接

    2026年3月18日
    2
  • python和c语言的区别有哪些

    python和c语言的区别有哪些python 和 c 语言的区别有哪些 Python 可以说是目前最火的语言之一了 人工智能的兴起让 Python 一夜之间变得家喻户晓 Python 号称目前最最简单易学的语言 现在有不少高校开始将 Python 作为大一新生的入门语言 本萌新也刚开始接触 Python 发现 Python 与其他语言确实有很大的区别 Python 是由 C 语言实现的 因此想把 Python 与 C 语言做一个简单的比较 1 速度 Python 编程语言因为历史原因 有一个 GIL 锁 导致其对多线程支持不够好 运行速度较慢 而 C 语言很快 C 语言是比较底层的语

    2026年3月18日
    2
  • ADC采样滤波算法利用卡尔曼滤波算法详解

    ADC采样滤波算法利用卡尔曼滤波算法详解1ADC采样模型假设ADC采样的值已经为稳定状态,设k+1k+1k+1时刻ADC采样值为Xk+1Xk+1X_{k+1},则kkk时刻ADC采样值为XkXkX_k,假设k+1k+1k+1时刻的采样值为Zk+1Zk+1Z_{k+1},则有:{Xk+1=Xk,Zk+1=Xk+1+δ,δ为噪声{Xk+1=Xk,Zk+1=Xk+1+δ,δ为噪声\begin{cases}X_{k+1}=X…

    2022年6月12日
    35
  • 爬取爱套图网上的图片

    爬取爱套图网上的图片#coding=utf-8frombs4importBeautifulSoupimportrequestsforiinrange(20):i=str(i)url=’https://www.aitaotu.com/weimei/16359_’+i+’.html’html=requests.g…

    2025年11月18日
    6
  • Git克隆远端代码到本地「建议收藏」

    1、在桌面上点击鼠标右键,找到clone选项,出现其中URL是你要访问的地址,directory为文件保存的路径。点击OK2、桌面上会生成一个文件夹3、在此文件夹中,点击鼠标右键,找到GitBashHere,进入到如下页面输入命令第一:gitconfig–globaluser.name“zjut_wzc”第二:gitconfig–globaluser.em…

    2022年4月7日
    164
  • java的常量

    java的常量JAVA变量与常量常量常量值常量常量的声明定义常量常量在c语言编程网中的定义是指在程序的整个运行过程中值保持不变的量。在这里要注意常量和常量值是不同的概念,常量值是常量的具体和直观的表现形式,常量是形式化的表现。这里体现出常量值这一定义,我认为的常量值就是值,具体的某一数值百度出来的常量是定义为两种意思:一是不可变的变量,也是最最最开始接触java知道的,二如上。平时所说的值指的是常量值,常量是不可变的变量(用final修饰的变量)常量值提到常量值不得不说一下计数法,八进制、十进制、十六进制所代

    2022年7月8日
    28

发表回复

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

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