yxhxj2006

          常用鏈接

          統(tǒng)計(jì)

          最新評論

          #

          用gmail smtp發(fā)送郵件

          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();
              }
          }
          結(jié)果老是報(bào)如下的錯誤
          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)
           折騰了個把小時,苦苦尋求后發(fā)現(xiàn)一個解決辦法 
          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"); 
          究其原因也不太清楚,網(wǎng)上有資料說port 587也可以,不知結(jié)果不行
          把上述代碼中的 

          posted @ 2013-03-08 15:16 奮斗成就男人 閱讀(1149) | 評論 (0)編輯 收藏

          Json-lib使用——JSONObject與JSONArray

          1.從Object到String
           要先用Object對象構(gòu)造一個JSONObject或者JSONArray對象,然后調(diào)用它的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)示例二

          復(fù)制代碼
           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 //結(jié)果如下:
          14 [{"name":"Java","price":52.3},{"name":"C","price":42.3}]
          復(fù)制代碼

          2.從String到Object
           要先用String對象構(gòu)造一個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)示例二

          復(fù)制代碼
          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 }
          復(fù)制代碼

          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的數(shù)組

          復(fù)制代碼
          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 }
          復(fù)制代碼

          自定義封裝JSON操作的類

          復(fù)制代碼
           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轉(zhuǎn)換為字符串
          11 public static String getJson(Object o){

          12 JSONObject jo=JSONObject.fromObject(o);
          13 return jo.toString();
          14 }
          15 //從Java的列表轉(zhuǎn)換為字符串
          16 public static String getJson(List list){

          17 JSONArray ja=JSONArray.fromObject(list);
          18 return ja.toString();
          19 }
          20 //從Java對象數(shù)組轉(zhuǎn)換為字符串
          21 public static String getJson(Object[] arry){

          22 JSONArray ja=JSONArray.fromObject(arry);
          23 return ja.toString();
          24 }
          25 //從json格式的字符串轉(zhuǎn)換為Map對象
          26 public static Map getObject(String s){

          27 return JSONObject.fromObject(s);
          28 }
          29 //從json格式的字符串轉(zhuǎn)換為List數(shù)組
          30 public static List getArray(String s){

          31 return JSONArray.fromObject(s);
          32 }
          33 //從json格式的字符串轉(zhuǎn)換為某個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格式的字符串轉(zhuǎn)換為某類對象的數(shù)組
          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 奮斗成就男人 閱讀(822) | 評論 (0)編輯 收藏

          Java日志管理:Logger.getLogger()和LogFactory.getLog()的區(qū)別(詳解Log4j)

               摘要: 第一、Logger.getLogger()和LogFactory.getLog()的區(qū)別    1.Logger.getLogger()是使用log4j的方式記錄日志;    2.LogFactory.getLog()則來自apache的common-logging包。common-logging組件: &n...  閱讀全文

          posted @ 2012-12-26 00:45 奮斗成就男人 閱讀(6046) | 評論 (0)編輯 收藏

          log4j配置日志

          懂行的人都知道,log4j日志是個很基礎(chǔ)的東東,與struts這種高層框架無關(guān),只與web開發(fā)了的tomcat有關(guān)。這里之所以寫出struts,是因?yàn)楣P者一開始用struts的時候,以為是這樣,也是這樣google的。好了,言歸正傳,開工了
          給tomcat配置log4j有好幾種方法,我知道的有:
          一、tomcat級別的統(tǒng)一日志管理(沒有實(shí)際驗(yàn)證過,只是查了資料):
          在tomcat的common/lib下增加log4j的.jar包,以便程序使用的時候,能夠加載到。
          在自己的webapps的WEB-INF/classes下添加log4j.properties配置,所有的東西都是自動的
           
          這種方式的缺點(diǎn)很明顯,一個tomcat可能會多個子webapps,都統(tǒng)一到一個日志下,非常不便于管理。所以重點(diǎn)看下面
           
          二、每個webapp分別配置log4j(切實(shí)可行的實(shí)踐經(jīng)驗(yàn))
          1、在自己youapp的WEB-INF/lib下增加log4j-xxx.jar文件
          2、自己寫一個servlet,初始化log4j的相關(guān)配置信息:
          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文件,內(nèi)容如下:
          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應(yīng)用目錄下看到logs目錄和對應(yīng)的log文件
          #:這里說道的webapp目錄是指:c:\program files\tomcat\webapps\youapp目錄
          6、在你的app目錄下創(chuàng)建一個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>  
          在你的瀏覽器調(diào)用下這個jsp,就可以看到日志內(nèi)容了。
           
          本方法在windows和linux下都通用,完全一樣。
          只與log4j.properties的詳細(xì)配置方法,網(wǎng)上隨便google下都有一籮筐,照抄就是了。

          posted @ 2012-12-25 00:52 奮斗成就男人 閱讀(1059) | 評論 (0)編輯 收藏

          SVN的服務(wù)器的配置

              
              一: SVN包括:服務(wù)器端(Subversion)和客服端(TortoiseSVN),安裝時,建議先安裝服務(wù)器端,再安裝客服端(因?yàn)榘惭b完客服端后需要重啟電腦)。

              二:安裝完成后,創(chuàng)建服務(wù)器版本庫:創(chuàng)建一個文件夾(比如:D:\\svnserver),然后右鍵:TortoiseSVN ----> create respository here,然后在該目錄下生成六個文件(conf文件           夾、 db文件夾、hooks文件夾、locks文件夾、format文件和README.txt),其中配置文件在conf文件夾中。 其中conf文件夾下包含三個文件:authz(配置用戶權(quán)限:讀,寫權(quán)限         等 等)、
              passwd(配置用戶名和密碼)和svnserve.conf(svn的核心配置)。
              其中:
              1: passwd配置:在該文件中,創(chuàng)建用戶的方式為:  用戶名 = 密碼 ,例如:創(chuàng)建用戶名為:admin,密碼為abcd,即為:admin = abcd
              2: svnserve.conf配置:開啟用戶訪問的功能:即只需開啟: password-db = passwd 即可,具體操作:把password-db = passwd 前面的#去除即可。否則其他用戶不能訪問。
                                              開啟用戶權(quán)限的功能:即只需開啟: authz-db = authz 即可,具體操作:把a(bǔ)uthz-db = authz  前面的#去除即可。否則配置的用戶權(quán)限將不生效。 
                
              3:authz 配置:找到該文件的 [groups] :在下一行:有兩種方式配置權(quán)限:
                   (1): 權(quán)限名稱  = 用戶名  ,然后在相應(yīng)的目錄: 權(quán)限名稱 = 權(quán)限(比如:rw)例如: 
                              [groups]                -- 給權(quán)限分組,有利于多個用戶批量分配權(quán)限。
                              adm = admin         -- adm 為組權(quán)限名稱,類似常說的“角色”,admin為用戶名,= 前后最后加上一個空格。  
                              [/]                        -- / 表示svn服務(wù)器的跟目錄下,當(dāng)然也可以用其他的目錄。比如:[/a/b/] 表示為/a/b/ 目錄下分配目錄權(quán)限
                              @adm = rw           -- @表示組, adm表示組名,r表示只讀,即下載功能;r表示只寫,即上傳功能。
                   (2):直接在相應(yīng)的目錄下:用戶名 = 權(quán)限(比如:rw) 例如: 
                             admin = rw            -- admin 為用戶名,rw表示讀寫權(quán)限。
             如果 svnserve.conf 的authz-db = authz 不開啟。則權(quán)限分配則無效。當(dāng)然這樣用戶也是可以上傳和下載的。
             三:開啟SVN服務(wù):
             (1):臨時開啟,在dos界面中輸入: svnserver  -d -r + svn服務(wù)器版本庫目錄  例如:svn版本庫目錄為:D:\\svnserver ,即為:
                         svnserver  -d -r D:\\svnserver           -- 注意:-d, -r ,svn服務(wù)器版本庫目錄中間需要用空格隔開。而一旦關(guān)閉dos界面是,svn服務(wù)器也隨之關(guān)閉。
             (2):永久開啟:即電腦啟動時自動開啟svn服務(wù)器。這樣需要把svn創(chuàng)建一個服務(wù),然后把該服務(wù)器設(shè)置為自動啟動即可。具體操作:
                       (i) : 創(chuàng)建服務(wù):在dos界面中輸入:
                       sc create svnserver binpath= svnserve.exe目錄 --service --root svn版本庫目錄                -- 注意:=與svnserve.exe之間必須要加一個空格
                       例如svn服務(wù)器安裝在:D:\J2EE\SVN\Subversion目錄下
                       則為: sc create svnserver binpath= "D:\J2EE\SVN\Subversion\bin\svnserve.exe --service --root  D:\\svnserver"     -- 雙引號不可缺少
                      然后:如果創(chuàng)建服務(wù)沒有問題,則輸入:services.msc 到電腦服務(wù)列表中會找到一個:svnserve服務(wù)。如果創(chuàng)建svn服務(wù)失敗,則無法找到svnserve服務(wù)。 
                      如果創(chuàng)建svn服務(wù)出現(xiàn)了問題,還可以刪除svn服務(wù)。具體如: sc delete 服務(wù)名        例如: sc delete svnserver
                     (ii)把svnserve服務(wù)設(shè)置為自動啟動。以后電腦啟動時即啟動svn服務(wù)器。
            四: 這樣svn服務(wù)器就配置好了。然后就可以在svn客服端進(jìn)行各種操作了。

               順便說一下: 創(chuàng)建服務(wù):sc create 服務(wù)名 binpath=  程序啟動的位置 --service --root      
                                     
          -- 程序啟動位置即:該軟件啟動的那個文件的位置(如:d:\xx\xxx\xxxx.exe)
                                 刪除服務(wù):sc delete 服務(wù)名

          posted @ 2012-12-21 01:02 奮斗成就男人 閱讀(1377) | 評論 (0)編輯 收藏

          用java實(shí)現(xiàn)驗(yàn)證碼

          <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
          <%!
          Color getRandColor(int fc,int bc){//給定范圍獲得隨機(jī)顏色
            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);
            }
          %>
          <%
          //設(shè)置頁面不緩存
          response.setHeader("Pragma","No-cache");
          response.setHeader("Cache-Control","no-cache");
          response.setDateHeader("Expires", 0);

          // 在內(nèi)存中創(chuàng)建圖象
          int width=60, height=20;
          BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

          // 獲取圖形上下文
          Graphics g = image.getGraphics();

          //生成隨機(jī)類
          Random random = new Random();

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

          //設(shè)定字體
          g.setFont(new Font("Times New Roman",Font.PLAIN,18));


          // 隨機(jī)產(chǎn)生155條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測到
          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);
          }

          // 取隨機(jī)產(chǎn)生的認(rèn)證碼(4位數(shù)字)

          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;
            // 將認(rèn)證碼顯示到圖象中
            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//調(diào)用函數(shù)出來的顏色相同,可能是因?yàn)榉N子太接近,所以只能直接生成
            g.drawString(rand,13*i+6,16);
          }

          // 將認(rèn)證碼存入SESSION
          session.setAttribute("rand",sRand);

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

          // 輸出圖象到頁面
          ImageIO.write(image, "JPEG", response.getOutputStream());
          out.clear();
          out = pageContext.pushBody();


          %> 

          posted @ 2012-11-14 23:34 奮斗成就男人 閱讀(191) | 評論 (0)編輯 收藏

          HttpClient使用

          背景:因?yàn)橄雽懸粋€測試tomcat連接的程序,就試試自已去構(gòu)造Http請求。找了一下發(fā)現(xiàn)Apache下有一個比較成熟的輪子HttpComponets.

           

          使用庫:Apache Http Client

          HttpClient是一個代碼級的Http客戶端工具,可以使用它模擬瀏覽器向Http服務(wù)器發(fā)送請求。

          其中HttpClient是HttpComponents項(xiàng)目其中的一部份,HttpComponents簡稱為hc.

          http://hc.apache.org/

          使用HttpClient還需要HttpCore.這里其中包括Http請求與Http響應(yīng)的代碼封裝。

           

          現(xiàn)在導(dǎo)入兩個jar包:

          httpclient-4.0.jar

          httpcore-4.0.jar

          httpmime-4.0.jar

           

          開始一個請求代碼如下:

          Java代碼 復(fù)制代碼 收藏代碼
          1. HttpClient httpClient = new DefaultHttpClient();   
          2. //構(gòu)造請求,如果想使用POST則new一個HttpPost   
          3.         HttpGet get = new HttpGet("http://www.iteye.com");   
          4.         HttpResponse response = httpClient.execute(get);   
          5. //先從響應(yīng)頭得到實(shí)體   
          6.         HttpEntity entity = response.getEntity();      
          7. //得到實(shí)體輸入流   
          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(); //構(gòu)造請求,如果想使用POST則new一個HttpPost 		HttpGet get = new HttpGet("http://www.iteye.com"); 		HttpResponse response = httpClient.execute(get); //先從響應(yīng)頭得到實(shí)體 		HttpEntity entity = response.getEntity();	 //得到實(shí)體輸入流 		InputStream inSm = entity.getContent(); 		Scanner inScn = new Scanner(inSm); 		while(inScn.hasNextLine()){ 			System.out.println(inScn.nextLine()); 		} 		entity.consumeContent();

           

          這個是在HC例子中有代碼作了少量的修改。

          輸出:

          Java代碼 復(fù)制代碼 收藏代碼
          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技術(shù) Agile敏捷軟件開發(fā) ruby on rails實(shí)踐 - JavaEye做最棒的軟件開發(fā)交流社區(qū)</title>   
          6.     <meta name="description" content="Java編程,Spring Struts Webwork框架深入,XMLHTTP AJAX開發(fā),Java Web開發(fā),Java企業(yè)應(yīng)用,Java設(shè)計(jì)模式,Java開源框架,Java應(yīng)用服務(wù)器,Rich Client討論,Ruby編程,Ruby DSL開發(fā),Ruby on rails實(shí)踐,JavaScript編程,敏捷軟件開發(fā)XP TDD,軟件配置管理,軟件測試,項(xiàng)目管理UML,數(shù)據(jù)庫,C#/.net C/C++ Erlang/FP PHP/Linux平臺,精通Hibernate" />   
          7.     <meta name="keywords"  content="Java編程 Spring框架 AJAX技術(shù) Agile敏捷軟件開發(fā) ruby on rails實(shí)踐 JavaEye深度技術(shù)社區(qū)" />   
          8.     <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" />   
          9.     <link href="/rss" rel="alternate" title="JavaEye技術(shù)網(wǎng)站RSS頻道訂閱" type="application/rss+xml" />   
          10.     <link  />   
          11.        
          12.   </head>   
          13.   
          14. ...省略,證明以上代碼已經(jīng)成功  
          <!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技術(shù) Agile敏捷軟件開發(fā) ruby on rails實(shí)踐 - JavaEye做最棒的軟件開發(fā)交流社區(qū)</title>     <meta name="description" content="Java編程,Spring Struts Webwork框架深入,XMLHTTP AJAX開發(fā),Java Web開發(fā),Java企業(yè)應(yīng)用,Java設(shè)計(jì)模式,Java開源框架,Java應(yīng)用服務(wù)器,Rich Client討論,Ruby編程,Ruby DSL開發(fā),Ruby on rails實(shí)踐,JavaScript編程,敏捷軟件開發(fā)XP TDD,軟件配置管理,軟件測試,項(xiàng)目管理UML,數(shù)據(jù)庫,C#/.net C/C++ Erlang/FP PHP/Linux平臺,精通Hibernate" />     <meta name="keywords"  content="Java編程 Spring框架 AJAX技術(shù) Agile敏捷軟件開發(fā) ruby on rails實(shí)踐 JavaEye深度技術(shù)社區(qū)" />     <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" />     <link href="/rss" rel="alternate" title="JavaEye技術(shù)網(wǎng)站RSS頻道訂閱" type="application/rss+xml" />     <link  media="screen" rel="stylesheet" type="text/css" />        </head>  ...省略,證明以上代碼已經(jīng)成功

           當(dāng)然這個只是大刀一小試。現(xiàn)在還離我的目標(biāo)差一點(diǎn)點(diǎn):

          需要做個頭,我還不太清楚有什么頭可以使用,那樣我又寫了個程序看看IE的頭到底是怎樣子的,

          沒有抓包程序,只好自已寫個程序:

           

          Java代碼 復(fù)制代碼 收藏代碼
          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/

          點(diǎn)確定后可以得到程序輸出:

           

          Java代碼 復(fù)制代碼 收藏代碼
          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

           

          現(xiàn)在我使用HC模擬IE的請求,修改后代碼如下:

          Java代碼 復(fù)制代碼 收藏代碼
          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 奮斗成就男人 閱讀(629) | 評論 (0)編輯 收藏

          HTTP 協(xié)議簡介

          一、TCP/IP 協(xié)議介紹

            在介紹 HTTP 協(xié)議之前,先簡單說一下TCP/IP協(xié)議的相關(guān)內(nèi)容。TCP/IP協(xié)議是分層的,從底層至應(yīng)用層分別為:物理層、鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層,如下圖所示:

           

           

          TCP/IP基礎(chǔ)--層次圖

           

            從應(yīng)用層至物理層,數(shù)據(jù)是一層層封裝,封裝的方式一般都是在原有數(shù)據(jù)的前面加一個數(shù)據(jù)控制頭,數(shù)據(jù)封裝格式如下:

           

          TCP/IP基礎(chǔ)--數(shù)據(jù)封裝

           

            其中,對于TCP傳輸協(xié)議,客戶端在于服務(wù)器建立連接前需要經(jīng)過TCP三層握手,過程如下:

           

          TCP/IP基礎(chǔ)--TCP三次握手

           

          二、HTTP協(xié)議

          2.1 簡介

            超文本傳輸協(xié)議(Hypertext Transfer Protocol,簡稱HTTP)是應(yīng)用層協(xié)議,自 1990 年起,HTTP 就已經(jīng)被應(yīng)用于 WWW 全球信息服務(wù)系統(tǒng)。
            HTTP 是一種請求/響應(yīng)式的協(xié)議。一個客戶機(jī)與服務(wù)器建立連接后,發(fā)送一個請求給服務(wù)器;服務(wù)器接到請求后,給予相應(yīng)的響應(yīng)信息。
            HTTP 的第一版本 HTTP/0.9是一種簡單的用于網(wǎng)絡(luò)間原始數(shù)據(jù)傳輸?shù)膮f(xié)議;
            HTTP/1.0由 RFC 1945 定義 ,在原 HTTP/0.9 的基礎(chǔ)上,有了進(jìn)一步的改進(jìn),允許消息以類 MIME 信息格式存 在,包括請求/響應(yīng)范式中的已傳輸數(shù)據(jù)和修飾符等方面的信息;
            HTTP/1.1(RFC2616) 的要求更加嚴(yán)格以確保服務(wù)的可靠性,增強(qiáng)了在HTTP/1.0 沒有充分考慮到分層代理服務(wù)器、高速緩沖存儲器、持久連接需求或虛擬主機(jī)等方面的效能;
            安全增強(qiáng)版的 HTTP (即S-HTTP或HTTPS),則是HTTP協(xié)議與安全套接口層(SSL)的結(jié)合,使HTTP的協(xié)議數(shù)據(jù)在傳輸過程中更加安全。

           

          2.2 協(xié)議結(jié)構(gòu)

            HTTP協(xié)議格式也比較簡單,格式如下:

           

           

          HTTP協(xié)議--協(xié)議結(jié)構(gòu)

           

          2.3 HTTP 協(xié)議舉例

            下面是一個HTTP請求及響應(yīng)的例子:

           

          2.4 請求頭格式

          a) 通用頭(general-header):
          Cache-Control:客戶端希望服務(wù)端如何緩存自己的請求數(shù)據(jù),如"Cache-Control: no-cache","Cache-Control: max-age=0";
          Connection:客戶端是否希望與服務(wù)端之間保持長連接,如"Connection: close", "Connection: keep-alive";
          Date:只有當(dāng)請求方法為POST或PUT方法時客戶端才可能會有些字段;
          Pragma:包含了客戶端一些特殊請求信息,如 "Pragma: no-cache" 客戶端希望代理或應(yīng)用服務(wù)器不應(yīng)緩存與該請求相關(guān)的結(jié)果數(shù)據(jù);
          Via:一般用在代理網(wǎng)關(guān)向應(yīng)用服務(wù)器發(fā)送的請求頭中,表明該來自客戶端的請求經(jīng)過了網(wǎng)關(guān)代理,
               格式為:"Via: 請求協(xié)議版本 網(wǎng)關(guān)標(biāo)識   [其它信息] ",
               如 :" Via: 1.1  webcache_250_199.hexun.com:80 (squid)"

           

          b) 請求頭(request-header):
          Accept:表明客戶同端可接受的請求回應(yīng)的媒體類型范圍列表。星號“*”用于按范圍將類型分組,用“*/*”指示可接受全部類型;用“type/*”指示可接受 type類型的所有子類型,如“ Accept: image/gif, image/jpeg, */*”;
          Accept-Charset:客戶端所能識別的字符集編碼格式,格式:“Accept-Charset: 字符集1[:權(quán)重],字符集2[:權(quán)重]”,如:“ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8”;
          Accept-Language:客戶端所能識別的語言,格式:“Accept-Language: 語言1[:權(quán)重],語言2[:權(quán)重]”,如:” Accept-Language: zh, en;q=0.7”;
          Host:客戶請求的主機(jī)域名或主機(jī)IP,格式:“Host: 域名或IP[:端口號]”,如:“Host: www.hexun.com:80“,請求行中若有HTTP/1.1則必須有該請求頭;
          User-Agent:表明用戶所使用的瀏覽器標(biāo)識,主要用于統(tǒng)計(jì)的目的;
          Referer:指明該請求是從哪個關(guān)聯(lián)連接而來;

          Accept-Encoding:客戶端所能識別的編碼壓縮格式,如:“Accept-Encoding: gzip, deflate”;
          If- Modified-Since:該字段與客戶端緩存相關(guān),客戶端所訪問的URL自該指定日期以來在服務(wù)端是否被修改過,如果修改過則服務(wù)端返回新的修改后的信息,如果未修改過則服務(wù)器返回304表明此請求所指URL未曾修改過,如:“If-Modified-Since: Fri, 2 Sep 2006 19:37:36 GMT”;
          If-None-Match:該字段與客戶端緩存相關(guān),客戶端發(fā)送URL請求的同時發(fā)送該字段及標(biāo)識,如果服務(wù)端的標(biāo)識與客戶端的標(biāo)識一致,則返回304表明此URL未修改過,如果不一致則服務(wù)端返回完整的數(shù)據(jù)信息,如:“If-None-Match: 0f0a893aad8c61:253, 0f0a893aad8c61:252, 0f0a893aad8c61:251”;
          Cookie:為擴(kuò)展字段,存儲于客戶端,向同一域名的服務(wù)端發(fā)送屬于該域的cookie,如:“Cookie: MailUserName=whouse”;

           

          c) 實(shí)體頭(entity-header): (此類頭存在時要求有數(shù)據(jù)體)
          Content-Encoding:客戶端所能識別的編碼壓縮格式,如:“Content-Encoding: gzip, deflate”;
          Content-Length:客戶端以POST方法上傳數(shù)據(jù)時數(shù)據(jù)體部分的內(nèi)容長度,如:“ Content-Length: 24”;
          Content- Type:客戶端發(fā)送的數(shù)據(jù)體的內(nèi)容類型,如:“Content-Type: application/x-www-form-urlencoded”為以普通的POST方法發(fā)送的數(shù)據(jù);“Content-Type: multipart/form-data; boundary=---------------------------5169208281820”,則表明數(shù)據(jù)體由多部分組成,分隔符為 “-----------------------------5169208281820”;

           

          2.5)響應(yīng)格式

          a) 通用頭(general-header):
          Cache- Control:服務(wù)端要求中間代理及客戶端如何緩存自己響應(yīng)的數(shù)據(jù),如“Cache-Control: no-cache”,如:“Cache-Control: private” 不希望被緩存,“Cache-Control: public” 可以被緩存;
          Connection:服務(wù)端是否希望與客戶端之間保持長連接,如“Connection: close”, “Connection: keep-alive”;
          Date:只有當(dāng)請求方法為POST或PUT方法時客戶端才可能會有些字段;
          Pragma:包含了服務(wù)端一些特殊響應(yīng)信息,如 “Pragma: no-cache” 服務(wù)端希望代理或客戶端不應(yīng)緩存結(jié)果數(shù)據(jù);
          Transfer-Encoding:服務(wù)端向客戶端傳輸數(shù)據(jù)所采用的傳輸模式(僅在HTTP1.1中出現(xiàn)),如:“Transfer-Encoding: chunked”,注:該字段的優(yōu)先級要高于“Content-Length” 字段的優(yōu)先級;

           

          b)響應(yīng)頭(response-header):
          Accept-Ranges:表明服務(wù)端接收的數(shù)據(jù)單位,如:“Accept-Ranges: bytes”, ;
          Location:服務(wù)端向客戶端返回此信息以使客戶端進(jìn)行重定向,如:“Location: http://www.hexun.com”;
          Server:服務(wù)端返回的用于標(biāo)識自己的一些信息,如:“ Server: Microsoft-IIS/6.0”;
          ETag:服務(wù)端返回的響應(yīng)數(shù)據(jù)的標(biāo)識字段,客戶端可根據(jù)此字段的值向服務(wù)器發(fā)送某URL是否更新的信息;

           

          c)實(shí)體頭(entity-header): (此類頭存在時要求有數(shù)據(jù)體)
          Content-Encoding:服務(wù)端所響應(yīng)數(shù)據(jù)的編碼格式,如:“Content-Encoding: gzip”;
          Content-Length:服務(wù)端所返回?cái)?shù)據(jù)的數(shù)據(jù)體部分的內(nèi)容長度,如:“ Content-Length: 24”;
          Content-Type:服務(wù)端所返回的數(shù)據(jù)體的內(nèi)容類型,如:“Content-Type: text/html; charset=gb2312” ;
          Set-Cookie:服務(wù)端返回給客戶端的cookie數(shù)據(jù),如:“ Set-Cookie: ASP.NET_SessionId=icnh2ku2dqlmkciyobgvzl55; path=/”

           

          2.6)服務(wù)器返回狀態(tài)碼

          1xx:表明服務(wù)端接收了客戶端請求,客戶端繼續(xù)發(fā)送請求;
          2xx:客戶端發(fā)送的請求被服務(wù)端成功接收并成功進(jìn)行了處理;
          3xx:服務(wù)端給客戶端返回用于重定向的信息;
          4xx:客戶端的請求有非法內(nèi)容;
          5xx:服務(wù)端未能正常處理客戶端的請求而出現(xiàn)意外錯誤。

           

          舉例:

          “100”  ; 服務(wù)端希望客戶端繼續(xù);
          “200”  ; 服務(wù)端成功接收并處理了客戶端的請求;
          “301”  ; 客戶端所請求的URL已經(jīng)移走,需要客戶端重定向到其它的URL;
          “304”  ; 客戶端所請求的URL未發(fā)生變化;
          “400”  ; 客戶端請求錯誤;
          “403”  ; 客戶端請求被服務(wù)端所禁止;
          “404”  ; 客戶端所請求的URL在服務(wù)端不存在;
          “500”  ; 服務(wù)端在處理客戶端請求時出現(xiàn)異常;
          “501”  ; 服務(wù)端未實(shí)現(xiàn)客戶端請求的方法或內(nèi)容;
          “502”  ; 此為中間代理返回給客戶端的出錯信息,表明服務(wù)端返回給代理時出錯;
          “503”  ; 服務(wù)端由于負(fù)載過高或其它錯誤而無法正常響應(yīng)客戶端請求;
          “504”  ; 此為中間代理返回給客戶端的出錯信息,表明代理連接服務(wù)端出現(xiàn)超時。

           

          2.7)chunked 傳輸

            編碼使用若干個Chunk組成,由一個標(biāo)明長度為0的chunk結(jié)束,每個Chunk有兩部分組成,第一部分是該Chunk的長度(以十六進(jìn)制表示)和長度單位(一般不寫),第二部分就是指定長度的內(nèi)容,每個部分用CRLF隔開。在最后一個長度為0的Chunk中的內(nèi)容是稱為footer的內(nèi)容,是一些沒有寫的頭部內(nèi)容。另外,在HTTP頭里必須含有:” Transfer-Encoding: chunked” 通用頭字段。格式如下:

          chunked 傳輸

           

          2.8)HTTP 請求方法

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

           

          2.9)舉例

          a)GET請求

          Html代碼 復(fù)制代碼 收藏代碼

          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代碼 復(fù)制代碼 收藏代碼

          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代理發(fā)送GET請求

          Html代碼 復(fù)制代碼 收藏代碼

          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代碼 復(fù)制代碼 收藏代碼

          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代碼 復(fù)制代碼 收藏代碼

          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:進(jìn)入DOS模式->輸入 telnet->set LOCAL_ECHO->退出:quit->telnet ip 80
            Windows xp:進(jìn)入DOS模式->輸入telnet->set local echo->open ip 80
          b) 按HTTP協(xié)議格式輸入GET請求、HEAD請求、POST請求。

           

          posted @ 2012-11-08 02:44 奮斗成就男人 閱讀(223) | 評論 (0)編輯 收藏

          按某一字段分組取最大(小)值所在行的數(shù)據(jù)

               摘要: /* 數(shù)據(jù)如下: name val memo a    2   a2(a的第二個值) a    1   a1--a的第一個值 a    3   a3:a的第三個值 b    1   b1-...  閱讀全文

          posted @ 2012-11-02 19:21 奮斗成就男人 閱讀(412) | 評論 (0)編輯 收藏

          公鑰與私鑰

          數(shù)字簽名是什么?

          作者:David Youd

          翻譯:阮一峰

          原文網(wǎng)址:http://www.youdzone.com/signature.html

          1.

          鮑勃有兩把鑰匙,一把是公鑰,另一把是私鑰。

          2.

          鮑勃把公鑰送給他的朋友們----帕蒂、道格、蘇珊----每人一把。

          3.

          蘇珊要給鮑勃寫一封保密的信。她寫完后用鮑勃的公鑰加密,就可以達(dá)到保密的效果。

          4.

          鮑勃收信后,用私鑰解密,就看到了信件內(nèi)容。這里要強(qiáng)調(diào)的是,只要鮑勃的私鑰不泄露,這封信就是安全的,即使落在別人手里,也無法解密。

          5.

          鮑勃給蘇珊回信,決定采用"數(shù)字簽名"。他寫完后先用Hash函數(shù),生成信件的摘要(digest)。

          6.

          然后,鮑勃使用私鑰,對這個摘要加密,生成"數(shù)字簽名"(signature)。

          7.

          鮑勃將這個簽名,附在信件下面,一起發(fā)給蘇珊。

          8.

          蘇珊收信后,取下數(shù)字簽名,用鮑勃的公鑰解密,得到信件的摘要。由此證明,這封信確實(shí)是鮑勃發(fā)出的。

          9.

          蘇珊再對信件本身使用Hash函數(shù),將得到的結(jié)果,與上一步得到的摘要進(jìn)行對比。如果兩者一致,就證明這封信未被修改過。

          10.

          復(fù)雜的情況出現(xiàn)了。道格想欺騙蘇珊,他偷偷使用了蘇珊的電腦,用自己的公鑰換走了鮑勃的公鑰。此時,蘇珊實(shí)際擁有的是道格的公鑰,但是還以為這是鮑勃的公鑰。因此,道格就可以冒充鮑勃,用自己的私鑰做成"數(shù)字簽名",寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進(jìn)行解密。

          11.

          后來,蘇珊感覺不對勁,發(fā)現(xiàn)自己無法確定公鑰是否真的屬于鮑勃。她想到了一個辦法,要求鮑勃去找"證書中心"(certificate authority,簡稱CA),為公鑰做認(rèn)證。證書中心用自己的私鑰,對鮑勃的公鑰和一些相關(guān)信息一起加密,生成"數(shù)字證書"(Digital Certificate)。

          12.

          鮑勃拿到數(shù)字證書以后,就可以放心了。以后再給蘇珊寫信,只要在簽名的同時,再附上數(shù)字證書就行了。

          13.

          蘇珊收信后,用CA的公鑰解開數(shù)字證書,就可以拿到鮑勃真實(shí)的公鑰了,然后就能證明"數(shù)字簽名"是否真的是鮑勃簽的。

          14.

          下面,我們看一個應(yīng)用"數(shù)字證書"的實(shí)例:https協(xié)議。這個協(xié)議主要用于網(wǎng)頁加密。

          15.

          首先,客戶端向服務(wù)器發(fā)出加密請求。

          16.

          服務(wù)器用自己的私鑰加密網(wǎng)頁以后,連同本身的數(shù)字證書,一起發(fā)送給客戶端。

          17.

          客戶端(瀏覽器)的"證書管理器",有"受信任的根證書頒發(fā)機(jī)構(gòu)"列表。客戶端會根據(jù)這張列表,查看解開數(shù)字證書的公鑰是否在列表之內(nèi)。

          18.

          如果數(shù)字證書記載的網(wǎng)址,與你正在瀏覽的網(wǎng)址不一致,就說明這張證書可能被冒用,瀏覽器會發(fā)出警告。

          19.

          如果這張數(shù)字證書不是由受信任的機(jī)構(gòu)頒發(fā)的,瀏覽器會發(fā)出另一種警告。

          20.

          posted @ 2012-10-15 02:37 奮斗成就男人 閱讀(42387) | 評論 (31)編輯 收藏

          僅列出標(biāo)題
          共23頁: First 上一頁 9 10 11 12 13 14 15 16 17 下一頁 Last 
          主站蜘蛛池模板: 延长县| 富锦市| 靖西县| 察雅县| 图木舒克市| 聂拉木县| 盘山县| 麻江县| 大城县| 余干县| 十堰市| 伊宁市| 临潭县| 文成县| 石家庄市| 克东县| 侯马市| 广灵县| 金塔县| 六枝特区| 青神县| 南阳市| 如皋市| 囊谦县| 武夷山市| 满洲里市| 旬阳县| 休宁县| 海淀区| 临湘市| 蒲城县| 固镇县| 珠海市| 梓潼县| 易门县| 祁门县| 长治市| 自贡市| 江源县| 莱西市| 营山县|