tomcat服务启动,但是无法访问网站_java获取request的所有参数
大家好,又见面了,我是你们的朋友全栈君。
废话不说,真接上代码。
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.cn/195197.html原文链接:https://javaforall.cn
相关文章
- java object toarray,Object[] toArray()
- Java实现AD域登录认证「建议收藏」
- java中scanner意思_Java中的Scanner
- java单例模式——详解JAVA单例模式及8种实现方式
- java找不到符号解决办法
- java用正则表达式大全_Java 正则表达式 大全「建议收藏」
- java parrallel for,Java 8 parallel forEach进度指示
- eclipse创建一个java项目目录_Eclipse创建JAVA项目
- java检测tomcat宕机_Tomcat意外宕机分析
- JAVA中异常处理
- 【说站】Java集合框架Arrays的介绍
- executorservice等待线程池执行完毕_java线程池策略
- Java快排算法详解[通俗易懂]
- java——数组定义 遍历输出
- 转引的注释怎么写_java注释模板
- java查找字符的方法_Java字符串查找(3种方法)
- Java学习笔记之五java数组详解编程语言
- Linux下Java编程之旅(linux执行java)
- Java 调用 MySQL,编写数据库程序(java导入mysql)
- 方式Redis Java控制过期时间的方式(redisjava过期)
- 时间使用Redis控制Java数据过期时间(redisjava过期)
- 策略基于Redis和Java的过期键管理策略(redisjava过期)
- 如何在Linux系统下成功安装Java?(linux下安装java)
- MSSQL与Java的数据库连接实践(mssql连接java)
- Java 开发提升Oracle数据库性能(java开发oracle)
- 学习Java编程,攻克Oracle难题(java学oracle)
- java动态代理和cglib动态代理示例分享