yxhxj2006

常用链接

统计

最新评论

#

用gmail smtp发送邮件

import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMail implements Runnable {
    private final String smtp_host = "smtp.gmail.com";                      
    private final String from_userName = "xx@gmail.com";        
    private final String from_passWord = "xx";                        
    private final String show_name = "xxx";
    
    public String email_address;
    public String email_subject;
    public String email_content;    
    
    public SendMail(String email_address, String email_subject, String email_content) {
        this.email_address = email_address;
        this.email_subject = email_subject;
        this.email_content = email_content;
    }

    public void run() {
        executeMailSend(email_address, email_subject, email_content);
    }
    
    /**
     * 
     * 
@param recipients: the mail send to
     * 
@param sendSubject: the mail subject
     * 
@param sendText: the mail content
     
*/
    public void executeMailSend(String recipients, String sendSubject, String sendText) {
        
        try {            
            Properties props = System.getProperties();
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", smtp_host);
            props.put("mail.smtp.user", from_userName);
            props.put("mail.smtp.password", from_passWord);
            props.put("mail.smtp.port", "587");  //gmail smtp port 587
            props.put("mail.smtp.auth", "true");
            

            
            Session session = Session.getDefaultInstance(props, null);
            session.setDebug(false);
            
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from_userName));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
            message.setFrom(new InternetAddress(show_name + "<" + from_userName + ">"));    
            message.setSubject(sendSubject);
            message.setContent(sendText, "text/html;charset=utf-8");            
            
            Transport transport = session.getTransport("smtp");
            transport.connect(smtp_host, from_userName, from_passWord);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
            
            System.out.println("send an email to " + recipients + " success");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("failure! ");

        }
    }
    public static void main (String args[]){
        new SendMail("yy@gmail.com","test","hehe").run();
    }
}
结果老是报如下的错误
javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. 36sm443504yxh.67
failure! 

    at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1020)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:716)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:388)
    at SendMail.executeMailSend(SendMail.java:59)
    at SendMail.run(SendMail.java:25)
    at SendMail.main(SendMail.java:70)
 折腾了个把小时,苦苦寻求后发现一个解决办法 
props.put("mail.smtp.port""587");  
替换成
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.setProperty("mail.smtp.socketFactory.fallback", "false"); 
props.setProperty("mail.smtp.port", "465"); 
props.setProperty("mail.smtp.socketFactory.port", "465"); 
究其原因也不太清楚,网上有资料说port 587也可以,不知结果不行
把上述代码中的 

posted @ 2013-03-08 15:16 奋斗成就男人 阅读(1131) | 评论 (0)编辑 收藏

Json-lib使用——JSONObject与JSONArray

1.从Object到String
 要先用Object对象构造一个JSONObject或者JSONArray对象,然后调用它的toString()方法即可

(1)示例一

1 Book book=new Book();
2 book.setName("Java");
3 book.setPrice(52.3f);
4 JSONObject object=JSONObject.fromObject(book);
5 System.out.println(object.toString());

(2)示例二

复制代码
 1         Book book=new Book();
2 book.setName("Java");
3 book.setPrice(52.3f);
4
5 Book book2=new Book();
6 book2.setName("C");
7 book2.setPrice(42.3f);
8 List list=new ArrayList();
9 list.add(book);
10 list.add(book2);
11 JSONArray arry=JSONArray.fromObject(list);
12 System.out.println(arry.toString());
13 //结果如下:
14 [{"name":"Java","price":52.3},{"name":"C","price":42.3}]
复制代码

2.从String到Object
 要先用String对象构造一个JSONObject或者JSONArray对象
(1)示例一 

1 String json="{name:'Java',price:52.3}";    
2 JSONObject object=JSONObject.fromObject(json);
3 System.out.println(object.get("name")+" "+object.get("price"));

(2)示例二

复制代码
1 String json="[{name:'Java',price:52.3},{name:'C',price:42.3}]";
2 JSONArray array=JSONArray.fromObject(json);
3 for(int i=0;i<array.size();i++){
4 Map o=(Map)array.get(i);
5 System.out.println(o.get("name")+" "+o.get("price"));
6 }
复制代码

3.从String到Bean

(1)单个Bean对象

1         String json="{name:'Java',price:52.3}";
2 JSONObject object=JSONObject.fromObject(json);
3 Product product=(Product)JSONObject.toBean(object,Product.class);
4 System.out.println(product.getName()+" "+product.getPrice());

(2).Bean的数组

