yxhxj2006

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          #

          jQuery 插件autocomplete 應(yīng)用

          項(xiàng)目中有時(shí)會(huì)用到自動(dòng)補(bǔ)全查詢,就像Google搜索框、淘寶商品搜索功能,輸入漢字或字母,則以該漢字或字母開頭的相關(guān)條目會(huì)顯示出來(lái)供用戶選擇, autocomplete插件就是完成這樣的功能。

            autocomplete官網(wǎng) : http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ (可下載jQuery autocomplete插件)。

            淘寶商品搜索功能 效果:

            下面來(lái)使用 autocomplete插件來(lái)實(shí)現(xiàn)類似效果。

          1. 創(chuàng)建 AjaxPage.aspx 頁(yè)面,在其中定義 WebMethod 方法來(lái)返回 搜索頁(yè)面需要的輸入框所有提示條目。 后臺(tái)代碼如下:

          復(fù)制代碼
           1 using System.Collections.Generic;
          2 using System.IO;
          3 using System.Runtime.Serialization.Json;
          4 using System.Web.Services;
          5
          6 public partial class AjaxPage : System.Web.UI.Page
          7 {
          8 [WebMethod]
          9 public static string GetAllHints()
          10 {
          11 Dictionary<string, string> data = new Dictionary<string, string>();
          12 data.Add("蘋果4代iphone正品", "21782");
          13 data.Add("蘋果4代 手機(jī)套", "238061");
          14 data.Add("蘋果4", "838360");
          15 data.Add("蘋果皮", "242721");
          16 data.Add("蘋果筆記本", "63348");
          17 data.Add("蘋果4s", "24030");
          18 data.Add("戴爾筆記本", "110105");
          19 data.Add("戴爾手機(jī)", "18870");
          20 data.Add("戴爾鍵盤", "30367");
          21
          22 DataContractJsonSerializer serializer = new DataContractJsonSerializer(data.GetType());
          23
          24 using (MemoryStream ms = new MemoryStream())
          25 {
          26 serializer.WriteObject(ms, data);
          27 return System.Text.Encoding.UTF8.GetString(ms.ToArray());
          28 }
          29 }
          30 }
          復(fù)制代碼

            注:該方法返回的數(shù)據(jù)格式為json字符串。

          2. 創(chuàng)建搜索頁(yè)面 Index.aspx, 前臺(tái)代碼如下:

          復(fù)制代碼
           1 <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Index.aspx.cs" Inherits="_Default" %>
          2
          3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          4
          5 <html xmlns="http://www.w3.org/1999/xhtml">
          6 <head runat="server">
          7 <title></title>
          8 <link rel="Stylesheet" href="Styles/jquery.autocomplete.css" />
          9 <script type="text/javascript" src="Scripts/jquery-1.4.1.js"></script>
          10 <script type="text/javascript" src="Scripts/jquery.autocomplete.js"></script>
          11 <script type="text/javascript">
          12 var v = 1;
          13 $(document).ready(function () {
          14 $.ajax({
          15 type: "POST",
          16 contentType: "application/json",
          17 url: "AjaxPage.aspx/GetAllHints",
          18 data: "{}",
          19 dataType: "json",
          20 success: function (msg) {
          21 var datas = eval('(' + msg.d + ')');
          22 $("#txtIput").autocomplete(datas, {
          23 formatItem: function (row, i, max) {
          24 return "<table width='400px'><tr><td align='left'>" + row.Key + "</td><td align='right'><font style='color: #009933; font-family: 黑體; font-style: italic'>約" + row.Value + "個(gè)寶貝</font>&nbsp;&nbsp;</td></tr></table>";
          25 },
          26 formatMatch: function(row, i, max){
          27 return row.Key;
          28 }
          29 });
          30 }
          31 });
          32 });
          33 </script>
          34 </head>
          35 <body>
          36 <form id="form1" runat="server">
          37 <div>
          38 <center>
          39 <asp:TextBox ID="txtIput" runat="server" Width="400px"></asp:TextBox>
          40 </center>
          41 </div>
          42 </form>
          43 </body>
          44 </html>
          復(fù)制代碼

            實(shí)現(xiàn)效果如下:

          3. autocomplete 參數(shù)說(shuō)明

          * minChars (Number)
              在觸發(fā)autoComplete前用戶至少需要輸入的字符數(shù).Default: 1,如果設(shè)為0,在輸入框內(nèi)雙擊或者刪除輸入框內(nèi)內(nèi)容時(shí)顯示列表
          * width (Number)
              指定下拉框的寬度. Default: input元素的寬度
          * max (Number)
              autoComplete下拉顯示項(xiàng)目的個(gè)數(shù).Default: 10
          * delay (Number)
              擊鍵后激活autoComplete的延遲時(shí)間(單位毫秒).Default: 遠(yuǎn)程為400 本地10
          * autoFill (Boolean)
              要不要在用戶選擇時(shí)自動(dòng)將用戶當(dāng)前鼠標(biāo)所在的值填入到input框. Default: false
          * mustMatch (Booolean)
              如果設(shè)置為true,autoComplete只會(huì)允許匹配的結(jié)果出現(xiàn)在輸入框,所有當(dāng)用戶輸入的是非法字符時(shí)將會(huì)得不到下拉框.Default: false
          * matchContains (Boolean)
              決定比較時(shí)是否要在字符串內(nèi)部查看匹配,如ba是否與foo bar中的ba匹配.使用緩存時(shí)比較重要.不要和autofill混用.Default: false
          * selectFirst (Boolean)
              如果設(shè)置成true,在用戶鍵入tab或return鍵時(shí)autoComplete下拉列表的第一個(gè)值將被自動(dòng)選擇,盡管它沒(méi)被手工選中(用鍵盤或鼠標(biāo)).當(dāng)然如果用戶選中某個(gè)項(xiàng)目,那么就用用戶選中的值. Default: true
          * cacheLength (Number)
              緩存的長(zhǎng)度.即對(duì)從數(shù)據(jù)庫(kù)中取到的結(jié)果集要緩存多少條記錄.設(shè)成1為不緩存.Default: 10
          * matchSubset (Boolean)
              autoComplete可不可以使用對(duì)服務(wù)器查詢的緩存,如果緩存對(duì)foo的查詢結(jié)果,那么如果用戶輸入foo就不需要再進(jìn)行檢索了,直接使用緩存.通常是打開這個(gè)選項(xiàng)以減輕服務(wù)器的負(fù)擔(dān)以提高性能.只會(huì)在緩存長(zhǎng)度大于1時(shí)有效.Default: true
          * matchCase (Boolean)
              比較是否開啟大小寫敏感開關(guān).使用緩存時(shí)比較重要.如果你理解上一個(gè)選項(xiàng),這個(gè)也就不難理解,就好比f(wàn)oot要不要到FOO的緩存中去找.Default: false
          * multiple (Boolean)
              是否允許輸入多個(gè)值即多次使用autoComplete以輸入多個(gè)值. Default: false
          * multipleSeparator (String)
              如果是多選時(shí),用來(lái)分開各個(gè)選擇的字符. Default: ","
          * scroll (Boolean)
              當(dāng)結(jié)果集大于默認(rèn)高度時(shí)是否使用卷軸顯示 Default: true
          * scrollHeight (Number)
              自動(dòng)完成提示的卷軸高度用像素大小表示 Default: 180  
          * formatItem (Function)
              為每個(gè)要顯示的項(xiàng)目使用高級(jí)標(biāo)簽.即對(duì)結(jié)果中的每一行都會(huì)調(diào)用這個(gè)函數(shù),返回值將用LI元素包含顯示在下拉列表中. Autocompleter會(huì)提供三個(gè)參數(shù)(row, i, max): 返回的結(jié)果數(shù)組, 當(dāng)前處理的行數(shù)(即第幾個(gè)項(xiàng)目,是從1開始的自然數(shù)), 當(dāng)前結(jié)果數(shù)組元素的個(gè)數(shù)即項(xiàng)目的個(gè)數(shù). Default: none, 表示不指定自定義的處理函數(shù),這樣下拉列表中的每一行只包含一個(gè)值.
          * formatResult (Function)
              和formatItem類似,但可以將將要輸入到input文本框內(nèi)的值進(jìn)行格式化.同樣有三個(gè)參數(shù),和formatItem一樣.Default: none,表示要么是只有數(shù)據(jù),要么是使用formatItem提供的值.
          * formatMatch (Function)
              對(duì)每一行數(shù)據(jù)使用此函數(shù)格式化需要查詢的數(shù)據(jù)格式. 返回值是給內(nèi)部搜索算法使用的. 參數(shù)值row
          * extraParams (Object)
              為后臺(tái)(一般是服務(wù)端的腳本)提供更多的參數(shù).和通常的作法一樣是使用一個(gè)鍵值對(duì)對(duì)象.如果傳過(guò)去的值是{ bar:4 },將會(huì)被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假設(shè)當(dāng)前用戶輸入了foo). Default: {}
          * result (handler)
              此事件會(huì)在用戶選中某一項(xiàng)后觸發(fā),參數(shù)為:
              event: 事件對(duì)象. event.type為result.
              data: 選中的數(shù)據(jù)行.
              formatted:formatResult函數(shù)返回的值
              例如:
              $("#singleBirdRemote").result(function(event, data, formatted) {
                  //如選擇后給其他控件賦值,觸發(fā)別的事件等等
              });

           

          posted @ 2016-06-17 17:54 奮斗成就男人 閱讀(289) | 評(píng)論 (0)編輯 收藏

          防止重復(fù)登錄請(qǐng)求

          過(guò)頁(yè)頭生成Token,進(jìn)行請(qǐng)求驗(yàn)證,解決Ajax請(qǐng)求安全問(wèn)題。目前為止我做的最多的防止ajax請(qǐng)求攻擊的就是添加驗(yàn)證碼、添加隨機(jī)Token,限制同一請(qǐng)求在規(guī)定時(shí)間內(nèi)的最大請(qǐng)求數(shù)。

          下面重點(diǎn)說(shuō)說(shuō)添加隨機(jī)Token限制:
          token是為了防止表單重復(fù)提交,token 原理大致為:

          1:顯示表單的那個(gè) action 中使用 createToken() 生成一個(gè)隨機(jī)的 token值,并存放在服務(wù)端(session或者cache中),并且傳遞一份到頁(yè)面中

          2:表單頁(yè)面使用一個(gè)隱藏表單域獲取后端傳過(guò)來(lái)的 token值,該表單頁(yè)面提交時(shí)會(huì)將此 token 值一同提交到后端

          3:在表單頁(yè)面提交到的 actioin 中使用 validateToken() 將服務(wù)端與表單隱藏域中的 token 值進(jìn)行對(duì)比,如果服務(wù)端存在 token值并且與表單提交過(guò)來(lái)的值相等,證明是第一次提交。

          4:每次校驗(yàn)過(guò)后服務(wù)端的 token 值會(huì)立即被清除,所以當(dāng)用戶重復(fù)提交時(shí),后面的提交校驗(yàn)都再也無(wú)法通過(guò)。從而實(shí)現(xiàn)了防止重復(fù)提交的功能,validateToken 是在 synchronized 塊中執(zhí)行的保障了多線程下的安全性。

              token 會(huì)優(yōu)先存入 me.setTokenCache(ITokenCache) 指定的 TokenCache 中,如果未指定則默認(rèn)使用 session 來(lái)存放

          但是這種機(jī)制是有問(wèn)題的,比如我是用ajax提交表單,提交完成以后表單頁(yè)面并不刷新,然后我修改了部分?jǐn)?shù)據(jù)以后再次提交頁(yè)面,那么token還是之前的那個(gè)token,后臺(tái)會(huì)以為這個(gè)為重復(fù)提交不能通過(guò)校驗(yàn),那么請(qǐng)求就不能完成,數(shù)據(jù)無(wú)法得到正確的處理。我認(rèn)為合理的機(jī)制應(yīng)該是這樣的:

          1:顯示表單的那個(gè) action 中使用 createToken() 生成一個(gè)隨機(jī)的 token值,并且傳遞一份到頁(yè)面中

          2:表單頁(yè)面使用一個(gè)隱藏表單域獲取后端傳過(guò)來(lái)的 token值,該表單頁(yè)面提交時(shí)會(huì)將此 token 值一同提交到后端

          3:將提交過(guò)來(lái)的token值放入session或者cache中,然后執(zhí)行controller中的代碼,代碼全部執(zhí)行完以后,再把存入session或cache中的token值刪除掉;驗(yàn)證用戶是否為重復(fù)提交只需要驗(yàn)證提交過(guò)來(lái)的token是否存在于session或cache中,有則為重復(fù)提交,無(wú)則為正常提交。

          4:該邏輯應(yīng)該可以寫成一個(gè)Interceptor,在需要的地方加上,或者直接設(shè)為全局?jǐn)r截器都是可以的,簡(jiǎn)單,快捷;

          posted @ 2015-12-03 16:03 奮斗成就男人 閱讀(502) | 評(píng)論 (0)編輯 收藏

          在Java中直接調(diào)用js代碼

          JDK1.6版添加了新的ScriptEngine類,允許用戶直接執(zhí)行js代碼。

          在Java中直接調(diào)用js代碼

          不能調(diào)用瀏覽器中定義的js函數(shù),會(huì)拋出異常提示ReferenceError: “alert” is not defined。

           
          package com.sinaapp.manjushri; 
          import javax.script.ScriptEngine; 
          import javax.script.ScriptEngineManager;
          import javax.script.ScriptException;   /**  * 直接調(diào)用js代碼  */
          public class ScriptEngineTest {    
          public static void main(String[] args) { 
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("javascript");
               try{                engine.eval("var a=3; var b=4;print (a+b);");           // engine.eval("alert(\"js alert\");");    // 不能調(diào)用瀏覽器中定義的js函數(shù) // 錯(cuò)誤,會(huì)拋出alert引用不存在的異常
           }catch(ScriptException e){   e.printStackTrace();  }  }    }

          輸出結(jié)果:7

          在Java中綁定js變量

          在調(diào)用engine.get(key);時(shí),如果key沒(méi)有定義,則返回null

           
          package com.sinaapp.manjushri;     import javax.script.Bindings;   import javax.script.ScriptContext;   import javax.script.ScriptEngine;   import javax.script.ScriptEngineManager;   import javax.script.ScriptException;     public class ScriptEngineTest2 {    public static void main(String[] args) {    ScriptEngineManager manager = new ScriptEngineManager();    ScriptEngine engine = manager.getEngineByName("javascript");    engine.put("a", 4);    engine.put("b", 3);    Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);   try {                          // 只能為Double,使用Float和Integer會(huì)拋出異常      Double result = (Double) engine.eval("a+b");         System.out.println("result = " + result);     engine.eval("c=a+b");      Double c = (Double)engine.get("c");      System.out.println("c = " + c);         } catch (ScriptException e) {     e.printStackTrace();         }      }   }

          輸出:
          result = 7.0
          c = 7.0

          在Java中調(diào)用js文件中的function,傳入調(diào)用參數(shù),并獲取返回值

          js文件中的merge函數(shù)將兩個(gè)參數(shù)a,b相加,并返回c。

           
          // expression.js 
          function merge(a, b) { 
           c = a * b; 
           return c; 
          }

          在Java代碼中讀取js文件,并參數(shù)兩個(gè)參數(shù),然后回去返回值。

           
          package com.sinaapp.manjushri;     import java.io.FileReader;    import javax.script.Invocable;   import javax.script.ScriptEngine;   import javax.script.ScriptEngineManager;    /**  * Java調(diào)用并執(zhí)行js文件,傳遞參數(shù),并活動(dòng)返回值  *   * @author manjushri  */   public class ScriptEngineTest {      public static void main(String[] args) throws Exception {    ScriptEngineManager manager = new ScriptEngineManager();    ScriptEngine engine = manager.getEngineByName("javascript");       String jsFileName = "expression.js";   // 讀取js文件     FileReader reader = new FileReader(jsFileName);   // 執(zhí)行指定腳本    engine.eval(reader);     if(engine instanceof Invocable) {     Invocable invoke = (Invocable)engine;    // 調(diào)用merge方法,并傳入兩個(gè)參數(shù)      // c = merge(2, 3);      Double c = (Double)invoke.invokeFunction("merge", 2, 3);      System.out.println("c = " + c);    }     reader.close();      } }

          輸出結(jié)果:
          c = 5.0


          java調(diào)用腳本語(yǔ)言筆記(jython,jruby,groovy)

           有兩種方法
          1.java se 6以后實(shí)現(xiàn)了jsr 223規(guī)范
          java代碼:

          [java]
          1. ScriptEngineManager factory = new ScriptEngineManager();  
          2. ScriptEngineManager scriptEngine = factory.getEngineByName("javascript");//或者"js"  
          3. scriptEngine.eval(code);//執(zhí)行一段腳本,code是js代碼  


           很方便調(diào)用腳本

          2.可以使用腳本語(yǔ)方本身提供的與java的集成手段

          jython集成
          使用jsr223:
          前提下載jython的包,已實(shí)現(xiàn)jsr223
          (建議在官網(wǎng)上下載,在安裝目錄下有jython.jar,http://repo2.maven.org/maven2/org/python/jython/2.5.0/ 這里也有,但是這個(gè)包里沒(méi)有jsr223的實(shí)現(xiàn),看包下存不存在org.python.jsr223)

          [java]
          1. ScriptEngineManager factory = new ScriptEngineManager();  
          2. ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"  
          3. scriptEngine.eval(code);  


          使用PythonInterpreter,可以調(diào)用exec(String code)方法:

          [java]
          1. PythonInterpreter interpreter = new PythonInterpreter();  
          2. interpreter.exec(code);  

          訪問(wèn)數(shù)據(jù)庫(kù)
          使用jdbc:

          [python] 
          1. from oracle.jdbc.driver import OracleDriver  
          2. from java.sql import DriverManager  
          3.   
          4. username = 'hr'  
          5. password = '123456'  
          6. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
          7. driver = OracleDriver()  
          8. DriverManager.registerDriver(driver)  
          9. conn = DriverManager.getConnection(url, username, password)  
          10. stmt = conn.createStatement()  
          11. sql = "select salary from EMPLOYEES t where t.salary<2300"  
          12. rs = stmt.executeQuery(sql)  
          13. while (rs.next()):  
          14.  print rs.getInt('salary')  
          15. rs.close()  
          16. stmt.close()  


           結(jié)果:
          2200
          2100
          2200

          使用zxJDBC :

          [python] 
          1. from com.ziclix.python.sql import zxJDBC  
          2.   
          3. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
          4. username = 'hr'  
          5. password = '123456'  
          6. driverName = 'oracle.jdbc.driver.OracleDriver'  
          7. mysqlConn = zxJDBC.connect(url,username, password,driverName)  
          8. cursor = mysqlConn.cursor()       
          9. cursor.execute("select last_name from EMPLOYEES t where t.salary<2300");  
          10. #print cursor.fetchone()  
          11. list = cursor.fetchall()  
          12. for record in list:  
          13.     print "name:"+record[0]  
          14. #print cursor.description[0]  
          15. #print cursor.description[1]  


           結(jié)果:
          name:麥克
          name:Olson
          name:Philtanker

          從數(shù)據(jù)庫(kù)中查出的中文內(nèi)容正常的。
          而在代碼里面的中文全部是亂碼或拋異常,未解決。

          與jruby集成
          使用jsr223:Java代碼

          [java]
          1. ScriptEngineManager factory = new ScriptEngineManager();  
          2. ScriptEngineManager scriptEngine = factory.getEngineByName("jruby");//或者"ruby"  
          3. scriptEngine.eval(code);  

           訪問(wèn)數(shù)據(jù)庫(kù)

          Ruby代碼

          [ruby] 
          1. require 'java'  
          2.   
          3. module JavaLang  
          4.   include_package "java.lang"  
          5. end  
          6.   
          7. module JavaSql  
          8.   include_package 'java.sql'  
          9. end  
          10.   
          11. begin  
          12.  username = 'hr'  
          13.  password = '123456'  
          14.  url = 'jdbc:oracle:thin:@localhost:1521:XE'  
          15.  driverName = 'oracle.jdbc.driver.OracleDriver'  
          16.  JavaLang::Class.forName(driverName).newInstance  
          17.  conn = JavaSql::DriverManager.getConnection(url, username, password)  
          18.  stmt = conn.createStatement  
          19.  sql = "select last_name from EMPLOYEES t where t.salary<2300"  
          20.  rs = stmt.executeQuery(sql)  
          21.  while (rs.next) do  
          22.   puts "名字:"+rs.getString("last_name")  
          23.  end  
          24.  rs.close  
          25.  stmt.close  
          26.  conn.close()  
          27. rescue JavaLang::ClassNotFoundException  
          28.  puts "ClassNotFoundException"  
          29. rescue JavaSql::SQLException  
          30.  puts "SQLException"  
          31. end  


           

           結(jié)果:
          名字:楹﹀厠
          名字:Olson
          名字:Philtanker

           

          從數(shù)據(jù)庫(kù)中查出的中文內(nèi)容為亂碼的。
          而在代碼里面的中文正常。

           

          與groovy集成
          使用jsr223:

          Java代碼

          [java] 
          1. ScriptEngineManager factory = new ScriptEngineManager();  
          2. ScriptEngineManager scriptEngine = factory.getEngineByName("groovy");//或者"Groovy"  
          3. scriptEngine.eval(code);  


           使用GroovyShell:

          Java代碼

          [java] 
          1. GroovyShell shell = new GroovyShell();  
          2. Script script = shell.parse(code);  
          3. Object result = script.run();  


          訪問(wèn)數(shù)據(jù)庫(kù)

          Groovy代碼

           

          1. import groovy.sql.Sql  
          2.   
          3. def username = 'hr'  
          4. def password = '123456'  
          5. def url = 'jdbc:oracle:thin:@localhost:1521:XE'  
          6. def driverName = 'oracle.jdbc.driver.OracleDriver'  
          7. def sql = Sql.newInstance(url, username, password, driverName)  
          8.   
          9. sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {  
          10.  println "名字:${it.last_name}"  
          11. }  

          結(jié)果:
          名字:麥克
          名字:Olson
          名字:Philtanker

           

          在使用groovy過(guò)程中碰到了一個(gè)異常
          Exception in thread "main" java.lang.VerifyError: (class: groovy/runtime/metaclass/java/util/ArrayListMetaClass, method: super$2$invokeMethod signature: (Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;ZZ)Ljava/lang/Object;) Illegal use of nonvirtual function call
          這個(gè)異常解決花了很長(zhǎng)時(shí)間
          是因?yàn)樵谠瓉?lái)項(xiàng)目中存在json-lib-2.1.jar(有可能名稱為json-lib-2.1-jdk15.jar),這個(gè)包是用來(lái)處理json的,與groovy1.7.5存在沖突,更新為json-lib-2.3.jar即可
          (json-lib里有一些groovy運(yùn)行時(shí)處理的內(nèi)容)

          posted @ 2015-11-19 00:25 奮斗成就男人 閱讀(2933) | 評(píng)論 (0)編輯 收藏

          Java導(dǎo)入證書的問(wèn)題(PKIX:unable to find valid certification path to requested target 的問(wèn)題)

          這兩天Java服務(wù)器上忽然遇到這樣的異常:

          avax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

          問(wèn)題的根本是:

          缺少安全證書時(shí)出現(xiàn)的異常。

          解決問(wèn)題方法:

          將你要訪問(wèn)的webservice/url....的安全認(rèn)證證書導(dǎo)入到客戶端即可。


          以下是獲取安全證書的一種方法,通過(guò)以下程序獲取安全證書:

          /*
           * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
           *
           * Redistribution and use in source and binary forms, with or without
           * modification, are permitted provided that the following conditions
           * are met:
           *
           *   - Redistributions of source code must retain the above copyright
           *     notice, this list of conditions and the following disclaimer.
           *
           *   - Redistributions in binary form must reproduce the above copyright
           *     notice, this list of conditions and the following disclaimer in the
           *     documentation and/or other materials provided with the distribution.
           *
           *   - Neither the name of Sun Microsystems nor the names of its
           *     contributors may be used to endorse or promote products derived
           *     from this software without specific prior written permission.
           *
           * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
           * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
           * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
           * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
           * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
           * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
           * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
           * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
           * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
           * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
           * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
           
          */

          import java.io.BufferedReader;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.InputStream;
          import java.io.InputStreamReader;
          import java.io.OutputStream;
          import java.security.KeyStore;
          import java.security.MessageDigest;
          import java.security.cert.CertificateException;
          import java.security.cert.X509Certificate;

          import javax.net.ssl.SSLContext;
          import javax.net.ssl.SSLException;
          import javax.net.ssl.SSLSocket;
          import javax.net.ssl.SSLSocketFactory;
          import javax.net.ssl.TrustManager;
          import javax.net.ssl.TrustManagerFactory;
          import javax.net.ssl.X509TrustManager;

          public class InstallCert {

              public static void main(String[] args) throws Exception {
                  String host;
                  int port;
                  char[] passphrase;
                  if ((args.length == 1) || (args.length == 2)) {
                      String[] c = args[0].split(":");
                      host = c[0];
                      port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
                      String p = (args.length == 1) ? "changeit" : args[1];
                      passphrase = p.toCharArray();
                  } else {
                      System.out
                              .println("Usage: java InstallCert <host>[:port] [passphrase]");
                      return;
                  }

                  File file = new File("jssecacerts");
                  if (file.isFile() == false) {
                      char SEP = File.separatorChar;
                      File dir = new File(System.getProperty("java.home") + SEP + "lib"
                              + SEP + "security");
                      file = new File(dir, "jssecacerts");
                      if (file.isFile() == false) {
                          file = new File(dir, "cacerts");
                      }
                  }
                  System.out.println("Loading KeyStore " + file + "");
                  InputStream in = new FileInputStream(file);
                  KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
                  ks.load(in, passphrase);
                  in.close();

                  SSLContext context = SSLContext.getInstance("TLS");
                  TrustManagerFactory tmf = TrustManagerFactory
                          .getInstance(TrustManagerFactory.getDefaultAlgorithm());
                  tmf.init(ks);
                  X509TrustManager defaultTrustManager = (X509TrustManager) tmf
                          .getTrustManagers()[0];
                  SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
                  context.init(nullnew TrustManager[] { tm }, null);
                  SSLSocketFactory factory = context.getSocketFactory();

                  System.out
                          .println("Opening connection to " + host + ":" + port + "");
                  SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
                  socket.setSoTimeout(10000);
                  try {
                      System.out.println("Starting SSL handshake");
                      socket.startHandshake();
                      socket.close();
                      System.out.println();
                      System.out.println("No errors, certificate is already trusted");
                  } catch (SSLException e) {
                      System.out.println();
                      e.printStackTrace(System.out);
                  }

                  X509Certificate[] chain = tm.chain;
                  if (chain == null) {
                      System.out.println("Could not obtain server certificate chain");
                      return;
                  }

                  BufferedReader reader = new BufferedReader(new InputStreamReader(
                          System.in));

                  System.out.println();
                  System.out.println("Server sent " + chain.length + " certificate(s):");
                  System.out.println();
                  MessageDigest sha1 = MessageDigest.getInstance("SHA1");
                  MessageDigest md5 = MessageDigest.getInstance("MD5");
                  for (int i = 0; i < chain.length; i++) {
                      X509Certificate cert = chain[i];
                      System.out.println(" " + (i + 1) + " Subject "
                              + cert.getSubjectDN());
                      System.out.println("   Issuer  " + cert.getIssuerDN());
                      sha1.update(cert.getEncoded());
                      System.out.println("   sha1    " + toHexString(sha1.digest()));
                      md5.update(cert.getEncoded());
                      System.out.println("   md5     " + toHexString(md5.digest()));
                      System.out.println();
                  }

                  System.out
                          .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
                  String line = reader.readLine().trim();
                  int k;
                  try {
                      k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
                  } catch (NumberFormatException e) {
                      System.out.println("KeyStore not changed");
                      return;
                  }

                  X509Certificate cert = chain[k];
                  String alias = host + "-" + (k + 1);
                  ks.setCertificateEntry(alias, cert);

                  OutputStream out = new FileOutputStream("jssecacerts");
                  ks.store(out, passphrase);
                  out.close();

                  System.out.println();
                  System.out.println(cert);
                  System.out.println();
                  System.out
                          .println("Added certificate to keystore 'jssecacerts' using alias '"
                                  + alias + "'");
              }

              private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

              private static String toHexString(byte[] bytes) {
                  StringBuilder sb = new StringBuilder(bytes.length * 3);
                  for (int b : bytes) {
                      b &= 0xff;
                      sb.append(HEXDIGITS[b >> 4]);
                      sb.append(HEXDIGITS[b & 15]);
                      sb.append(' ');
                  }
                  return sb.toString();
              }

              private static class SavingTrustManager implements X509TrustManager {

                  private final X509TrustManager tm;
                  private X509Certificate[] chain;

                  SavingTrustManager(X509TrustManager tm) {
                      this.tm = tm;
                  }

                  public X509Certificate[] getAcceptedIssuers() {
                      throw new UnsupportedOperationException();
                  }

                  public void checkClientTrusted(X509Certificate[] chain, String authType)
                          throws CertificateException {
                      throw new UnsupportedOperationException();
                  }

                  public void checkServerTrusted(X509Certificate[] chain, String authType)
                          throws CertificateException {
                      this.chain = chain;
                      tm.checkServerTrusted(chain, authType);
                  }
              }

          }

          編譯InstallCert.java,然后執(zhí)行:java InstallCert hostname,比如:
          java InstallCert www.twitter.com
          會(huì)看到如下信息:

          java InstallCert www.twitter.com
          Loading KeyStore /usr/java/jdk1.6.0_16/jre/lib/security/cacerts
          Opening connection to www.twitter.com:443
          Starting SSL handshake

          javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
              at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
              at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476)
              at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
              at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
              at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846)
              at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
              at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
              at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
              at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815)
              at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
              at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038)
              at InstallCert.main(InstallCert.java:63)
          Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
              at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221)
              at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
              at sun.security.validator.Validator.validate(Validator.java:203)
              at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
              at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158)
              at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
              at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839)
               7 more
          Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
              at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)
              at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)
              at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)
               13 more

          Server sent 2 certificate(s):

           1 Subject CN=www.twitter.com, O=example.com, C=US
             Issuer  CN=Certificate Shack, O=example.com, C=US
             sha1    2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7 
             md5     dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54 

           2 Subject CN=Certificate Shack, O=example.com, C=US
             Issuer  CN=Certificate Shack, O=example.com, C=US
             sha1    fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6 
             md5     72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68 

          Enter certificate to add to trusted keystore or 'q' to quit: [1]


          輸入1,回車,然后會(huì)在當(dāng)前的目錄下產(chǎn)生一個(gè)名為“ssecacerts”的證書。

          將證書拷貝到$JAVA_HOME/jre/lib/security目錄下,或者通過(guò)以下方式:
          System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts證書路徑");



          注意:因?yàn)槭庆o態(tài)加載,所以要重新啟動(dòng)你的Web Server,證書才能生效。


          試了以上的方法,后來(lái)發(fā)現(xiàn)還不行。最后突然心血來(lái)潮:我把Myeclipse關(guān)閉,直接啟動(dòng)Tomcat,然后運(yùn)行,居然就可以了。具體原因沒(méi)有找到。估計(jì)是
          我的Myeclipse引用的JDK引用不對(duì)。后來(lái)就沒(méi)有具體找原因了。

          posted @ 2015-10-30 15:06 奮斗成就男人 閱讀(1418) | 評(píng)論 (0)編輯 收藏

          常用的MySQL語(yǔ)句寫法

          MySQLSQL語(yǔ)句寫法,除了那些基本的之外,還有一些也算比較常用的,這里記錄下來(lái),以便以后查找。
              好記性不如爛筆頭,這話說(shuō)的太有道理了,一段時(shí)間不寫它,還真容易忘記。大家不要糾結(jié)這些SQL語(yǔ)句包含的業(yè)務(wù)或是其它問(wèn)題,本文只是一篇筆記而已。

              將數(shù)據(jù)從T1表導(dǎo)入到T2
          INSERT INTO T2 (C1,C2) SELECT C1,C2 FROM T1 [WHERE C1 = XX AND C2 = XX ORDER BY C1]

              使用T2表的NAME來(lái)更新T1表的NAME
          UPDATE T1 AS A, T2 AS B SET A.NAME = B.NAME WHERE A.TID = B.ID

              兩表的關(guān)聯(lián)更新
          UPDATE T_ROLE_USER AS A,
           (
              SELECT
                  ID
              FROM
                  T_USER
              WHERE
                  DEPARTID IN (
                      SELECT
                          ID
                      FROM
                          T_DEPART
                      WHERE
                          LENGTH(ORG_CODE) = 9
                  )
          AS B
          SET A.ROLEID = '123456'
          WHERE
              A.USERID = B.ID

              自己和自己關(guān)聯(lián)更新
          UPDATE T_DEPART AS A,
           (
              SELECT
                  ID,
                  SUBSTRING(ORG_CODE, 16) ORG_CODE
              FROM
                  T_DEPART
              WHERE
                  LENGTH(ORG_CODE) = 8
              AND PARENT_DEPART_ID IS NOT NULL
          AS B
          SET A.PARENT_DEPART_ID = B.ID
          WHERE
              SUBSTRING(A.ORG_CODE, 16= B.ORG_CODE

              兩表關(guān)聯(lián)刪除,將刪除兩表中有關(guān)聯(lián)ID并且T2NAME為空的兩表記錄
          DELETE A,B FROM T1 AS A LEFT JOIN T2 AS B ON A.TID = B.ID WHERE B.NAME IS NULL

              將統(tǒng)計(jì)結(jié)果插入到表
          INSERT INTO SE_STAT_ORG (
              RECORD_DATE,
              ORG_ID,
              ORG_NAME,
              SIGN_CONT_COUNT,
              SIGN_ARRI_CONT_COUNT,
              SIGN_CONT_MONEY,
              SIGN_ARRI_CONT_MONEY,
              TOTAL_ARRI_CONT_COUNT,
              TOTAL_ARRI_MONEY,
              PUBLISH_TOTAL_COUNT,
              PROJECT_COUNT
          SELECT
              *
          FROM
              (
                  SELECT
                      '2012-06-09' RECORD_DATE,
                      PARENT_ORG_ID,
                      PARENT_ORG_NAME,
                      SUM(SIGN_CONT_COUNT) SIGN_CONT_COUNT,
                      SUM(SIGN_ARRI_CONT_COUNT) SIGN_ARRI_CONT_COUNT,
                      SUM(SIGN_CONT_MONEY) SIGN_CONT_MONEY,
                      SUM(SIGN_ARRI_CONT_MONEY) SIGN_ARRI_CONT_MONEY,
                      SUM(TOTAL_ARRI_CONT_COUNT) TOTAL_ARRI_CONT_COUNT,
                      SUM(TOTAL_ARRI_MONEY) TOTAL_ARRI_MONEY,
                      SUM(PUBLISH_TOTAL_COUNT) PUBLISH_TOTAL_COUNT,
                      SUM(PROJECT_COUNT) PROJECT_COUNT,
                  FROM SE_STAT_USER
                  WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
                  GROUP BY PARENT_ORG_ID
              ) M

              三表關(guān)聯(lián)更新
          UPDATE SE_STAT_USER A,
           (
              SELECT
                  USER_ID,
                  SUM(INVEST_ORG_COUNT + FINANCIAL_ORG_COUNT + INTERMEDIARY_ORG_COUNT + ENTERPRISE_COUNT) AS COMMON_COUNT
              FROM SE_STAT_USER
              WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
              GROUP BY USER_ID
          ) B,
           (
              SELECT
                  USER_ID,
                  SUM(ESTABLISH_COUNT + STOCK_COUNT + MERGER_COUNT + ACHIEVE_COUNT) AS PROJECT_COUNT
              FROM SE_STAT_USER
              WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
              GROUP BY USER_ID
          ) C
          SET A.COMMON_COUNT = B.COMMON_COUNT, A.PROJECT_COUNT = C.PROJECT_COUNT
          WHERE A.USER_ID = B.USER_ID
          AND A.USER_ID = C.USER_ID
          AND DATE_FORMAT(A.RECORD_DATE, '%Y-%m-%d'= '2012-06-09'

              帶條件的關(guān)聯(lián)更新
          UPDATE SE_STAT_USER A,
           (
              SELECT
                  P.CHANNEL,
                  COUNT(P.CONT_ID) AS CONT_COUNT,
                  C.CUST_MGR_ID
              FROM
                  (
                      SELECT
                          CHANNEL,
                          CONT_ID
                      FROM SK_PROJECT
                      WHERE PROJECT_STATUS = 6
                      AND DATE_FORMAT(AUDIT_TIME, '%Y-%m-%d'= '2012-06-11'
                  ) p
              INNER JOIN SE_CONTRACT C ON P.CONT_ID = C.CONT_ID
              GROUP BY P.CHANNEL, C.CUST_MGR_ID
          ) B
          SET
              A.STOCK_COUNT = CASE WHEN B.CHANNEL = 2 THEN B.CONT_COUNT ELSE 0 END,
              A.ESTABLISH_COUNT = CASE WHEN B.CHANNEL = 3 THEN B.CONT_COUNT ELSE 0 END,
              A.ACHIEVE_COUNT = CASE WHEN B.CHANNEL = 4 THEN B.CONT_COUNT ELSE 0 END
              A.BRAND_COUNT = CASE WHEN B.CHANNEL = 5 THEN B.CONT_COUNT ELSE 0 END,
              A.MERGER_COUNT = CASE WHEN B.CHANNEL = 6 THEN B.CONT_COUNT ELSE 0 END
          WHERE
              A.USER_ID = B.CUST_MGR_ID
          AND DATE_FORMAT(A.RECORD_DATE, '%Y-%m-%d'= '2012-06-11'

              加索引
          ALTER TABLE PROJECT ADD INDEX INDEX_USER_ID (USER_ID),
                  ADD INDEX INDEX_PROJECT_STATUS (PROJECT_STATUS);

              刪除列
          ALTER TABLE PROJECT DROP COLUMN PROJECT_STATUS,
                  DROP COLUMN EXPECT_RETURN,DROP COLUMN CURRENCY;

              增加列
          ALTER TABLE PROJECT 
                  ADD COLUMN DICT_ID INT DEFAULT NULL COMMENT 'xxx' AFTER PROJECT_SITE,
                  ADD COLUMN INTRODUCE TEXT DEFAULT NULL COMMENT 'xx' AFTER DICT_ID,
                  ADD COLUMN STAGE INT DEFAULT NULL COMMENT 'xx' AFTER ID,
                  ADD COLUMN ATTACH_URI VARCHAR(8DEFAULT NULL COMMENT 'xxx' AFTER INTRODUCE;

              修改列,一般用MODIFY修改數(shù)據(jù)類型,CHANGE修改列名
          ALTER TABLE PROJECT CHANGE DICT_ID DICT_ID1 INT NOT NULL,
                  MODIFY PROJECT_STATUS TINYINT NOT NULL COMMENT 'xxx';

          posted @ 2015-08-09 23:31 奮斗成就男人 閱讀(400) | 評(píng)論 (0)編輯 收藏

          程序員必看的書

          做為一名程序員,如果你只顧得寫代碼,那是不行的,要抽出一下時(shí)間來(lái)豐富自己的知識(shí),多看看書,在這里我將為程序員們推薦一些不錯(cuò)的書。能夠給程序員們帶來(lái)幫助。

          大數(shù)據(jù)時(shí)代

          5487a5bd00010d2903120426

          《大數(shù)據(jù)時(shí)代》是國(guó)外大數(shù)據(jù)研究的先河之作,本書作者維克托•邁爾•舍恩伯格被譽(yù)為"大數(shù)據(jù)商業(yè)應(yīng)用第一人",擁有在哈佛大學(xué)、牛津大學(xué)、耶魯大學(xué)和新加坡國(guó)立大學(xué)等多個(gè)互聯(lián)網(wǎng)研究重鎮(zhèn)任教的經(jīng)歷,早在2010年就在《經(jīng)濟(jì)學(xué)人》上發(fā)布了長(zhǎng)達(dá)14頁(yè)對(duì)大數(shù)據(jù)應(yīng)用的前瞻性研究。

          維克托•邁爾•舍恩伯格在書中前瞻性地指出,大數(shù)據(jù)帶來(lái)的信息風(fēng)暴正在變革我們的生活、工作和思維,大數(shù)據(jù)開啟了一次重大的時(shí)代轉(zhuǎn)型,并用三個(gè)部分講述了大數(shù)據(jù)時(shí)代的思維變革、商業(yè)變革和管理變革。

          維克托最具洞見之處在于,他明確指出,大數(shù)據(jù)時(shí)代最大的轉(zhuǎn)變就是,放棄對(duì)因果關(guān)系的渴求,而取而代之關(guān)注相關(guān)關(guān)系。也就是說(shuō)只要知道"是什么",而不需要知道"為什么"。這就顛覆了千百年來(lái)人類的思維慣例,對(duì)人類的認(rèn)知和與世界交流的方式提出了全新的挑戰(zhàn)。

           淘寶技術(shù)這十年

          5487a5c800013dae03030438

          《淘寶技術(shù)這十年》內(nèi)容簡(jiǎn)介:任何網(wǎng)站的發(fā)展都不是一蹴而就的。它在發(fā)展過(guò)程中會(huì)遇到各種各樣的問(wèn)題和業(yè)務(wù)帶來(lái)的壓力。正是這些問(wèn)題和壓力推動(dòng)著技術(shù)的進(jìn)步和發(fā)展,而技術(shù)的發(fā)展反過(guò)來(lái)又會(huì)促進(jìn)業(yè)務(wù)的更大提升。如今淘寶網(wǎng)的流量排名已是全球前15名、國(guó)內(nèi)前3名,其系統(tǒng)服務(wù)器也從一臺(tái)發(fā)展到萬(wàn)臺(tái)以上。

          《淘寶技術(shù)這十年》從工程師的角度講述淘寶這個(gè)超大規(guī)模互聯(lián)網(wǎng)系統(tǒng)的成長(zhǎng)歷程,及其所有主動(dòng)和被動(dòng)的技術(shù)變革的前因后果。書中有幕后故事、產(chǎn)品經(jīng)驗(yàn)、架構(gòu)演進(jìn)、技術(shù)啟蒙,也有大牛成長(zhǎng)、業(yè)內(nèi)八卦、失敗案例、勵(lì)志故事。《淘寶技術(shù)這十年》文風(fēng)流暢,有技術(shù)人員特有的幽默感;內(nèi)容積極正面,有現(xiàn)場(chǎng)感,全部是作者親身經(jīng)歷。

          白帽子講Web安全

          5487a7b90001fa2303030438

          《白帽子講Web安全》內(nèi)容簡(jiǎn)介:在互聯(lián)網(wǎng)時(shí)代,數(shù)據(jù)安全與個(gè)人隱私受到了前所未有的挑戰(zhàn),各種新奇的攻擊技術(shù)層出不窮。如何才能更好地保護(hù)我們的數(shù)據(jù)?《白帽子講Web安全》將帶你走進(jìn)Web安全的世界,讓你了解Web安全的方方面面。黑客不再變得神秘,攻擊技術(shù)原來(lái)我也可以會(huì),小網(wǎng)站主自己也能找到正確的安全道路。大公司是怎么做安全的,為什么要選擇這樣的方案呢?你能在《白帽子講Web安全》中找到答案。詳細(xì)的剖析,讓你不僅能"知其然",更能"知其所以然"。

          重構(gòu):改善既有代碼的設(shè)計(jì)

          5487a7c400010cce04000400

          《重構(gòu):改善既有代碼的設(shè)計(jì)》清晰地揭示了重構(gòu)的過(guò)程,解釋了重構(gòu)的原理和最佳實(shí)踐方式,并給出了何時(shí)以及何地應(yīng)該開始挖掘代碼以求改善。書中給出了70多個(gè)可行的重構(gòu),每個(gè)重構(gòu)都介紹了一種經(jīng)過(guò)驗(yàn)證的代碼變換手法的動(dòng)機(jī)和技術(shù)。《重構(gòu):改善既有代碼的設(shè)計(jì)》提出的重構(gòu)準(zhǔn)則將幫助你一次一小步地修改你的代碼,從而減少了開發(fā)過(guò)程中的風(fēng)險(xiǎn)。

          《重構(gòu):改善既有代碼的設(shè)計(jì)》適合軟件開發(fā)人員、項(xiàng)目管理人員等閱讀,也可作為高等院校計(jì)算機(jī)及相關(guān)專業(yè)師生的參考讀物。

          代碼整潔之道

          5487a7cf000167fd03240408

          軟件質(zhì)量,不但依賴于架構(gòu)及項(xiàng)目管理,而且與代碼質(zhì)量緊密相關(guān)。這一點(diǎn),無(wú)論是敏捷開發(fā)流派還是傳統(tǒng)開發(fā)流派,都不得不承認(rèn)。《代碼整潔之道》提出一種觀念:代碼質(zhì)量與其整潔度成正比。干凈的代碼,既在質(zhì)量上較為可靠,也為后期維護(hù)、升級(jí)奠定了良好基礎(chǔ)。

          作為編程領(lǐng)域的佼佼者,《代碼整潔之道》作者給出了一系列行之有效的整潔代碼操作實(shí)踐。這些實(shí)踐在《代碼整潔之道》中體現(xiàn)為一條條規(guī)則(或稱"啟示"),并輔以來(lái)自現(xiàn)實(shí)項(xiàng)目的正、反兩面的范例。只要遵循這些規(guī)則,就能編寫出干凈的代碼,從而有效提升代碼質(zhì)量。

          《代碼整潔之道》閱讀對(duì)象為一切有志于改善代碼質(zhì)量的程序員及技術(shù)經(jīng)理。書中介紹的規(guī)則均來(lái)自作者多年的實(shí)踐經(jīng)驗(yàn),涵蓋從命名到重構(gòu)的多個(gè)編程方面,雖為一"家"之言,然誠(chéng)有可資借鑒的價(jià)值。

          設(shè)計(jì)模式之禪 (第2版)


          549ccdfa00018b6503630363

            本書是設(shè)計(jì)模式領(lǐng)域公認(rèn)的3本經(jīng)典著作之一,"極具趣味,容易理解,但講解又極為嚴(yán)謹(jǐn)和透徹"是本書的寫作風(fēng)格和方法的最大特點(diǎn)。第1版2010年出版,暢銷至今,廣受好評(píng),是該領(lǐng)域的里程碑著作。深刻解讀6大設(shè)計(jì)原則和28種設(shè)計(jì)模式的準(zhǔn)確定義、應(yīng)用方法和最佳實(shí)踐,全方位比較各種同類模式之間的異同,詳細(xì)講解將不同的模式組合使用的方法。第2版在第1版的基礎(chǔ)上有兩方面的改進(jìn),一方面結(jié)合讀者的意見和建議對(duì)原有內(nèi)容中的瑕疵進(jìn)行了修正和完善,另一方面增加了4種新的設(shè)計(jì)模式,希望這一版能為廣大程序員們奉上一場(chǎng)更加完美的設(shè)計(jì)模式盛宴!

          程序員修煉之道

          549cce040001ee3b03150420

            《程序員修煉之道》由一系列的獨(dú)立的部分組成,涵蓋的主題從個(gè)人責(zé)任、職業(yè)發(fā)展,直到用于使代碼保持靈活、并且易于改編和復(fù)用的各種架構(gòu)技術(shù)。利用許多富有娛樂(lè)性的奇聞?shì)W事、有思想性的例子以及有趣的類比,全面闡釋了軟件開發(fā)的許多不同方面的最佳實(shí)踐和重大陷阱。無(wú)論你是初學(xué)者,是有經(jīng)驗(yàn)的程序員,還是軟件項(xiàng)目經(jīng)理,本書都適合你閱讀。

          平臺(tái)戰(zhàn)略:正在席卷全球的商業(yè)模式革命

          549cce0e00012ad003120426

          《平臺(tái)戰(zhàn)略:正在席卷全球的商業(yè)模式革命》內(nèi)容簡(jiǎn)介:平臺(tái)商業(yè)模式的精髓,在于打造一個(gè)完善的、成長(zhǎng)潛能強(qiáng)大的"生態(tài)圈"。它擁有獨(dú)樹一幟的精密規(guī)范和機(jī)制系統(tǒng),能有效激勵(lì)多方群體之間互動(dòng),達(dá)成平臺(tái)企業(yè)的愿景。縱觀全球許多重新定義產(chǎn)業(yè)架構(gòu)的企業(yè),我們往往就會(huì)發(fā)現(xiàn)它們成功的關(guān)鍵——建立起良好的"平臺(tái)生態(tài)圈",連接兩個(gè)以上群體,彎曲、打碎了既有的產(chǎn)業(yè)鏈。

          平臺(tái)生態(tài)圈里的一方群體,一旦因?yàn)樾枨笤黾佣鴫汛螅硪环饺后w的需求也會(huì)隨之增長(zhǎng)。如此一來(lái),一個(gè)良性循環(huán)機(jī)制便建立了,通過(guò)此平臺(tái)交流的各方也會(huì)促進(jìn)對(duì)方無(wú)限增長(zhǎng)。而通過(guò)平臺(tái)模式達(dá)到戰(zhàn)略目的,包括規(guī)模的壯大和生態(tài)圈的完善,乃至對(duì)抗競(jìng)爭(zhēng)者,甚至是拆解產(chǎn)業(yè)現(xiàn)狀、重塑市場(chǎng)格局。

          互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄

          549cce170001475203030438

          《互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄》是一部互聯(lián)網(wǎng)公司的創(chuàng)業(yè)指南,內(nèi)容涉及網(wǎng)站創(chuàng)業(yè)的現(xiàn)狀和機(jī)遇、創(chuàng)業(yè)公司價(jià)值、平臺(tái)選擇、工具和群組、資金的籌集、管理和盈利、社會(huì)化媒體環(huán)境、行動(dòng)執(zhí)行管理、開發(fā)人員方法論和工作效率、創(chuàng)始人的角色等方面,既有綱領(lǐng)和指導(dǎo)性理論,又有具體操作方法。書中大量對(duì)互聯(lián)網(wǎng)創(chuàng)業(yè)成功人士的訪談介紹,以及創(chuàng)業(yè)公司的成功案例,更可以作為初次創(chuàng)業(yè)者的良好借鑒。

          《互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄》主要寫給想自己創(chuàng)業(yè)的程序員,但同樣適合非技術(shù)人員,適合網(wǎng)絡(luò)創(chuàng)業(yè)者、大學(xué)生創(chuàng)業(yè)者、網(wǎng)絡(luò)營(yíng)銷人員及一切有志創(chuàng)業(yè)者。做網(wǎng)絡(luò)不一定要懂技術(shù),互聯(lián)網(wǎng)的成功是可以借鑒和延伸的!

          程序員健康指南

          549cce2600015a5003600369

          本書是為程序員量身制作的健康指南,針對(duì)頭痛、眼部疲勞、背部疼痛和手腕疼痛等常見的問(wèn)題,簡(jiǎn)要介紹了其成因、測(cè)試方法,并列出了每天的行動(dòng)計(jì)劃,從運(yùn)動(dòng)、飲食等方面給出詳細(xì)指導(dǎo),幫助程序員在不改變工作方式的情況下輕松擁有健康。

          本書適合程序員、長(zhǎng)期伏案工作的其他人群以及所有關(guān)心健康的人士閱讀。

          結(jié)網(wǎng)@改變世界的互聯(lián)網(wǎng)產(chǎn)品經(jīng)理

          54aa4f680001268603060435

          本書以如何創(chuàng)建、發(fā)布、推廣互聯(lián)網(wǎng)產(chǎn)品為主線,介紹了互聯(lián)網(wǎng)產(chǎn)品經(jīng)理的工作內(nèi)容以及應(yīng)對(duì)每一部分工作所需的方法和工具。為用戶創(chuàng)造價(jià)值是產(chǎn)品經(jīng)理的第一要?jiǎng)?wù),產(chǎn)品經(jīng)理的工作是圍繞用戶及具體任務(wù)展開的,本書豐富的案例和透徹的分析道出了從發(fā)現(xiàn)用戶到最終滿足用戶這一過(guò)程背后的玄機(jī)。

          本書面向現(xiàn)在正在從事及未來(lái)將要從事互聯(lián)網(wǎng)相關(guān)工作的創(chuàng)業(yè)者和產(chǎn)品經(jīng)理,也可以作為互聯(lián)網(wǎng)產(chǎn)品策劃人員或相關(guān)專業(yè)學(xué)生的參考書。新版完善了各章節(jié),增加了優(yōu)雅降級(jí)等內(nèi)容,讀者也可從中更深地去感受一名產(chǎn)品經(jīng)理的感悟。

          程序員面試邏輯題解析

          54aa4f7800016ca403240408

          程序員面試邏輯題解析》共分為3個(gè)部分。第一部分從有趣且鍛煉頭腦的謎題入手,繼而給出解題思路和詳細(xì)答案,更有"熱身問(wèn)題"給大家提供充分的思考空間。第二部分綜合了不同類型的謎題,如數(shù)獨(dú)、調(diào)度問(wèn)題及概率題等。神秘的第三部分帶領(lǐng)大家不斷歷險(xiǎn),開動(dòng)腦筋,解決大量密碼及銀行賬戶等方面的問(wèn)題。幾十道簡(jiǎn)潔的小謎題不僅充分鍛煉了我們的思維方式,更為提高面試成功率奠定了基礎(chǔ)。

              《程序員面試邏輯題解析》不僅適合程序員閱讀,更是謎題愛(ài)好者的饕餮盛宴。

          程序員,你傷不起

          54aa4f8d000171b703060435

          本書是作者博客文章的精選集。是作者作為老牌程序員、現(xiàn)在的IT 創(chuàng)業(yè)者15 年軟件開發(fā)生涯的心路歷程和經(jīng)驗(yàn)總結(jié)。涉及程序人生、開發(fā)經(jīng)驗(yàn)、職業(yè)規(guī)劃、創(chuàng)業(yè)心得。對(duì)任何的軟件開發(fā)者和IT 從業(yè)人員都有借鑒價(jià)值。作者語(yǔ)言風(fēng)趣幽默,讀起來(lái)津津有味。字里行間充滿了不屈不撓的碼農(nóng)正能量。

          像程序員一樣思考

          54aa4f9800013e1e03270405

          編程的真正挑戰(zhàn)不是學(xué)習(xí)一種語(yǔ)言的語(yǔ)法,而是學(xué)習(xí)創(chuàng)造性地解決問(wèn)題,從而構(gòu)建美妙的應(yīng)用。《像程序員一樣思考》分析了程序員解決問(wèn)題的方法,并且教授你其他圖書所忽略的一種能力,即如何像程序員一樣思考。

          全書分為8章。第1章通對(duì)幾個(gè)經(jīng)典的算法問(wèn)題切入,概括了問(wèn)題解決的基本技巧和步驟。第2章通過(guò)實(shí)際編寫C++代碼來(lái)解決幾個(gè)簡(jiǎn)單的問(wèn)題,從而讓讀者進(jìn)一步體會(huì)到問(wèn)題解決的思路和應(yīng)用。第3到7章是書中的主體部分,分別探討了用數(shù)組、指針和動(dòng)態(tài)內(nèi)存、類、遞歸和代碼復(fù)用來(lái)解決問(wèn)題的途徑和實(shí)際應(yīng)用。最后,第8章從培養(yǎng)程序員思維的角度,進(jìn)行了總結(jié)和概括,告訴讀者如何才能像程序員一樣思考。

          編寫可讀代碼的藝術(shù)

          54aa4fbf0001a7c103180417

          細(xì)節(jié)決定成敗,思路清晰、言簡(jiǎn)意賅的代碼讓程序員一目了然;而格式凌亂、拖沓冗長(zhǎng)的代碼讓程序員一頭霧水。除了可以正確運(yùn)行以外,優(yōu)秀的代碼必須具備良好的可讀性,編寫的代碼要使其他人能在最短的時(shí)間內(nèi)理解才行。本書旨在強(qiáng)調(diào)代碼對(duì)人的友好性和可讀性。

          本書關(guān)注編碼的細(xì)節(jié),總結(jié)了很多提高代碼可讀性的小技巧,看似都微不足道,但是對(duì)于整個(gè)軟件系統(tǒng)的開發(fā)而言,它們與宏觀的架構(gòu)決策、設(shè)計(jì)思想、指導(dǎo)原則同樣重要。編碼不僅僅只是一種技術(shù),也是一門藝術(shù),編寫可讀性高的代碼尤其如此。如果你要成為一位優(yōu)秀的程序員,要想開發(fā)出高質(zhì)量的軟件系統(tǒng),必須從細(xì)處著手,做到內(nèi)外兼修,本書將為你提供有效的指導(dǎo)。

          posted @ 2015-06-13 00:03 奮斗成就男人 閱讀(437) | 評(píng)論 (0)編輯 收藏

          Oracle分析函數(shù)入門

          一、Oracle分析函數(shù)入門

          分析函數(shù)是什么?
          分析函數(shù)是Oracle專門用于解決復(fù)雜報(bào)表統(tǒng)計(jì)需求的功能強(qiáng)大的函數(shù),它可以在數(shù)據(jù)中進(jìn)行分組然后計(jì)算基于組的某種統(tǒng)計(jì)值,并且每一組的每一行都可以返回一個(gè)統(tǒng)計(jì)值。

                    

          分析函數(shù)和聚合函數(shù)的不同之處是什么?
          普通的聚合函數(shù)用group by分組,每個(gè)分組返回一個(gè)統(tǒng)計(jì)值,而分析函數(shù)采用partition by分組,并且每組每行都可以返回一個(gè)統(tǒng)計(jì)值。

                        

          分析函數(shù)的形式
          分析函數(shù)帶有一個(gè)開窗函數(shù)over(),包含三個(gè)分析子句:分組(partition by), 排序(order by), 窗口(rows) ,他們的使用形式如下:over(partition by xxx order by yyy rows between zzz)。
          注:窗口子句在這里我只說(shuō)rows方式的窗口,range方式和滑動(dòng)窗口也不提

              

          分析函數(shù)例子(在scott用戶下模擬)

          示例目的:顯示各部門員工的工資,并附帶顯示該部分的最高工資。

          復(fù)制代碼
          --顯示各部門員工的工資,并附帶顯示該部分的最高工資。
          SELECT E.DEPTNO,
          E.EMPNO,
          E.ENAME,
          E.SAL,
          LAST_VALUE(E.SAL)
          OVER(PARTITION BY E.DEPTNO
          ORDER BY E.SAL ROWS
          --unbounded preceding and unbouned following針對(duì)當(dāng)前所有記錄的前一條、后一條記錄,也就是表中的所有記錄
          --unbounded:不受控制的,無(wú)限的
          --preceding:在...之前
          --following:在...之后
          BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL
          FROM EMP E;
          復(fù)制代碼

          運(yùn)行結(jié)果:

                         

          示例目的:按照deptno分組,然后計(jì)算每組值的總和

          SELECT EMPNO,
          ENAME,
          DEPTNO,
          SAL,
          SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME) max_sal
          FROM SCOTT.EMP;

          運(yùn)行結(jié)果:

               

          示例目的:對(duì)各部門進(jìn)行分組,并附帶顯示第一行至當(dāng)前行的匯總

          復(fù)制代碼
          SELECT EMPNO,
          ENAME,
          DEPTNO,
          SAL,
          --注意ROWS BETWEEN unbounded preceding AND current row 是指第一行至當(dāng)前行的匯總
          SUM(SAL) OVER(PARTITION BY DEPTNO
          ORDER BY ENAME
          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_sal
          FROM SCOTT.EMP;
          復(fù)制代碼

          運(yùn)行結(jié)果:

             

          示例目標(biāo):當(dāng)前行至最后一行的匯總

          復(fù)制代碼
          SELECT EMPNO,
          ENAME,
          DEPTNO,
          SAL,
          --注意ROWS BETWEEN current row AND unbounded following 指當(dāng)前行到最后一行的匯總
          SUM(SAL) OVER(PARTITION BY DEPTNO
          ORDER BY ENAME
          ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) max_sal
          FROM SCOTT.EMP;
          復(fù)制代碼

          運(yùn)行結(jié)果:

             

           示例目標(biāo):當(dāng)前行的上一行(rownum-1)到當(dāng)前行的匯總

          復(fù)制代碼
          SELECT EMPNO,
          ENAME,
          DEPTNO,
          SAL,
          --注意ROWS BETWEEN 1 preceding AND current row 是指當(dāng)前行的上一行(rownum-1)到當(dāng)前行的匯總
          SUM(SAL) OVER(PARTITION BY DEPTNO
          ORDER BY ENAME ROWS
          BETWEEN 1 PRECEDING AND CURRENT ROW) max_sal
          FROM SCOTT.EMP;
          復(fù)制代碼

          運(yùn)行結(jié)果:

              

          示例目標(biāo):   當(dāng)前行的上一行(rownum-1)到當(dāng)前行的下輛行(rownum+2)的匯總     

          復(fù)制代碼
          SELECT EMPNO,
          ENAME,
          DEPTNO,
          SAL,
          --注意ROWS BETWEEN 1 preceding AND 1 following 是指當(dāng)前行的上一行(rownum-1)到當(dāng)前行的下輛行(rownum+2)的匯總
          SUM(SAL) OVER(PARTITION BY DEPTNO
          ORDER BY ENAME
          ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) max_sal
          FROM SCOTT.EMP;
          復(fù)制代碼

          運(yùn)行結(jié)果:


          posted @ 2015-05-13 00:46 奮斗成就男人 閱讀(380) | 評(píng)論 (0)編輯 收藏

          常見分析函數(shù)詳解

               摘要: 三、常見分析函數(shù)詳解為了方便進(jìn)行實(shí)踐,特將演示表和數(shù)據(jù)羅列如下:一、創(chuàng)建表create table t( bill_month varchar2(12) , area_code number, net_type varchar(2), local_fare number );      二、插入數(shù)據(jù)insert i...  閱讀全文

          posted @ 2015-05-13 00:46 奮斗成就男人 閱讀(414) | 評(píng)論 (0)編輯 收藏

          ORACLE 常用函數(shù)

            這個(gè)系列我將整理一些日常我們經(jīng)常使用到的ORACLE函數(shù),鑒于篇幅太長(zhǎng),我大體會(huì)按下面分類來(lái)整理、匯總這些常用的ORACLE函數(shù),如果有些常用函數(shù)沒(méi)有被整理進(jìn)來(lái),也希望大家指點(diǎn)一二。

           1: 聚合函數(shù)

          2: 日期函數(shù)
          3: 字符串函數(shù)
          4: 格式化函數(shù)
          5: 類型轉(zhuǎn)換函數(shù)
          6: 加密函數(shù)
          7: 控制流函數(shù)
          8: 數(shù)學(xué)函數(shù)
          9: 系統(tǒng)信息函數(shù)
          10:分析函數(shù)

          ------------------------------------------聚合函數(shù)---------------------------------------------
          --1:   AVG(DISTINCT|ALL)

          ALL表示對(duì)所有的值求平均值,DISTINCT只對(duì)不同的值求平均值
          SELECT AVG(SAL) FROM SCOTT.EMP;
          SELECT AVG(DISTINCT SAL) FROM SCOTT.EMP;
          --2:   MAX(DISTINCT|ALL)

          求最大值,ALL表示對(duì)所有的值求最大值,DISTINCT表示對(duì)不同的值求最大值,相同的只取一次

          (加不加查詢結(jié)果一致,不知DISTINCT有什么用途,不同于AVG等聚合函數(shù))
          SELECT MAX(DISTINCT SAL) FROM SCOTT.EMP;
          SELECT MAX(SAL) FROM SCOTT.EMP
          --3:   MIN(DISTINCT|ALL)
          求最小值,ALL表示對(duì)所有的值求最小值,DISTINCT表示對(duì)不同的值求最小值,相同的只取一次
          SELECT MIN(SAL) FROM SCOTT.EMP;
          SELECT MIN(DISTINCT SAL) FROM SCOTT.EMP;

          --4:  STDDEV(distinct|all)
          求標(biāo)準(zhǔn)差,ALL表示對(duì)所有的值求標(biāo)準(zhǔn)差,DISTINCT表示只對(duì)不同的值求標(biāo)準(zhǔn)差
          SELECT STDDEV(SAL) FROM SCOTT.EMP;
          SELECT STDDEV(DISTINCT SAL) FROM SCOTT.EMP;

          --5:   VARIANCE(DISTINCT|ALL)
          求協(xié)方差  ALL表示對(duì)所有的值求協(xié)方差,DISTINCT表示只對(duì)不同的值求協(xié)方差
          SELECT VARIANCE(SAL) FROM SCOTT.EMP;
          SELECT VARIANCE(DISTINCT SAL) FROM SCOTT.EMP;

          --6:  SUM(DISTINCT|ALL)
          求和  ALL表示對(duì)所有值求和,DISTINCT表示只對(duì)不同值求和(相同值只取一次)
          SELECT SUM(SAL) FROM SCOTT.EMP;
          SELECT SUM(DISTINCT SAL) FROM SCOTT.EMP;


          --7:COUNT(DISTINCT|ALL)
          求記錄、數(shù)據(jù)個(gè)數(shù)。 ALL對(duì)所有記錄,數(shù)組做統(tǒng)計(jì), DISTINCT只對(duì)不同值統(tǒng)計(jì)(相同值只取一次)
          SELECT COUNT(SAL) FROM SCOTT.EMP;
          SELECT COUNT(DISTINCT SAL) FROM SCOTT.EMP;  
           
          ----8: MEDIAN
          求中位數(shù)
          SELECT MEDIAN(SAL) FROM SCOTT.EMP;
          SELECT MEDIAN(DISTINCT SAL) FROM SCOTT.EMP;  --錯(cuò)誤:DISTINCT 選項(xiàng)在此函數(shù)中禁用。
          ----------------------------------------------------------------------------------------------

          posted @ 2015-05-13 00:37 奮斗成就男人 閱讀(345) | 評(píng)論 (0)編輯 收藏

          如何判斷PHP空間是否支持curl, gzip等功能

          在使用PHP時(shí),我們需要將自己寫好的php文件上傳到已申請(qǐng)的php空間。由于租用或申請(qǐng)的php空間是不允許用戶進(jìn)行配置的,那么對(duì)于php的一些功能是否開啟,如curl, allow_url_fopen, gzip,就需要提前判斷,而不是等寫完代碼后發(fā)現(xiàn)不能使用時(shí),那樣改動(dòng)就大了。

          方法/步驟

          1. 其實(shí)判斷功能是否開啟,很簡(jiǎn)單,我們只需要寫一個(gè)php文件上傳之php空間服務(wù)器中。v.php的源代碼如圖。

            如何判斷PHP空間是否支持curl, gzip等功能
          2. 其含義很簡(jiǎn)單,就是傳入一個(gè)函數(shù)的名字,服務(wù)器判斷是否存在這個(gè)函數(shù),如果存在則表示支持該函數(shù)對(duì)應(yīng)的功能,輸出“支持”,反之輸出“不支持”。將文件上傳至php空間中。

            如何判斷PHP空間是否支持curl, gzip等功能
          3. 再通過(guò)訪問(wèn)空間,地址+v.php?f=+要測(cè)試的功能所包括的函數(shù),比如curl功能可以是v.php?f=curl_init,allow_url_fopen功能可以用v.php?f=fopen來(lái)測(cè)試。

          posted @ 2015-04-22 00:04 奮斗成就男人 閱讀(309) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共23頁(yè): 1 2 3 4 5 6 7 8 9 下一頁(yè) Last 
          主站蜘蛛池模板: 英超| 日照市| 南华县| 繁峙县| 北辰区| 资溪县| 乌兰察布市| 怀宁县| 德兴市| 卫辉市| 普格县| 华池县| 米脂县| 拜泉县| 冀州市| 金寨县| 仪征市| 杭锦旗| 汽车| 大化| 东城区| 望谟县| 紫阳县| 南安市| 鸡泽县| 唐海县| 云龙县| 镇赉县| 白朗县| 沁阳市| 平罗县| 神农架林区| 恩平市| 扶风县| 宁城县| 逊克县| 织金县| 祥云县| 红桥区| 巍山| 江阴市|