Httpclent 请求限制,判断返回类型和返回数据大小

信息发布:soゝso 发布日期:2017-03-23 11:18 热度:711 分享到:

本站前一段时间遭受出网带宽跑满攻击,蓝瘦香菇中。攻击陆陆续续持续了2个星期,后来改成了动态链接好一点。

目前 在线HTTP POST/GET ... 接口测试工具 工具已经解决了一系列问题,但是发现还是有人恶意请求,比如请求一个视频文件,或者请求大图片,导致服务器卡死,内存溢出,查看了日志,2种内存溢出。

1.OutOfMemoryError: PermGen space

2.OutOfMemoryError:  Java heap space

解决方案:

http请求代码:

URL realUrl = new URL(url);
// 打开和URL之间的连接  
conn = (HttpURLConnection) realUrl.openConnection(); 
// 发送POST请求必须设置如下两行  
conn.setRequestMethod(StringUtils.upperCase(type));// 提交模式
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Connection", "close"); 
conn.setConnectTimeout(3000);  //设置连接主机超时(单位:毫秒)  
conn.setReadTimeout(2000);     //设置从主机读取数据超时(单位:毫秒)  

//省略一些内容 ... ... 

一、请求返回值大小判断。

//获取返回值长度
int contentInt = conn.getContentLength();
//判断大于100KB
if(contentInt > 102400){
	map.put("result", "您的返回值为:"+ getPrintSize(contentInt) +"。\r\n我们防止恶意攻击只支持:返回值支持小于100KB;\r\n给你带来的不便敬请谅解;\r\n对此功能有更好的意见请加QQ群:259217951,尽量满足你的任何需求。");
	return map;
}

二、请求类型判断。

//获取返回值类型
String contentType = conn.getContentType();  
//只允许text/html  application/json
if(contentType == null || ( !contentType.equals("text/html") &&! contentType.startsWith("application/json") )){
	map.put("result", "您的返回类型是:" + contentType +";\r\n我们为了防止恶意攻击只支持:text/html 或者 application/json;\r\n给你带来的不便敬请谅解;\r\n对此功能有更好的意见请加QQ群:259217951 ,尽量满足你的任何需求。");
	return map;
}

三、KB、MB大小转换代码

public static String getPrintSize(long size) {
	// 如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义
	if (size < 1024) {
		return String.valueOf(size) + "B";
	} else {
		size = size / 1024;
	}
	// 如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位
	// 因为还没有到达要使用另一个单位的时候
	// 接下去以此类推
	if (size < 1024) {
		return String.valueOf(size) + "KB";
	} else {
		size = size / 1024;
	}
	if (size < 1024) {
		// 因为如果以MB为单位的话,要保留最后1位小数,
		// 因此,把此数乘以100之后再取余
		size = size * 100;
		return String.valueOf((size / 100)) + "."
				+ String.valueOf((size % 100)) + "MB";
	} else {
		// 否则如果要以GB为单位的,先除于1024再作同样的处理
		size = size * 100 / 1024;
		return String.valueOf((size / 100)) + "."
				+ String.valueOf((size % 100)) + "GB";
	}
}

效果如下。


本文主题

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

¥我需要走的更远,点击我 赞助。 如果还有疑问,点击我加群,为你提供最好的解答。


工具导航地图

 
赞助二维码 赞助名单 百度口碑点赞 点击加QQ群 听音乐 X
反馈意见