复制代码
1         String json="[{name:'Java',price:52.3},{name:'C',price:42.3}]";
2 JSONArray array=JSONArray.fromObject(json);
3 Product[] products=(Product[]) JSONArray.toArray(array,Product.class);
4 for(Product p:products){
5 System.out.println(p.getName()+" "+p.getPrice());
6 }
复制代码

自定义封装JSON操作的类

复制代码
 1 package com.util;
2
3 import java.util.List;
4 import java.util.Map;
5
6 import net.sf.json.JSONArray;
7 import net.sf.json.JSONObject;
8
9 public class JsonHelper {
10 //从普通的Bean转换为字符串
11 public static String getJson(Object o){

12 JSONObject jo=JSONObject.fromObject(o);
13 return jo.toString();
14 }
15 //从Java的列表转换为字符串
16 public static String getJson(List list){

17 JSONArray ja=JSONArray.fromObject(list);
18 return ja.toString();
19 }
20 //从Java对象数组转换为字符串
21 public static String getJson(Object[] arry){

22 JSONArray ja=JSONArray.fromObject(arry);
23 return ja.toString();
24 }
25 //从json格式的字符串转换为Map对象
26 public static Map getObject(String s){

27 return JSONObject.fromObject(s);
28 }
29 //从json格式的字符串转换为List数组
30 public static List getArray(String s){

31 return JSONArray.fromObject(s);
32 }
33 //从json格式的字符串转换为某个Bean
34 public static Object getObject(String s,Class cls){

35 JSONObject jo=JSONObject.fromObject(s);
36 return JSONObject.toBean(jo, cls);
37 }
38 //从json格式的字符串转换为某类对象的数组
39 public static Object getArray(String s,Class cls){

40 JSONArray ja=JSONArray.fromObject(s);
41 return JSONArray.toArray(ja, cls);
42 }
43 }





posted @ 2013-03-04 15:22 奋斗成就男人 阅读(793) | 评论 (0)编辑 收藏

Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

     摘要: 第一、Logger.getLogger()和LogFactory.getLog()的区别    1.Logger.getLogger()是使用log4j的方式记录日志;    2.LogFactory.getLog()则来自apache的common-logging包。common-logging组件: &n...  阅读全文

posted @ 2012-12-26 00:45 奋斗成就男人 阅读(6043) | 评论 (0)编辑 收藏

log4j配置日志

懂行的人都知道,log4j日志是个很基础的东东,与struts这种高层框架无关,只与web开发了的tomcat有关。这里之所以写出struts,是因为笔者一开始用struts的时候,以为是这样,也是这样google的。好了,言归正传,开工了
给tomcat配置log4j有好几种方法,我知道的有:
一、tomcat级别的统一日志管理(没有实际验证过,只是查了资料):
在tomcat的common/lib下增加log4j的.jar包,以便程序使用的时候,能够加载到。
在自己的webapps的WEB-INF/classes下添加log4j.properties配置,所有的东西都是自动的
 
这种方式的缺点很明显,一个tomcat可能会多个子webapps,都统一到一个日志下,非常不便于管理。所以重点看下面
 
二、每个webapp分别配置log4j(切实可行的实践经验)
1、在自己youapp的WEB-INF/lib下增加log4j-xxx.jar文件
2、自己写一个servlet,初始化log4j的相关配置信息:
Java代码
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServlet;  
import org.apache.log4j.PropertyConfigurator;  
  
public class Log4jInitServlet extends HttpServlet {  
    public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {          
    }  
      
    public void init() throws ServletException {  
        System.setProperty("webappRoot", getServletContext().getRealPath("/"));       
        PropertyConfigurator.configure(getServletContext().getRealPath("/") + getInitParameter("configfile"));  
    }  
}  
 3、修改web.xml文件,让tomcat启动你app的时候自动加载刚才这个servlet:
Xml代码
<!-- initialize log4j -->  
<servlet>  
    <servlet-name>log4j config file</servlet-name>  
    <servlet-class>com.keepc.util.Log4jInitServlet</servlet-class>  
    <init-param>  
        <param-name>configfile</param-name>  
        <param-value>/WEB-INF/classes/log4j.properties</param-value>  
    </init-param>  
      
    <load-on-startup>1</load-on-startup>  
</servlet>  
 4、在youapp/WEB-INF/classes先新建log4j.properties文件,内容如下:
