海水正蓝

面朝大海,春暖花开
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 小胡子 阅读(2094) | 评论 (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 小胡子 阅读(563) | 评论 (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 小胡子 阅读(7386) | 评论 (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 小胡子 阅读(112) | 评论 (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 小胡子 阅读(244) | 评论 (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 小胡子 阅读(1333) | 评论 (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 小胡子 阅读(331) | 评论 (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 小胡子 阅读(1068) | 评论 (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 小胡子 阅读(818) | 评论 (0)编辑 收藏

     摘要: 1.上下文Context、面向切面编程AOP模型分析 在本人的“.NET面向上下文、AOP架构模式(概述)” 一文中,我们大概了解了上下文如何辅助对象在运行时的管理。在很多时候我们急需在运行时能把对象控制在一定的逻辑范围内,在必要的时候能让他们体现出集中 化的概念,如人群、车辆、动物等等。而Context与AOP有着密切的联系,Context表示逻辑抽象的范围而AOP描述了...  阅读全文

posted @ 2012-09-12 22:29 小胡子 阅读(272) | 评论 (1)编辑 收藏

仅列出标题
共15页: First 上一页 4 5 6 7 8 9 10 11 12 下一页 Last