海水正藍

          面朝大海,春暖花開
          posts - 145, comments - 29, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          一.首先準備好solr的dataimport功能需要的東西,在solr的下載包中。分別在:
          1》Solr-1.3.0\dist\apache-solr-dataimporthandler-1.3.0.jar
          2》E:\education\search\Solr-1.3.0\example\example-DIH\solr\
          3》你是哪種數據庫,提供該數據庫的jdbc驅動。

          二.如果你還不會運行solr,請參考本人的前幾篇博客。這里要做的是,先把E:\education\search\Solr-1.3.0 \example\example-DIH\solr\下面的東西拷貝到solr的HOME目錄,然后刪除rss,這個是另外一個功能是導入rss訂閱信 息到solr中,確實很強,這都想到了。將jar文件,實際就兩個拷貝到tomcat的webapps下面的solr的WEB-INF的lib文件夾下 面。

          三.更改solr Home目錄下的conf/solrconfig.xml,其實就是提交一個solrRequestHandler,代碼如下:
          • <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  
          •     <lst name="defaults">  
          •       <str name="config">C:\solr-tomcat\solr\db\conf\db-data-config.xml</str>  
          •     </lst>  
          •   </requestHandler>  

          <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">    <lst name="defaults">      <str name="config">C:\solr-tomcat\solr\db\conf\db-data-config.xml</str>    </lst>  </requestHandler>

          四.將solr Home目錄下面的solrconfig.xml和schema.xml拷貝到db文件夾下面的conf中。

          五.修改db\conf\db-data-config.xml
          • <dataConfig>  
          •         <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/tuitui" user="root" password="mysql"/>  
          •     <document name="shop">  
          •             <entity name="tuitui_shop" pk="shopId" query="select * from tuitui_shop">  
          •             <field column="shopid" name="shopId" />  
          •             <field column="shopName" name="shopName" />  
          •             <field column="shopUrl" name="shopUrl" />  
          •             <field column="keyword" name="keyword" />  
          •             <field column="synopsis" name="synopsis" />  
          •             <field column="province" name="province" />  
          •             <field column="city" name="city" />  
          •             <field column="domain" name="domain" />  
          •             <field column="address" name="address" />  
          •             <field column="coordinate" name="coordinate" />  
          •             <field column="shopSspn" name="shopSspn" />  
          •             <field column="phone" name="phone" />  
          •             <field column="createTime" name="createTime" />  
          •         </entity>  
          •     </document>  
          • </dataConfig>  

          <dataConfig>                <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/tuitui" user="root" password="mysql"/>    <document name="shop">            <entity name="tuitui_shop" pk="shopId" query="select * from tuitui_shop">            <field column="shopid" name="shopId" />            <field column="shopName" name="shopName" />            <field column="shopUrl" name="shopUrl" />            <field column="keyword" name="keyword" />            <field column="synopsis" name="synopsis" />            <field column="province" name="province" />            <field column="city" name="city" />            <field column="domain" name="domain" />            <field column="address" name="address" />            <field column="coordinate" name="coordinate" />            <field column="shopSspn" name="shopSspn" />            <field column="phone" name="phone" />            <field column="createTime" name="createTime" />        </entity>    </document></dataConfig>

          其中的意思我做簡單解釋,具體大家可以去看看官方wiki。
          document:一個文檔也就是lucene的document這個沒什么解釋的;
          entity:主要針對的是一個數據庫表;
          filed:屬性column是數據庫的字段,name是filed的名字,即schema中的field name
          http://wiki.apache.org/solr/DataImportHandler

          六.啟動TOMCAT,輸入地址進行導入,導入分為很多模式:我選用的全部倒入模式。

          http://localhost/solr/dataimport?command=full-import
          原文出自:
          http://insolr.com/forum.php?mod=viewthread&tid=128&reltid=880&pre_thread_id=19&pre_pos=4&ext=

          posted @ 2012-12-03 16:51 小胡子 閱讀(2116) | 評論 (0)編輯 收藏

          先從網址
          http://labs.mop.com/apache-mirror/lucene/solr/3.6.1/apache-solr-3.6.1.zip 下載程序文件

          1.解壓開找到apache-solr-3.6.1\apache-solr-3.6.1\dist目錄下的apache-solr-3.6.1.war
          直接放到tomcat/webapps下面

          2.先別急著啟動慢慢來,修改配置文件apache-solr-3.6.1\WEB-INF\web.xml
          找到:
            <!-- People who want to hardcode their "Solr Home" directly into the
                 WAR File can set the JNDI property here...
             -->
            <!--
              <env-entry>
                 <env-entry-name>solr/home</env-entry-name>
                 <env-entry-value>/put/your/solr/home/here</env-entry-value>
                 <env-entry-type>java.lang.String</env-entry-type>
              </env-entry>
             -->
          更改這為
            <!-- People who want to hardcode their "Solr Home" directly into the
                 WAR File can set the JNDI property here...
             -->
              <env-entry>
                 <env-entry-name>solr/home</env-entry-name>
                 <env-entry-value>d:/solr_work/solr</env-entry-value>
                 <env-entry-type>java.lang.String</env-entry-type>
              </env-entry>
            注:紅色字體的文件夾為apache-solr-3.6.1\example\solr 該應用(此為單核應用,多核以后會講到)放大D盤的新建空目錄solr_work目錄下就可以


          3.啟動tomcat,輸入http://localhost:8080/solr  solr應用搭建成功
          原文出自:
          http://insolr.com/forum.php?mod=viewthread&tid=3&reltid=880&pre_thread_id=19&pre_pos=6&ext=

          posted @ 2012-12-03 16:50 小胡子 閱讀(584) | 評論 (0)編輯 收藏

          本文只是Solr 4.0的基礎教程,本人不經常寫東西,寫的不好請見諒,歡迎到群233413850進行討論學習。
                 先說一點部署之后肯定會有人用solrj,solr 4.0好像添加了不少東西,其中CommonsHttpSolrServer這個類改

          名為HttpSolrServer,我是找了半天才發現,大家以后可以注意。


               部署前準備:


          Solr 4.0 目錄:

                  

                  這里是我的部署方式,Tomcat安裝好之后把apache-solr-4.0.0\example\webapps下的solr.war文件拷貝到Tomcat下的

          Tomcat7.0\webapps目錄下,然后啟動Tomcat 報錯不用管,solr.war會自動解壓,之后打開Tomcat7.0\webapps\solr\WEB-

          INF\web.xml,把下面代碼復制進去放到后面:

          1. <env-entry>   
          2.       <env-entry-name>solr/home</env-entry-name>   
          3.       <env-entry-value>E:\SolrHome</env-entry-value>   
          4.       <env-entry-type>java.lang.String</env-entry-type>
          5.     </env-entry>
          復制代碼

                      其中  E:\SolrHome  是存放solr配置文件等,修改為自己文件的位置,為了看著更清晰直觀,你可以這樣放:


                      E:\Tomcat7.0


                      E:\apache-solr-4.0.0


                      E:\SolrHome


                      現在可以重新啟動Tomcat了,沒有報錯,通過這個地址進入Solr4.0頁面:http://localhost:8080/solr

                  

                      如果進入以上界面說明成功了,沒有成功的話頁面會有ERROR提示。


                      如圖:左側core0,core1等是solr 4.0中的示例,core0和core1位于apache-solr-4.0.0\example\multicore所有文件都下拷貝

          到E:\SoleHome下,core0和core1可以理解為兩個庫,都是獨立的,用來存放索引以及生成這些索引文件所需要的配置文件,solrtest是我測試建立的目錄,如圖:

                  沒添加一個庫都需要在solr.xml里面進行配置,這個比較簡單

          1. <solr persistent="false">  
          2.            <cores adminPath="/admin/cores" host="${host:}" hostPort="${jetty.port:}">   
          3.                  <core name="core0" instanceDir="core0" />   
          4.                  <core name="core1" instanceDir="core1" />   
          5.                  <core name="collection1" instanceDir="collection1" />   
          6.                  <core name="solrtest" instanceDir="solrtest"/>
          7.           </cores>
          8.    </solr>
          復制代碼
          name="",是庫的名字,instanceDir="",是目錄

                  每個目錄下包含兩個文件夾conf和data,data下有兩個文件夾index和tlog,index是存放生成的索引文件,tlog存放log,

          conf下是必要的配置文件schema.xml和solrconfig.xml,可以參考官方或者core里面的配置文件:

          1. <?xml version="1.0" ?>
          2. <schema name="example solr test" version="1.1">
          3.   <types>
          4.    <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
          5.    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
          6.   </types>

          7. <fields>   
          8.   <!-- general -->
          9.   <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
          10.   <field name="type" type="string" indexed="true" stored="true" multiValued="false" />
          11.   <field name="name" type="string" indexed="true" stored="true" multiValued="false" />
          12.   <field name="_version_" type="long" indexed="true" stored="true"/>
          13. </fields>

          14. <!-- field to use to determine and enforce document uniqueness. -->
          15. <uniqueKey>id</uniqueKey>

          16. <!-- field for the QueryParser to use when an explicit fieldname is absent -->
          17. <defaultSearchField>name</defaultSearchField>

          18. <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
          19. <solrQueryParser defaultOperator="OR"/>
          20. </schema>
          復制代碼

                  solrconfig.xml我還不是很懂,在這里就不講了,但是必須配置(好像是必須配):

          1. <?xml version="1.0" encoding="UTF-8" ?>
          2. <!-- 可以從core文件中copy過來 -->
          3. <config>
          4.   <luceneMatchVersion>LUCENE_40</luceneMatchVersion>
          5.   
          6.   <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>

          7.   <dataDir>${solr.solrtest.data.dir:}</dataDir>   這里solr.后面名字改掉

          8.   <updateHandler class="solr.DirectUpdateHandler2">
          9.     <updateLog>
          10.       <str name="dir">${solr.solrtest.data.dir:}</str>
          11.     </updateLog>
          12.   </updateHandler>

          13.   <requestHandler name="/get" class="solr.RealTimeGetHandler">
          14.     <lst name="defaults">
          15.       <str name="omitHeader">true</str>
          16.     </lst>
          17.   </requestHandler>
          18.   
          19.   <requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" />

          20.   <requestDispatcher handleSelect="true" >
          21.     <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
          22.   </requestDispatcher>
          23.   
          24.   <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
          25.   <requestHandler name="/analysis/field" startup="lazy" class="solr.FieldAnalysisRequestHandler" />
          26.   <requestHandler name="/update" class="solr.UpdateRequestHandler"  />
          27.   <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />

          28.   <requestHandler name="/admin/ping" class="solr.PingRequestHandler">
          29.     <lst name="invariants">
          30.       <str name="q">solrpingquery</str>
          31.     </lst>
          32.     <lst name="defaults">
          33.       <str name="echoParams">all</str>
          34.     </lst>
          35.   </requestHandler>

          36.   <!-- config for the admin interface -->
          37.   <admin>
          38.     <defaultQuery>solr</defaultQuery>
          39.   </admin>

          40. </config>
          復制代碼

                  之后在exampledocs目錄下手動創建一個solr1.xml文件:

          1. <?xml version="1.0" ?>
          2. <add>
          3.   <doc>
          4.     <field name="id">solr1</field>
          5.     <field name="type">type1</field>
          6.     <field name="name">my solr test</field>
          7.   </doc>
          8. </add>
          復制代碼

                   跟schema.xml中的字段對應,好了現在可以提交數據了,這里在window命令窗口提交數據,把E:\apache-solr-

          4.0.0\example\exampledocs下的post.jar復制到 E:\SolrHome\exampledocs下

                  打開命令窗口CD 到E:\SolrHome\exampledocs下使用命令,Tomcat不要忘了開:

          java -Durl=http://localhost:8080/solr/solrtest/update -Ddata=files -jar post.jar solr1.xml






          如圖成功的添加的索引,看下E:\SolrHome\solrtest\data\index下的文件:


                  進入solr頁面:

                  

                  點擊Executu Query查詢,右側生成了地址可以打開查看,到此結束。


          posted @ 2012-12-03 16:48 小胡子 閱讀(7405) | 評論 (1)編輯 收藏

           Debug視圖

          認識debug視圖,紅色部分框為線程堆棧視圖,黃色部分框為表達式、斷點、變量視圖,藍色部分為代碼視圖。



           線程堆棧視圖

          分別介紹一下這幾個按鈕的含義:

          1.表示當前實現繼續運行直到下一個斷點,快捷鍵為F8。

          2.表示打斷整個進程

          3.表示進入當前方法,快捷鍵為F5。

          4.表示運行下一行代碼,快捷鍵為F6。

          5.表示退出當前方法,返回到調用層,快捷鍵為F7。

          6.表示當前線程的堆棧,從中可以看出在運行哪些代碼,并且整個調用過程,以及代碼行號



           

          變量視圖

          1.為變量名視圖,顯示當前代碼行中所有可以訪問的實例變量和局部變量

          2.顯示所有的變量值

          3.可以通過該窗口來改變變量值



           

          斷點視圖

          1.顯示所有斷點

          2. 將當前窗口1中選中的端口失效,再次點擊啟用。

          3.異常斷點



           

          表達式視圖

          表達式視圖:表達式視圖是Debug過程中較為常用的一個視圖,可以對自己的感興趣的一些變量進行觀察,也可以增加一些自己的表達式,也可以查看一行代碼的運行結果。

          1.表達式

          2. 點擊此可以新增一個表達式



           

          代碼視圖

          代碼視圖:用來顯示具體的代碼。其中綠色部分是指當前將要執行的代碼



           

           

          場景一:小明辛苦了兩天終于將自己的負責的任務完成了,第二天轉測后,測試找到了小明說,小明的程序有bug,可以是小明經過仔細調試,發現本地沒有任何問題,但是測試的環境上確實有問題,所以小明遇到了難題,測試的環境linux,又不能上去linux去debug,小明這個時候想要是Linux也可以debug就好了.

          遠程debug

          遠程debug:遠程debug顧名思義,能夠將遠程操作系統上的任何java進行debug,但是有前提是本地需要有同步的代碼。

          1.遠程debug的步驟是在遠程操作系統上啟動java進程時增加特殊的

          -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n

          2.在Eclipse中新建一個Remote Java Application

          遠程debug

          1.打開Debug Configurations視圖

          2.右擊Remote Java Application,

          New

          3.選擇源碼工程

          4.輸入遠程IP和端口,端口即服務

          端的$DEBUG_PORT,點擊OK。




           
           

           

          場 景一:小明寫了一個任務執行者,該執行者不間斷的執行一些任務,在現網上運行了一段時間后,發現有概率的出現一些故障,發現運行一段時間后,該任務者異常 退出了,退出的因為是空指針,可以小明想要在本地debug,不知道斷點打在哪里,該問題是概率事件,不一定會出現,所以小明debug幾遍下來后,頭暈 眼花,連代碼都看不清楚了,小明想要是能有個斷點每當出現空指針異常的時候就停下來讓他發現問題,那該多好呀。

          異常斷點

          異常斷點:在定位問題的過程中,常常會遇到斷點無法打到合適的位置,以至于和問題的觸發點千差萬別,所以這個時候不妨試試異常斷點,顧名思義,異常斷點是指拋出某種異常后自動掛起的斷點。

          點擊紅色部位,增加一個異常斷點



           

          輸入想要定位的異常類型,例如NullPointerException,這樣系統中拋出任何NullPointerException異常后,都會掛起當前線程,給你機會去定位問題。

           

          場景一:小明寫了一個巨大的循環,在調測代碼時,小明發現每當循環到第100000次的時候,就是出現問題,沒有達到自己的預期,于是小明在循環里打了個斷點,想看看到底怎么回事,可小明萬萬沒有想到,想要到達100000次循環是多么的困難,小明這個時候已經開始浮想聯翩,如果能有這樣的斷點:

                       If 循環次數== 100000,線程停下來

          條件斷點

          如右圖,循環1000次,如果想要在循環到500

          次的時候停下來,可以創建一個條件斷點,右

          擊斷點懸著Breakpoint Properties。



           

          選中Enable Condition

          在空白處,添加你自己的條件,如果條件返回true,線程會被掛起,如果為false,則忽略該異常

          Hit Count為該斷點經過多少次后,正式掛起線程,如果設置為500,則表達前499次,經過該斷點都不會停下,當第500次,該斷點會掛起當前線程。

           

           

          表達式

          表達式可以查看一些在當前代碼中沒有的命令行,方便定位問題。

           

          場景一:小明最近遇到一個難題,在調用一個第三方插件時總是會有問題,小明懷疑是第三方插件的bug,但小明沒有找到源碼不能進行debug,小明該怎么辦呢?

          Debug定位第三方插件的問題

          1.使用反編譯工具將代碼反編譯

          2.將反編譯后的源碼進行過濾

          3.修復源碼編譯錯誤

          4.進行debug

          Debug一些經驗

          1.盡量減少debug,少用debug,優秀的程序員總是花80%的時間來思考如何解決問題,20%的時間來動手完成代碼,而糟糕的程序員總是用20%的時間去寫代碼,80%的時間去調試代碼,動手之前盡量想好如何去做,并且已經為你自己的思路做了充分的實驗。

          2.盡可能的提高debug的效率,設置合適的斷點,使用快捷鍵。

          3.debug的F6快捷鍵經常用到,它與金山詞霸的快捷鍵沖突,所以在debug的時候最好將金山詞霸關掉。

          4.debug的表達式是可執行代碼,將會對代碼結果產生永久性影響,在調試時注意,經常將不用的表達式清除掉。

          原文出自:
          http://mgoann.iteye.com/blog/1396637

          posted @ 2012-11-29 09:59 小胡子 閱讀(118) | 評論 (0)編輯 收藏

           1 import java.io.File;
           2 
           3 public class FileTest {
           4 
           5     public static void main(String[] args) throws Exception {
           6 
           7         System.out.println(Thread.currentThread().getContextClassLoader()
           8                 .getResource(""));
           9 
          10         System.out.println(FileTest.class.getClassLoader().getResource(""));
          11 
          12         System.out.println(ClassLoader.getSystemResource(""));
          13 
          14         System.out.println(FileTest.class.getResource(""));
          15 
          16         System.out.println(FileTest.class.getResource("/"));
          17 
          18         // Class文件所在路徑
          19 
          20         System.out.println(new File("/").getAbsolutePath());
          21 
          22         System.out.println(System.getProperty("user.dir"));
          23         
          24         System.out.println(System.getProperty("file.encoding"));
          25 
          26         
          27     }
          28 
          29 }

          posted @ 2012-11-27 11:33 小胡子 閱讀(248) | 評論 (0)編輯 收藏

          當我們啟動一個tomcat的服務的時候,jar包和claess文件是是以怎么樣的順序被加載進來的?

           

          加載順序:

          1. $java_home/lib 目錄下的java核心api 

          2. $java_home/lib/ext 目錄下的java擴展jar包

          3. java -classpath/-Djava.class.path所指的目錄下的類與jar包

          4. $CATALINA_HOME/common目錄下按照文件夾的順序從上往下依次加載

          5. $CATALINA_HOME/server目錄下按照文件夾的順序從上往下依次加載

          6. $CATALINA_BASE/shared目錄下按照文件夾的順序從上往下依次加載

          7. 我們的項目路徑/WEB-INF/classes下的class文件

          8. 我們的項目路徑/WEB-INF/lib下的jar文件

           

          在同一個文件夾下,jar包是按順序從上到下依次加載

           

                由ClassLoader的雙親委托模式加載機制我們可以知道,假設兩個包名和類名完全相同的class文件不再同一個jar包,如果一個class文件已經被加載java虛擬機里了,那么后面的相同的class文件就不會被加載了。

          原文 :
          http://xiaomogui.iteye.com/blog/847686

          posted @ 2012-11-22 12:03 小胡子 閱讀(1351) | 評論 (1)編輯 收藏

          多站點共享Session常見的作法有:

          • 使用.net自動的狀態服務(Asp.net State Service);
          • 使用.net的Session數據庫;
          • 使用Memcached。
          • 使用Cookie方式實現多個站點間的共享(這種方式只限于幾個站點都在同一域名的情況下); 

          這里我們就 演練一下 以數據庫的形來存儲Session,來實現多站點共享Session。 

          首先我們 建好一下站點,如下圖: 

           

          Default.aspx 

          其中 有二個Button  ,SetSession 主要是用于給一個 Session 賦值(如:Session["ShareValue"] = “abcd”

          ) ,

          GetSession 主要就是獲得 一個 Session 值。

          具體代碼如下:

            

           代碼部分就這么多就行了…

           

          下面就是要配置一下 Web.config了 , 其實主要就是在 <system.web>

           這個節點中 增加 machineKey 及 sessionState 這兩個節點,

          1.增加machineKey 主要作用是:

          “按照MSDN的標準說法:“對密鑰進行配置,以便將其用于對 Forms 身份驗證 Cookie 數據和視圖狀態數據進行加密和解密,并將其用于對進程外會話狀態標識進行驗證。”也就是說Asp.Net的很多加密,都是依賴于machineKey里面 的值,例如Forms 身份驗證 Cookie、ViewState的加密。默認情況下,Asp.Net的配置是自己動態生成,如果單臺服務器當然沒問題,但是如果多臺服務器負載均 衡,machineKey還采用動態生成的方式,每臺服務器上的machinekey值不一致,就導致加密出來的結果也不一致,不能共享驗證和 ViewState,所以對于多臺服務器負載均衡的情況,一定要在每臺站點配置相同的machineKey。“ ,具體可以查一下其它資料。

          2.增加 sessionState 主要是讓 Session 保存在數據庫中。 

          具體配置如下:

          <machineKey validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54" decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046" validation="SHA1" decryption="AES"/>
           
          <sessionState mode="SQLServer" sqlConnectionString="Data Source=PC-07195;Initial Catalog=AWBUISession;Persist Security Info=True;User ID=jins;Password=js@#$1234" allowCustomSqlDatabase="true" cookieless="false" timeout="100"/>

          網站部分 這樣就好了。。。 下面就是要配置據庫了…..

          數據庫配置:

          使用aspnet_regsql.exe工具

          ASP.NET 2.0版本后微軟提供了aspnet_regsql.exe工具可以方便的配置Session數據庫.該工具位于 Web 服務器上的"系統根目錄\Microsoft.NET\Framework\版本號"文件夾中.

          使用舉例:

          aspnet_regsql.exe -S . -U sa -123456 -ssadd -sstype p
          -S參數:

          表示數據庫實例名稱. 可以用"."表示本機.

          -U和-P參數:

          表示用戶名和密碼.

          -E參數:

          可以再-U –P 與 -E中選擇一組. –E表示以當前系統用戶通過windows身份驗證登錄數據庫, -U -P則是使用SqlServer用戶登錄數據庫.

          -ssadd / –ssremove 參數:

          -ssadd表示是添加Session數據庫, -ssremove表示移除Session數據庫.

          sstype 參數說明:

          t

          將會話數據存儲到 SQL Server tempdb 數據庫中。這是默認設置。如果將會話數據存儲到 tempdb 數據庫中,則在重新啟動 SQL Server 時將丟失會話數據。

          p

          將會話數據存儲到 ASPState 數據庫中,而不是存儲到 tempdb 數據庫中。

          c

          將會話數據存儲到自定義數據庫中。如果指定 c 選項,則還必須使用 -d 選項包括自定義數據庫的名稱。

          我的設置是:aspnet_regsql.exe -S . - E -d AWBUISession -ssadd -sstype c 

           

          好了。基本的 我們就已經搞定了。。

          現在 我們分別把我們剛建的一個網站 部署 到 IIS 中。不過我們既然要負載。至少也的部署兩份

          我們把 其中一個 服務器中的 defaut.aspx 中 “服務器 1” 改成 “服務器 2” ,這樣做的主要目地是 做一下 區別! 

          具體如下:

          兩個網站的 URL分別是:

           server 1:127.0.0.1:8081;

          server 2:127.0.0.1:8080;   

          OK。下面我們就是 配置 Nignx了。

          首先 在 nginx\conf 配置  文件中找到 nginx.conf 這個文件 ,就記事本打開,

          做如上的 設置:

          OK。  nginx  這樣配置 就算OK 了。 我們啟動一下 nginx ..

          在瀏覽器中 輸入我們 在 nginx 中配置的 URL 如:127.0.0.1:8090

          我們會看到 服務器 1 已經開始為我們服務了,我們再點一下 “SetSession”來設置一下一個 會話值,
          我們會看到 服務器 2 開始 工作。這時我們再點一下 “GetSesion”看一下 剛才在 服務器 1 設置 的會話值,結果如下 :
          出現這種情況 ,主要就是在數據庫中存儲 一個會話時 沒有做到 服務器1 和服務2的Session 共享,主要是 在ASPStateTempSessions 這個表中的 一個SessionID,其中的SessionId包括兩個部分:網站生成的24位SessionID及8位AppName對于不同的站點,其AppName不同,在能夠在不同站點下使24位SessionID相同的情況下,要保證經過組合加上AppName后的SessionID相同,可以通過修改存儲過程TempGetAppID,使其得到的SessionID與AppName無關,修改TempGetAppID如下:

          ALTER PROCEDURE [dbo].[TempGetAppID]
              
          @appName    tAppName,
              
          @appId      int OUTPUT
              
          AS
              
          SET @appName = 'Test' --LOWER(@appName) 修改這里,使多個站點的APPname ,為一個固定值。
              SET @appId = NULL
              
          SELECT @appId = AppId
              
          FROM [AWBUISession].dbo.ASPStateTempApplications
              
          WHERE AppName = @appName
              
          IF @appId IS NULL BEGIN
                  
          BEGIN TRAN
                  
          SELECT @appId = AppId
                  
          FROM [AWBUISession].dbo.ASPStateTempApplications WITH (TABLOCKX)
                  
          WHERE AppName = @appName
                  
          IF @appId IS NULL
                  
          BEGIN
                      
          EXEC GetHashCode @appName@appId OUTPUT
                      
          INSERT [AWBUISession].dbo.ASPStateTempApplications
                      
          VALUES
                      (
          @appId@appName)
                      
          IF @@ERROR = 2627
                      
          BEGIN
                          
          DECLARE @dupApp tAppName
                          
          SELECT @dupApp = RTRIM(AppName)
                          
          FROM [AWBUISession].dbo.ASPStateTempApplications
                          
          WHERE AppId = @appId
                          
          RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.'181@appName@dupApp)
                      
          END
                  
          END
                  
          COMMIT
              
          END
              
          RETURN 0   
          經過以上修改之后,下面要實現多個站點共用同一個SessionID.

          重啟一下各站點。再在瀏覽一下網站點 “SetSession”, 再點:“GetSession” 這樣 我們就看到 服務器2 給出了我們 剛才在 服務器 1 中設置 的會話值了。

          我們 再點:“GetSession”,可以看到  服務器1 和服務器 2 返回的是相同的結果,達到了 “多站點共享Session”
          附加一點: Session 過期刪除,主要是 在 SQL server 代理中的作業完成,具體的可以,查一下其它相關資料.

           


          原文出自:
          http://www.cnblogs.com/red-fox/archive/2012/11/05/2755271.html



          posted @ 2012-11-06 13:51 小胡子 閱讀(338) | 評論 (1)編輯 收藏

               摘要: 1.加載JDBC驅動程序 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1     import java.sql.DriverManager;   ...  閱讀全文

          posted @ 2012-11-01 12:45 小胡子 閱讀(1078) | 評論 (0)編輯 收藏

          Apache Shiro 架構

          ApacheShiro的設計目標是使程序的安全變得簡單直觀而易于實現,shiro的核心設計參照大多數用戶對安全的思考模式--如何對某人(或某事)在與程序交互的環境中的進行安全控制。

          程序設計通常都以用戶為基礎,換句話說,你經常以用戶可以(或者應該)如何與軟件交互為基礎來設計用戶接口或者服務API,例如,你可能說,“如果當前與我程序交互的用戶已經登錄了,我將展示一個按鈕給他,他可以點擊去查看自己的賬戶住處,如果他們沒有登錄,我將顯示一個注冊按鈕。”

          這個陳述例子指出我們開發程序很大程度上是為了滿足用戶的需求,即使“用戶(User)”是另外一個軟件系統而并非一個人,你仍然要寫代碼對當前與你軟件交互的誰(或者什么)的動作進行回應。

          shiro從它的設計中表現了這種理念,為了與軟件開發者的直覺相配合,Apache Shiro在幾乎所有程序中保留了直觀和易用的特性。

           

          概覽

          在概念層,shiro架構包含三個主要的理念:Subject,SecurityManagerRealm。下面的圖展示了這些組件如何相互作用,我們將在下面依次對其進行描述。

          subject:就像我們在上一章示例中提到的那樣,subject本質上是當前運行用戶特定的'view',而單詞“user”經常暗指一個人,subject可以是一個人,但也可以是第三方服務、守護進程帳戶、時鐘守護任務或者其它--當前和軟件交互的任何事件。

          subject實例都和(也需要)一個SecurityManager綁定,當你和一個subject進行交互,這些交互動作被轉換成SecurityManagersubject特定的交互動作。

          SecurityManager:SecurityManagerShiro架構的核心,配合內部安全組件共同組成安全傘。然而,一旦一個程序配置好了SecurityManager和它的內部對象,SecurityManager通常獨自留下來,程序開發人員幾乎花費的所有時間都集中在Subjet API上。

          我們將在以后詳細討論SecurityManager,但當你和一個Subject互動時了解它是很重要的。任何Subject的安全操作中SecurityManager是幕后真正的舉重者,這在上面的圖表中可以反映出來。

          RealmsReamlsShiro和你的程序安全數據之間的“橋”或者“連接”,它用來實際和安全相關的數據如用戶執行身份認證(登錄)的帳號和授權(訪問控制)進行交互,shiro從一個或多個程序配置的Realm中查找這些東西。

          Realm本質上是一個特定的安全DAO:它封裝與數據源連接的細節,得到shiro所需的相關的數據。在配置shiro的時候,你必須指定至少一個Realm來實現認證(authentication)和/或授權(authorization)。SecurityManager可以配置多個復雜的Realm,但是至少有一個是需要的。

          Shiro提供out-of-the-box Realms來連接安全數據源(或叫地址)如LDAPJDBC、文件配置如INI和屬性文件等,如果已有的Realm不能滿足你的需求你也可以開發自己的Realm實現。

          和其它內部組件一樣,ShiroSecurityManager管理如何使用Realms獲取Subject實例所代表的安全和身份信息。

           

          詳細架構

          下面的圖表展示了Shiro的核心架構思想,下面有簡單的解釋。

          Subject (org.apache.shiro.subject.Subject)

          正在與軟件交互的一個特定的實體“view”(用戶、第三方服務、時鐘守護任務等)。

          SecurityManager(org.apache.shiro.mgt.SecurityManager)

          如同上面提到的,SecurityManager Shiro的核心,它基本上就是一把“傘”用來協調它管理的組件使之平穩地一起工作,它也管理著Shiro中每一個程序用戶的視圖,所以它知道每個用戶如何執行安全操作。

          Authenticator(org.apache.shiro.authc.Authenticator)

          Authenticator是一個組件,負責執行和反饋用戶的認證(登錄),如果一個用戶嘗試登錄,Authenticator就開始執行。Authenticator知道如何協調一個或多個保存有相關用戶/帳號信息的Realm,從這些Realm中獲取這些數據來驗證用戶的身份以確保用戶確實是其表述的那個人。

          Authentication Strategy(org.apache.shiro.authc.pam.AuthenticationStrategy)

          如果配置了多個RealmAuthenticationStrategy將會協調Realm確定在一個身份驗證成功或失敗的條件(例如,如果在一個方面驗證成功了但其他失敗了,這次嘗試是成功的嗎?是不是需要所有方面的驗證都成功?還是只需要第一個?)

          Authorizer(org.apache.shiro.authz.Authorizer)

          Authorizer是負責程序中用戶訪問控制的組件,它是最終判斷一個用戶是否允許做某件事的途徑,像Authenticator一樣,Authorizer也知道如何通過協調多種后臺數據源來訪問角色和權限信息,Authorizer利用這些信息來準確判斷一個用戶是否可以執行給定的動作。

          SessionManager(org.apache.shiro.session.mgt.SessionManager)

          SessionManager知道如何創建并管理用戶Session生命周期而在所有環境中為用戶提供一個強有力的Session體驗。這在安全框架領域是獨一無二--Shiro具備管理在任何環境下管理用戶Session的能力,即使沒有Web/Servlet或者EJB容器。默認情況下,Shiro將使用現有的session(如Servlet Container),但如果環境中沒有,比如在一個獨立的程序或非web環境中,它將使用它自己建立的session提供相同的作用,sessionDAO用來使用任何數據源使session持久化。

          SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)

          SessionDAO代表SessionManager執行Session持久(CRUD)動作,它允許任何存儲的數據掛接到session管理基礎上。

          CacheManager(org.apache.shiro.cache.CacheManager)

          CacheManager創建并管理其它shiro組件的catch實例生命周期,因為shiro要訪問許多后端數據源來實現認證、授權和session管理,caching已經成為提升性能的一流的框架特征,任何一個現在開源的和/或企業級的caching產品都可以插入到shiro中實現一個快速而有效的用戶體驗。

          Cryptography (org.apache.shiro.crypto.*)

          Cryptography在安全框架中是一個自然的附加產物,shirocrypto包包含了易用且易懂的加密方式,Hashes(亦即digests)和不同的編碼實現。該包里所有的類都亦于理解和使用,曾經用過Java自身的加密支持的人都知道那是一個具有挑戰性的工作,而shiro的加密API簡化了java復雜的工作方式,將加密變得易用。

          Realms (org.apache.shiro.realm.Realm)

          如同上面提到的,Realmshiro和你的應用程序安全數據之間的“橋”或“連接”,當實際要與安全相關的數據進行交互如用戶執行身份認證(登錄)和授權驗證(訪問控制)時,shiro從程序配置的一個或多個Realm中查找這些數據,你需要配置多少個Realm便可配置多少個Realm(通常一個數據源一個),shiro將會在認證和授權中協調它們。

           

          SecurityManager

          因為shiro API鼓勵以Subject為中心的開發方式,大部分開發人員將很少會和SecurityManager直接交互(盡管框架開發人員也許發現它非常有用),盡管如此,知道SecurityManager如何工作,特別是當在一個程序中進行配置的時候,是非常重要的。

           

          設計

          如前所述,程序中SecurityManager執行操作并且管理所有程序用戶的狀態,在shiro基礎的SecurityManager實現中,包含以下內容:

          認證(Authentication

          授權(Authorization

          會話管理(Session Management

          緩存管理(Cache Management

          Realm協調(Realm coordination

          事件傳導(Event propagation

          "RememberMe" 服務("Remember Me" Services

          建立Subject(Subject creation)

          退出登錄(Logout

          及其它。

          但這些功能都在一個單獨的組件中管理,并且,當所有功能集中在一個類中實現是靈活和可定制是非常困難的。

          為了實現配置的簡單、靈活、可插拔,shiro在設計時實現了高模塊化--盡管模塊化,SecurityManager(包括它的繼承類)并沒有做到,相反地,SecurityManager實現更像一個輕量級的‘容器(container)’,代表幾乎所有嵌套/封裝組件的行為,這種‘封裝(wrapper)’設計在上面的架構圖表中已有反映。

          當組件執行邏輯的時候,SecurityManager知道如何以及何時去協調組件做出正確的動作。

          SecurityManagerJavaBean兼容,這允許你(或者配置途徑)通過標準的JavaBean訪問/設置方法(get*/set*)很容易地定制插件,這意味著shiro模塊可以根據用戶行為轉化成簡易的配置。

           

          簡易的配置

          因為適合JavaBean,任何支持Javabean配置的組件都有非常簡單的途徑配置SecurityManager,如SpringGuiceJBoss,等等。

           

          我們將在下一節討論配置(Configuration

           

          為文檔加把手

          我們希望這篇文檔可以幫助你使用Apache Shiro進行工作,社區一直在不斷地完善和擴展文檔,如果你希望幫助shiro項目,請在你認為需要的地方考慮更正、擴展或添加文檔,你提供的任何點滴幫助都將擴充社區并且提升Shiro

           

          提供你的文檔的最簡單的途徑是將它發送到用戶論壇(http://shiro-user.582556.n2.nabble.com/)或郵件列表(http://shiro.apache.org/mailing-lists.html

           

           原文地址:http://shiro.apache.org/architecture.html

          posted @ 2012-09-12 22:39 小胡子 閱讀(827) | 評論 (0)編輯 收藏

               摘要: 1.上下文Context、面向切面編程AOP模型分析 在本人的“.NET面向上下文、AOP架構模式(概述)” 一文中,我們大概了解了上下文如何輔助對象在運行時的管理。在很多時候我們急需在運行時能把對象控制在一定的邏輯范圍內,在必要的時候能讓他們體現出集中 化的概念,如人群、車輛、動物等等。而Context與AOP有著密切的聯系,Context表示邏輯抽象的范圍而AOP描述了...  閱讀全文

          posted @ 2012-09-12 22:29 小胡子 閱讀(305) | 評論 (1)編輯 收藏

          僅列出標題
          共15頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 Last 
          主站蜘蛛池模板: 布尔津县| 咸宁市| 绥中县| 玉龙| 无锡市| 都安| 鲁甸县| 巴楚县| 扎兰屯市| 永川市| 中超| 巴彦县| 黔江区| 榕江县| 册亨县| 汕头市| 鹤峰县| 商河县| 多伦县| 静宁县| 兰州市| 西安市| 阆中市| 钟祥市| 清徐县| 廉江市| 牡丹江市| 子洲县| 肇州县| 天津市| 星子县| 荔波县| 忻州市| 淮阳县| 绥滨县| 五大连池市| 娄烦县| 安平县| 乐亭县| 永定县| 莲花县|