log4j.rootLogger=debug, A1

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.file=${webappRoot}/logs/youapp_log-
log4j.appender.A1.DatePattern=yyyy-MM-dd'.log'
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss, SSS}[%c]-[%p] %m%n
5、重新启动tomcat,即可在你的youapp应用目录下看到logs目录和对应的log文件
#:这里说道的webapp目录是指:c:\program files\tomcat\webapps\youapp目录
6、在你的app目录下创建一个jsp做下测试:
Html代码
<%@ page contentType="text/html; charset=GBK" language="java" import="org.apache.log4j.Logger,java.util.*"%>  
<html>  
<head>  
<link href="style/reg.css" rel="stylesheet" type="text/css">  
<title>测试页面</title>  
</head>  
<body>  
  
<%  
Logger log = Logger.getLogger("test.jsp");  
log.debug("测试日志,哈哈");  
%>  
  
</body>  
  
</html>  
在你的浏览器调用下这个jsp,就可以看到日志内容了。
 
本方法在windows和linux下都通用,完全一样。
只与log4j.properties的详细配置方法,网上随便google下都有一箩筐,照抄就是了。

posted @ 2012-12-25 00:52 奋斗成就男人 阅读(1056) | 评论 (0)编辑 收藏

SVN的服务器的配置

    
    一: SVN包括:服务器端(Subversion)和客服端(TortoiseSVN),安装时,建议先安装服务器端,再安装客服端(因为安装完客服端后需要重启电脑)。

    二:安装完成后,创建服务器版本库:创建一个文件夹(比如:D:\\svnserver),然后右键:TortoiseSVN ----> create respository here,然后在该目录下生成六个文件(conf文件           夹、 db文件夹、hooks文件夹、locks文件夹、format文件和README.txt),其中配置文件在conf文件夹中。 其中conf文件夹下包含三个文件:authz(配置用户权限:读,写权限         等 等)、
    passwd(配置用户名和密码)和svnserve.conf(svn的核心配置)。
    其中:
    1: passwd配置:在该文件中,创建用户的方式为:  用户名 = 密码 ,例如:创建用户名为:admin,密码为abcd,即为:admin = abcd
    2: svnserve.conf配置:开启用户访问的功能:即只需开启: password-db = passwd 即可,具体操作:把password-db = passwd 前面的#去除即可。否则其他用户不能访问。
                                    开启用户权限的功能:即只需开启: authz-db = authz 即可,具体操作:把authz-db = authz  前面的#去除即可。否则配置的用户权限将不生效。 
      
    3:authz 配置:找到该文件的 [groups] :在下一行:有两种方式配置权限:
         (1): 权限名称  = 用户名  ,然后在相应的目录: 权限名称 = 权限(比如:rw)例如: 
                    [groups]                -- 给权限分组,有利于多个用户批量分配权限。
                    adm = admin         -- adm 为组权限名称,类似常说的“角色”,admin为用户名,= 前后最后加上一个空格。  
                    [/]                        -- / 表示svn服务器的跟目录下,当然也可以用其他的目录。比如:[/a/b/] 表示为/a/b/ 目录下分配目录权限
                    @adm = rw           -- @表示组, adm表示组名,r表示只读,即下载功能;r表示只写,即上传功能。
         (2):直接在相应的目录下:用户名 = 权限(比如:rw) 例如: 
                   admin = rw            -- admin 为用户名,rw表示读写权限。
   如果 svnserve.conf 的authz-db = authz 不开启。则权限分配则无效。当然这样用户也是可以上传和下载的。
   三:开启SVN服务:
   (1):临时开启,在dos界面中输入: svnserver  -d -r + svn服务器版本库目录  例如:svn版本库目录为:D:\\svnserver ,即为:
               svnserver  -d -r D:\\svnserver           -- 注意:-d, -r ,svn服务器版本库目录中间需要用空格隔开。而一旦关闭dos界面是,svn服务器也随之关闭。
   (2):永久开启:即电脑启动时自动开启svn服务器。这样需要把svn创建一个服务,然后把该服务器设置为自动启动即可。具体操作:
             (i) : 创建服务:在dos界面中输入:
             sc create svnserver binpath= svnserve.exe目录 --service --root svn版本库目录                -- 注意:=与svnserve.exe之间必须要加一个空格
             例如svn服务器安装在:D:\J2EE\SVN\Subversion目录下
             则为: sc create svnserver binpath= "D:\J2EE\SVN\Subversion\bin\svnserve.exe --service --root  D:\\svnserver"     -- 双引号不可缺少
            然后:如果创建服务没有问题,则输入:services.msc 到电脑服务列表中会找到一个:svnserve服务。如果创建svn服务失败,则无法找到svnserve服务。 
            如果创建svn服务出现了问题,还可以删除svn服务。具体如: sc delete 服务名        例如: sc delete svnserver
           (ii)把svnserve服务设置为自动启动。以后电脑启动时即启动svn服务器。
  四: 这样svn服务器就配置好了。然后就可以在svn客服端进行各种操作了。

     顺便说一下: 创建服务:sc create 服务名 binpath=  程序启动的位置 --service --root      
                           
-- 程序启动位置即:该软件启动的那个文件的位置(如:d:\xx\xxx\xxxx.exe)
                       删除服务:sc delete 服务名

posted @ 2012-12-21 01:02 奋斗成就男人 阅读(1370) | 评论 (0)编辑 收藏

用java实现验证码

<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//给定范围获得随机颜色
  Random random = new Random();
  if(fc>255) fc=255;
  if(bc>255) bc=255;
  int r=fc+random.nextInt(bc-fc);
  int g=fc+random.nextInt(bc-fc);
  int b=fc+random.nextInt(bc-fc);
  return new Color(r,g,b);
  }
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文
Graphics g = image.getGraphics();

//生成随机类
Random random = new Random();

// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));


// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
  int x = random.nextInt(width);
  int y = random.nextInt(height);
  int xl = random.nextInt(12);
  int yl = random.nextInt(12);
  g.drawLine(x,y,x+xl,y+yl);
}

// 取随机产生的认证码(4位数字)

String codeList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

String sRand="";


for (int i=0;i<4;i++){
int a=random.nextInt(codeList.length()-1);
  String rand=codeList.substring(a,a+1);
  sRand+=rand;
  // 将认证码显示到图象中
  g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
  g.drawString(rand,13*i+6,16);
}

// 将认证码存入SESSION
session.setAttribute("rand",sRand);

// 图象生效
g.dispose();

// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();


%> 

posted @ 2012-11-14 23:34 奋斗成就男人 阅读(187) | 评论 (0)编辑 收藏

HttpClient使用

背景:因为想写一个测试tomcat连接的程序,就试试自已去构造Http请求。找了一下发现Apache下有一个比较成熟的轮子HttpComponets.

 

使用库:Apache Http Client

HttpClient是一个代码级的Http客户端工具,可以使用它模拟浏览器向Http服务器发送请求。

其中HttpClient是HttpComponents项目其中的一部份,HttpComponents简称为hc.

http://hc.apache.org/

使用HttpClient还需要HttpCore.这里其中包括Http请求与Http响应的代码封装。

 

现在导入两个jar包:

httpclient-4.0.jar

httpcore-4.0.jar

httpmime-4.0.jar

 

开始一个请求代码如下:

Java代码 复制代码 收藏代码
  1. HttpClient httpClient = new DefaultHttpClient();   
  2. //构造请求,如果想使用POST则new一个HttpPost   
  3.         HttpGet get = new HttpGet("http://www.iteye.com");   
  4.         HttpResponse response = httpClient.execute(get);   
  5. //先从响应头得到实体   
  6.         HttpEntity entity = response.getEntity();      
  7. //得到实体输入流   
  8.         InputStream inSm = entity.getContent();   
  9.         Scanner inScn = new Scanner(inSm);   
  10.         while(inScn.hasNextLine()){   
  11.             System.out.println(inScn.nextLine());   
  12.         }   
  13.         entity.consumeContent();  
HttpClient httpClient = new DefaultHttpClient(); //构造请求,如果想使用POST则new一个HttpPost 		HttpGet get = new HttpGet("http://www.iteye.com"); 		HttpResponse response = httpClient.execute(get); //先从响应头得到实体 		HttpEntity entity = response.getEntity();	 //得到实体输入流 		InputStream inSm = entity.getContent(); 		Scanner inScn = new Scanner(inSm); 		while(inScn.hasNextLine()){ 			System.out.println(inScn.nextLine()); 		} 		entity.consumeContent();

 

这个是在HC例子中有代码作了少量的修改。

输出:

Java代码 复制代码 收藏代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">   
  3.   <head>   
  4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>   
  5.     <title>JavaEye Java编程 Spring框架 AJAX技术 Agile敏捷软件开发 ruby on rails实践 - JavaEye做最棒的软件开发交流社区</title>   
  6.     <meta name="description" content="Java编程,Spring Struts Webwork框架深入,XMLHTTP AJAX开发,Java Web开发,Java企业应用,Java设计模式,Java开源框架,Java应用服务器,Rich Client讨论,Ruby编程,Ruby DSL开发,Ruby on rails实践,JavaScript编程,敏捷软件开发XP TDD,软件配置管理,软件测试,项目管理UML,数据库,C#/.net C/C++ Erlang/FP PHP/Linux平台,精通Hibernate" />   
  7.     <meta name="keywords"  content="Java编程 Spring框架 AJAX技术 Agile敏捷软件开发 ruby on rails实践 JavaEye深度技术社区" />   
  8.     <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" />   
  9.     <link href="/rss" rel="alternate" title="JavaEye技术网站RSS频道订阅" type="application/rss+xml" />   
  10.     <link href="http://www.iteye.com/stylesheets/homepage.css?1263389049" media="screen" rel="stylesheet" type="text/css" />   
  11.        
  12.   </head>   
  13.   
  14. ...省略,证明以上代码已经成功  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">   <head>     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>     <title>JavaEye Java编程 Spring框架 AJAX技术 Agile敏捷软件开发 ruby on rails实践 - JavaEye做最棒的软件开发交流社区</title>     <meta name="description" content="Java编程,Spring Struts Webwork框架深入,XMLHTTP AJAX开发,Java Web开发,Java企业应用,Java设计模式,Java开源框架,Java应用服务器,Rich Client讨论,Ruby编程,Ruby DSL开发,Ruby on rails实践,JavaScript编程,敏捷软件开发XP TDD,软件配置管理,软件测试,项目管理UML,数据库,C#/.net C/C++ Erlang/FP PHP/Linux平台,精通Hibernate" />     <meta name="keywords"  content="Java编程 Spring框架 AJAX技术 Agile敏捷软件开发 ruby on rails实践 JavaEye深度技术社区" />     <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" />     <link href="/rss" rel="alternate" title="JavaEye技术网站RSS频道订阅" type="application/rss+xml" />     <link href="http://www.iteye.com/stylesheets/homepage.css?1263389049" media="screen" rel="stylesheet" type="text/css" />        </head>  ...省略,证明以上代码已经成功

 当然这个只是大刀一小试。现在还离我的目标差一点点:

需要做个头,我还不太清楚有什么头可以使用,那样我又写了个程序看看IE的头到底是怎样子的,

没有抓包程序,只好自已写个程序:

 

Java代码 复制代码 收藏代码
  1. ServerSocket socketServer = new ServerSocket(10086);   
  2. Socket client = socketServer.accept();   
  3. InputStream inClient = client.getInputStream();   
  4. Scanner inScn = new Scanner(inClient);   
  5. while(inScn.hasNextLine()){   
  6.     System.out.println(inScn.nextLine());   
  7. }   
  8. inScn.close();   
  9. client.close();   
  10. socketServer.close();  
		ServerSocket socketServer = new ServerSocket(10086); 		Socket client = socketServer.accept(); 		InputStream inClient = client.getInputStream(); 		Scanner inScn = new Scanner(inClient); 		while(inScn.hasNextLine()){ 			System.out.println(inScn.nextLine()); 		} 		inScn.close(); 		client.close(); 		socketServer.close();

 

在IE地址栏上输入:

http://locahost:10086/

点确定后可以得到程序输出:

 

Java代码 复制代码 收藏代码
  1. GET / HTTP/1.1  
  2. Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*   
  3. Accept-Language: zh-CN   
  4. User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 87; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)   
  5. Accept-Encoding: gzip, deflate   
  6. Host: localhost:10086  
  7. Connection: Keep-Alive  
GET / HTTP/1.1 Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 87; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Accept-Encoding: gzip, deflate Host: localhost:10086 Connection: Keep-Alive

 

分析请求包中这六个头信息。可以参考以下文章:

http://zsxxsz.iteye.com/blog/568250

 

现在我使用HC模拟IE的请求,修改后代码如下:

Java代码 复制代码 收藏代码
  1. HttpClient httpClient = new DefaultHttpClient();   
  2.         HttpGet get = new HttpGet("http://www.iteye.com");   
  3.            
  4.         get.setHeader("Accept", "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*");   
  5.         get.setHeader("Accept-Language","zh-CN");   
  6.         get.setHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 87; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)");   
  7.         get.setHeader("Accept-Encoding","gzip, deflate");   
  8.         get.setHeader("Host","you never be know");   
  9.         get.setHeader("Connection","Keep-Alive");   
  10.            
  11.         HttpResponse response = httpClient.execute(get);  

posted @ 2012-11-08 02:45 奋斗成就男人 阅读(619) | 评论 (0)编辑 收藏

HTTP 协议简介

一、TCP/IP 协议介绍

  在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容。TCP/IP协议是分层的,从底层至应用层分别为:物理层、链路层、网络层、传输层和应用层,如下图所示:

 

 

TCP/IP基础--层次图

 

  从应用层至物理层,数据是一层层封装,封装的方式一般都是在原有数据的前面加一个数据控制头,数据封装格式如下:

 

TCP/IP基础--数据封装

 

  其中,对于TCP传输协议,客户端在于服务器建立连接前需要经过TCP三层握手,过程如下:

 

TCP/IP基础--TCP三次握手

 

二、HTTP协议

2.1 简介

  超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议,自 1990 年起,HTTP 就已经被应用于 WWW 全球信息服务系统。
  HTTP 是一种请求/响应式的协议。一个客户机与服务器建立连接后,发送一个请求给服务器;服务器接到请求后,给予相应的响应信息。
  HTTP 的第一版本 HTTP/0.9是一种简单的用于网络间原始数据传输的协议;
  HTTP/1.0由 RFC 1945 定义 ,在原 HTTP/0.9 的基础上,有了进一步的改进,允许消息以类 MIME 信息格式存 在,包括请求/响应范式中的已传输数据和修饰符等方面的信息;
  HTTP/1.1(RFC2616) 的要求更加严格以确保服务的可靠性,增强了在HTTP/1.0 没有充分考虑到分层代理服务器、高速缓冲存储器、持久连接需求或虚拟主机等方面的效能;
  安全增强版的 HTTP (即S-HTTP或HTTPS),则是HTTP协议与安全套接口层(SSL)的结合,使HTTP的协议数据在传输过程中更加安全。

 

2.2 协议结构

  HTTP协议格式也比较简单,格式如下:

 

 

HTTP协议--协议结构

 

2.3 HTTP 协议举例

  下面是一个HTTP请求及响应的例子:

 

2.4 请求头格式

a) 通用头(general-header):
Cache-Control:客户端希望服务端如何缓存自己的请求数据,如"Cache-Control: no-cache","Cache-Control: max-age=0";
Connection:客户端是否希望与服务端之间保持长连接,如"Connection: close", "Connection: keep-alive";
Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段;
Pragma:包含了客户端一些特殊请求信息,如 "Pragma: no-cache" 客户端希望代理或应用服务器不应缓存与该请求相关的结果数据;
Via:一般用在代理网关向应用服务器发送的请求头中,表明该来自客户端的请求经过了网关代理,
     格式为:"Via: 请求协议版本 网关标识   [其它信息] ",
     如 :" Via: 1.1  webcache_250_199.hexun.com:80 (squid)"

 

b) 请求头(request-header):
Accept:表明客户同端可接受的请求回应的媒体类型范围列表。星号“*”用于按范围将类型分组,用“*/*”指示可接受全部类型;用“type/*”指示可接受 type类型的所有子类型,如“ Accept: image/gif, image/jpeg, */*”;
Accept-Charset:客户端所能识别的字符集编码格式,格式:“Accept-Charset: 字符集1[:权重],字符集2[:权重]”,如:“ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8”;
Accept-Language:客户端所能识别的语言,格式:“Accept-Language: 语言1[:权重],语言2[:权重]”,如:” Accept-Language: zh, en;q=0.7”;
Host:客户请求的主机域名或主机IP,格式:“Host: 域名或IP[:端口号]”,如:“Host: www.hexun.com:80“,请求行中若有HTTP/1.1则必须有该请求头;
User-Agent:表明用户所使用的浏览器标识,主要用于统计的目的;
Referer:指明该请求是从哪个关联连接而来;

Accept-Encoding:客户端所能识别的编码压缩格式,如:“Accept-Encoding: gzip, deflate”;
If- Modified-Since:该字段与客户端缓存相关,客户端所访问的URL自该指定日期以来在服务端是否被修改过,如果修改过则服务端返回新的修改后的信息,如果未修改过则服务器返回304表明此请求所指URL未曾修改过,如:“If-Modified-Since: Fri, 2 Sep 2006 19:37:36 GMT”;
If-None-Match:该字段与客户端缓存相关,客户端发送URL请求的同时发送该字段及标识,如果服务端的标识与客户端的标识一致,则返回304表明此URL未修改过,如果不一致则服务端返回完整的数据信息,如:“If-None-Match: 0f0a893aad8c61:253, 0f0a893aad8c61:252, 0f0a893aad8c61:251”;
Cookie:为扩展字段,存储于客户端,向同一域名的服务端发送属于该域的cookie,如:“Cookie: MailUserName=whouse”;

 

c) 实体头(entity-header): (此类头存在时要求有数据体)
Content-Encoding:客户端所能识别的编码压缩格式,如:“Content-Encoding: gzip, deflate”;
Content-Length:客户端以POST方法上传数据时数据体部分的内容长度,如:“ Content-Length: 24”;
Content- Type:客户端发送的数据体的内容类型,如:“Content-Type: application/x-www-form-urlencoded”为以普通的POST方法发送的数据;“Content-Type: multipart/form-data; boundary=---------------------------5169208281820”,则表明数据体由多部分组成,分隔符为 “-----------------------------5169208281820”;

 

2.5)响应格式

a) 通用头(general-header):
Cache- Control:服务端要求中间代理及客户端如何缓存自己响应的数据,如“Cache-Control: no-cache”,如:“Cache-Control: private” 不希望被缓存,“Cache-Control: public” 可以被缓存;
Connection:服务端是否希望与客户端之间保持长连接,如“Connection: close”, “Connection: keep-alive”;
Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段;
Pragma:包含了服务端一些特殊响应信息,如 “Pragma: no-cache” 服务端希望代理或客户端不应缓存结果数据;
Transfer-Encoding:服务端向客户端传输数据所采用的传输模式(仅在HTTP1.1中出现),如:“Transfer-Encoding: chunked”,注:该字段的优先级要高于“Content-Length” 字段的优先级;

 

b)响应头(response-header):
Accept-Ranges:表明服务端接收的数据单位,如:“Accept-Ranges: bytes”, ;
Location:服务端向客户端返回此信息以使客户端进行重定向,如:“Location: http://www.hexun.com”;
Server:服务端返回的用于标识自己的一些信息,如:“ Server: Microsoft-IIS/6.0”;
ETag:服务端返回的响应数据的标识字段,客户端可根据此字段的值向服务器发送某URL是否更新的信息;

 

c)实体头(entity-header): (此类头存在时要求有数据体)
Content-Encoding:服务端所响应数据的编码格式,如:“Content-Encoding: gzip”;
Content-Length:服务端所返回数据的数据体部分的内容长度,如:“ Content-Length: 24”;
Content-Type:服务端所返回的数据体的内容类型,如:“Content-Type: text/html; charset=gb2312” ;
Set-Cookie:服务端返回给客户端的cookie数据,如:“ Set-Cookie: ASP.NET_SessionId=icnh2ku2dqlmkciyobgvzl55; path=/”

 

2.6)服务器返回状态码

1xx:表明服务端接收了客户端请求,客户端继续发送请求;
2xx:客户端发送的请求被服务端成功接收并成功进行了处理;
3xx:服务端给客户端返回用于重定向的信息;
4xx:客户端的请求有非法内容;
5xx:服务端未能正常处理客户端的请求而出现意外错误。

 

举例:

“100”  ; 服务端希望客户端继续;
“200”  ; 服务端成功接收并处理了客户端的请求;
“301”  ; 客户端所请求的URL已经移走,需要客户端重定向到其它的URL;
“304”  ; 客户端所请求的URL未发生变化;
“400”  ; 客户端请求错误;
“403”  ; 客户端请求被服务端所禁止;
“404”  ; 客户端所请求的URL在服务端不存在;
“500”  ; 服务端在处理客户端请求时出现异常;
“501”  ; 服务端未实现客户端请求的方法或内容;
“502”  ; 此为中间代理返回给客户端的出错信息,表明服务端返回给代理时出错;
“503”  ; 服务端由于负载过高或其它错误而无法正常响应客户端请求;
“504”  ; 此为中间代理返回给客户端的出错信息,表明代理连接服务端出现超时。

 

2.7)chunked 传输

  编码使用若干个Chunk组成,由一个标明长度为0的chunk结束,每个Chunk有两部分组成,第一部分是该Chunk的长度(以十六进制表示)和长度单位(一般不写),第二部分就是指定长度的内容,每个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些没有写的头部内容。另外,在HTTP头里必须含有:” Transfer-Encoding: chunked” 通用头字段。格式如下:

chunked 传输

 

2.8)HTTP 请求方法

GET、POST、HEAD、CONNECT、PUT、DELETE、TRACE

 

2.9)举例

a)GET请求

Html代码 复制代码 收藏代码

  1. GET http://photo.test.com/inc/global.js HTTP/1.1   
  2. Host: photo.test.com   
  3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0   
  4. Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5   
  5. Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3   
  6. Accept-Encoding: gzip,deflate   
  7. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7   
  8. Keep-Alive: 300   
  9. Proxy-Connection: keep-alive   
  10. Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45  
  11. Cache-Control: max-age=0  

GET http://photo.test.com/inc/global.js HTTP/1.1

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0

Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3

Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45

 

b)POST请求

Html代码 复制代码 收藏代码

  1. POST / HTTP/1.1   
  2. Accept: image/gif, image/x-xbitmap, image/jpeg, application/vnd.ms-powerpoint, application/msword, */*   
  3. Accept-Language: zh-cn   
  4. Content-Type: application/x-www-form-urlencoded   
  5. Accept-Encoding: gzip, deflate   
  6. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)   
  7. Host: www.test.com   
  8. Content-Length: 24   
  9. Connection: Keep-Alive   
  10. Cache-Control: no-cache   
  11.   
  12. name=value&submitsubmit=submit  

Accept: image/gif, image/x-xbitmap, image/jpeg, application/vnd.ms-powerpoint, application/msword, */*

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)

 

c)通过HTTP代理发送GET请求

Html代码 复制代码 收藏代码

  1. GET http://mail.test.com/ HTTP/1.1   
  2. Host: mail.test.com   
  3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0   
  4. Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5   
  5. Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3   
  6. Accept-Encoding: gzip,deflate   
  7. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7   
  8. Keep-Alive: 300   
  9. Proxy-Connection: keep-alive  

GET http://mail.test.com/ HTTP/1.1

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0

Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3

Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

 

d)POST方式上传文件

Html代码 复制代码 收藏代码

  1. POST http://www.test.comt/upload_attach?uidl=%3C HTTP/1.1   
  2. Host: www.test.com   
  3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0   
  4. Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5   
  5. Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3   
  6. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7   
  7. Content-Type: multipart/form-data; boundary=---------------------------5169208281820   
  8. Content-Length: 449   
  9.   
  10. -----------------------------5169208281820   
  11. Content-Disposition: form-data; name="file_1"filename=""  
  12. Content-Type: application/octet-stream   
  13.   
  14.   
  15. -----------------------------5169208281820   
  16. Content-Disposition: form-data; name="file_0"filename="test.txt"  
  17. Content-Type: text/plain   
  18.   
  19. hello world!   
  20.   
  21. -----------------------------5169208281820   
  22. Content-Disposition: form-data; name="oper"  
  23.   
  24. upload   
  25. -----------------------------5169208281820--  

POST http://www.test.comt/upload_attach?uidl=%3C HTTP/1.1

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0

Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3

Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

Content-Type: multipart/form-data; boundary=---------------------------5169208281820

Content-Disposition: form-data; name="file_1"; filename=""

Content-Type: application/octet-stream

Content-Disposition: form-data; name="file_0"; filename="test.txt"

Content-Disposition: form-data; name="oper"

 

e)CONNECT举例

Html代码 复制代码 收藏代码

  1. CONNECT mail.test.com:80 HTTP/1.1   
  2. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0   
  3. Proxy-Connection: keep-alive   
  4. Host: mail.test.com:80  

CONNECT mail.test.com:80 HTTP/1.1

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0

 

3.0)在终端以 telnet 方式测试

a)打开回显功能(针对windows)
  Windows 2000:进入DOS模式->输入 telnet->set LOCAL_ECHO->退出:quit->telnet ip 80
  Windows xp:进入DOS模式->输入telnet->set local echo->open ip 80
b) 按HTTP协议格式输入GET请求、HEAD请求、POST请求。

 

posted @ 2012-11-08 02:44 奋斗成就男人 阅读(218) | 评论 (0)编辑 收藏

按某一字段分组取最大(小)值所在行的数据

     摘要: /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1-...  阅读全文

posted @ 2012-11-02 19:21 奋斗成就男人 阅读(364) | 评论 (0)编辑 收藏

公钥与私钥

数字签名是什么?

作者:David Youd

翻译:阮一峰

原文网址:http://www.youdzone.com/signature.html

1.

鲍勃有两把钥匙,一把是公钥,另一把是私钥。

2.

鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。

3.

苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。

4.

鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

5.

鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。

6.

然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。

7.

鲍勃将这个签名,附在信件下面,一起发给苏珊。

8.

苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

9.

苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。

10.

复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。

11.

后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。

12.

鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。

13.

苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。

14.

下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。

15.

首先,客户端向服务器发出加密请求。

16.

服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。

17.

客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

18.

如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

19.

如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

20.

posted @ 2012-10-15 02:37 奋斗成就男人 阅读(42313) | 评论 (31)编辑 收藏

仅列出标题
共23页: First 上一页 9 10 11 12 13 14 15 16 17 下一页 Last