??xml version="1.0" encoding="utf-8" standalone="yes"?>
获取数据 query.setLockMode Ҏ询语句中特定别名所对应的记录进行加锁(我们?TUsercL定了一个别名“user”)Q这里也是对返回的所有user记录q行加锁?观察q行期Hibernate生成的SQL语句Q?/p>
q里Hibernate通过使用数据库的for update子句实现?font color="#0000ff">悲观?/strong>机制?Hibernate的加锁模式有Q?
optimistic-lock属性有如下可选取| 注意version 节点必须出现在ID 节点之后?q里我们声明了一个version属性,用于存放用户的版本信息,保存在TUser表的 version字段中?此时如果我们试~写一D代码,更新TUser表中记录数据Q如Q? 每次对TUserq行更新的时候,我们可以发现Q数据库中的version都在递增?而如果我们尝试在tx.commit 之前Q启动另外一个SessionQ对名ؓErica 的用 戯行操作,以模拟ƈ发更新时的情形: 执行以上代码Q代码将在tx.commit()处抛?font color="#0000ff">StaleObjectStateException?常,q指出版本检查失败,当前事务正在试图提交一个过期数据。通过捕捉q个异常Q我 们就可以在乐观锁校验p|时进行相应处理?
]]>
]]>
业务逻辑的实现过E中Q往往需要保证数据访问的排他性。如在金融系l的日终l算 处理中,我们希望针对某个cut-off旉点的数据q行处理Q而不希望在结进行过E中 Q可能是几秒U,也可能是几个时Q,数据再发生变化。此Ӟ我们需要通过一些机制来保证q些数据在某个操作过E中不会被外界修改,q样的机Ӟ在这里,也就是所?的“锁”,?font color="#0000ff">l我们选定的目标数据上锁,使其无法被其他程序修?/strong>?Hibernate支持两种锁机Ӟ即通常所说的“悲观锁QPessimistic LockingQ?和“乐观锁QOptimistic LockingQ”?/p>
一 Q?font color="#0000ff">悲观?/strong>Q?u>Pessimistic LockingQ?
悲观锁,正如其名Q它指的是对数据被外界(包括本系l当前的其他事务Q以及来自外部系l的事务处理Q修Ҏ保守态度Q因此,在整个数据处理过E中Q将数据处于锁定 状态。悲观锁的实玎ͼ往往依靠数据库提供的锁机Ӟ也只有数据库层提供的锁机制才?真正保证数据讉K的排他?/u>Q否则,即在本pȝ中实C加锁机制Q也无法保证外部p?l不会修Ҏ据)?一个典型的倚赖数据库的悲观锁调用: select * from account where name=”Erica?for update q条sql 语句锁定了account 表中所有符合检索条Ӟname=”Erica”)的记录?本次事务提交之前Q事务提交时会释放事务过E中的锁Q,外界无法修改q些记录?Hibernate的悲观锁Q也是基于数据库的锁机制实现?下面的代码实CҎ询记录的加锁Q?/p>
String hqlStr
=
"
from TUser as user where user.name=’Erica?/span>
"
;
2
Query query
=
session.createQuery(hqlStr);
3
query.setLockMode(
"
user
"
,LockMode.UPGRADE);
//
加锁
4
List userList
=
query.list();
//
执行查询Q?/span>
select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex from t_user tuser0_ where (tuser0_.name
=
’Erica’?
for
update
? LockMode.NONE Q?无锁机制?
? LockMode.WRITE QHibernate在Insert和Update记录的时候会自动 获取?
? LockMode.READ Q?Hibernate在读取记录的时候会自动获取?
以上q三U锁机制一般由Hibernate内部使用Q如HibernateZ保证Update q程中对象不会被外界修改Q会在saveҎ实现中自动ؓ目标对象加上WRITE锁?br />
? LockMode.UPGRADE Q?font color="#0000ff">利用数据库的for update子句加锁?
? LockMode. UPGRADE_NOWAIT QOracle的特定实玎ͼ利用Oracle的for update nowait子句实现加锁?
上面q两U锁机制是我们在应用层较为常用的Q加锁一般通过以下Ҏ实现Q?
Criteria.setLockMode
Query.setLockMode
Session.lock
注意Q只有在查询开始之前(也就是Hiberate 生成SQL 之前Q设定加锁,才会 真正通过数据库的锁机制进行加锁处理,否则Q数据已l通过不包含for update 子句的Select SQL加蝲q来Q所谓数据库加锁也就无从谈v?
?Q乐观锁QOptimistic LockingQ?
相对悲观锁而言Q乐观锁机制采取了更加宽杄加锁机制。悲观锁大多数情况下?靠数据库的锁机制实现Q以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销Q特别是寚w事务而言Q这L开销往往无法承受?如一个金融系l,当某个操作员d用户的数据,q在d的用h据的基础上进 行修ҎQ如更改用户帐户余额Q,如果采用悲观锁机Ӟ也就意味着整个操作q?E中Q从操作员读出数据、开始修改直x交修改结果的全过E,甚至q包括操?员中途去煮咖啡的旉Q,数据库记录始l处于加锁状态,可以惌Q如果面对几 百上千个q发Q这L情况导致怎样的后果?乐观锁机制在一定程度上解决了这个问题?font color="#ff0000">乐观?大多是基于数据版?QVersionQ记录机制实?/strong>。何谓数据版本?即ؓ数据增加一个版本标识,在基?数据库表的版本解x案中Q一般是通过为数据库表增加一个“version”字D| 实现?d出数据时Q将此版本号一同读出,之后更新ӞҎ版本号加一。此Ӟ提 交数据的版本数据与数据库表对应记录的当前版本信息q行比对Q如果提交的数据 版本号大于数据库表当前版本号Q则予以更新Q否则认为是q期数据?对于上面修改用户帐户信息的例子而言Q假?Q?br />
数据库中帐户信息表中有一?version字段Q当前gؓ1Q而当前帐户余额字D(balanceQؓ$100?
1 Q操作员A 此时其dQversion=1Q,q从其帐户余额中扣除$50 Q?100-$50Q?
2 Q 在操作员A操作的过E中Q操作员B也读入此用户信息Qversion=1Q,q?从其帐户余额中扣?20Q?100-$20Q?
3Q?操作员A完成了修改工作,数据版本号加一Qversion=2Q,q同帐户?除后余额Qbalance=$50Q,提交x据库更新Q此时由于提交数据版本大 于数据库记录当前版本Q数据被更新Q数据库记录version更新??
4Q?操作员B完成了操作,也将版本号加一Qversion=2Q试囑数据库提交数 据(balance=$80Q,但此时比Ҏ据库记录版本时发玎ͼ操作员B提交?数据版本号ؓ2Q数据库记录当前版本也ؓ2Q不满“提交版本必d于记 录当前版本才能执行更新“的乐观锁策略,因此Q操作员B 的提交被驛_?q样Q就避免了操作员B 用基于version=1 的旧数据修改的结果覆盖操?员A的操作结果的可能?
从上面的例子可以看出Q乐观锁机制避免了长事务中的数据库加锁开销Q操作员A 和操作员B操作q程中,都没有对数据库数据加锁)Q大大提升了大ƈ发量下的p?l整体性能表现?需要注意的是,乐观锁机制往往Zpȝ中的数据存储逻辑Q因此也具备一定的局 限性,如在上例中,׃乐观锁机制是在我们的pȝ中实玎ͼ来自外部pȝ的用?余额更新操作不受我们pȝ的控Ӟ因此可能会造成脏数据被更新到数据库中。在 pȝ设计阶段Q我们应该充分考虑到这些情况出现的可能性,q进行相应调_?乐观锁{略在数据库存储q程中实玎ͼ对外只开攑֟于此存储q程的数据更新?径,而不是将数据库表直接对外公开Q?Hibernate 在其数据讉K引擎中内|了乐观锁实?/strong>。如果不用考虑外部pȝҎ 据库的更新操作,利用Hibernate提供的透明化乐观锁实现Q将大大提升我们?生力?Hibernate中可以通过class描述W的optimistic-lock属性结合version 描述W指定?
现在Q我们ؓ之前CZ中的TUser加上乐观锁机制?br />
1Q?首先为TUser的class描述W添加optimistic-lock属性:
<
hibernate
-
mapping
>
<
class
name
=
"
org.hibernate.sample.TUser
"
table
=
"
t_user
"
dynamic
-
update
=
"
true
"
dynamic
-
insert
=
"
true
"
optimistic
-
lock
=
"
version
"
>
……?br />
</
class
>
</
hibernate
-
mapping
>
? none 无乐观锁
? version 通过版本机制实现乐观?
? dirty 通过查发生变动过的属性实C观锁
? all 通过查所有属性实C观锁
其中通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现Q同时也 是Hibernate中,目前唯一在数据对象脱Session发生修改的情况下依然有效的锁??/u>。因此,一般情况下Q我们都选择version方式作ؓHibernate乐观锁实现机制?
2Q?d一个Version属性描q符
代码内容
<
hibernate
-
mapping
>
2
<
class
3
name
=
"
org.hibernate.sample.TUser
"
4
table
=
"
t_user
"
5
dynamic
-
update
=
"
true
"
6
dynamic
-
insert
=
"
true
"
7
optimistic
-
lock
=
"
version
"
8
>
9
<
id
10
name
=
"
id
"
11
column
=
"
id
"
12
type
=
"
java.lang.Integer
"
13
>
14
<
generator
class
=
"
native
"
>
15
</
generator
>
16
</
id
>
17
<
version
18
column
=
"
version
"
19
name
=
"
version
"
20
type
=
"
java.lang.Integer
"
21
/>
22
…… ?br />
23
</
class
>
24
</
hibernate
-
mapping
>
25
代码内容
Criteria criteria
=
session.createCriteria(TUser.
class
);
2
criteria.add(Expression.eq(
"
name
"
,
"
Erica
"
));
3
List userList
=
criteria.list();
4
TUser user
=
(TUser)userList.get(
0
);
5
Transaction tx
=
session.beginTransaction();
6
user.setUserType(
1
);
//
更新UserType字段
7
tx.commit();
8
代码内容
Session session
=
getSession();
2
Criteria criteria
=
session.createCriteria(TUser.
class
);
3
criteria.add(Expression.eq(
"
name
"
,
"
Erica
"
));
4
Session session2
=
getSession();
5
Criteria criteria2
=
session2.createCriteria(TUser.
class
);
6
criteria2.add(Expression.eq(
"
name
"
,
"
Erica
"
));
7
List userList
=
criteria.list();
8
List userList2
=
criteria2.list();TUser user
=
(TUser)userList.get(
0
);
9
TUser user2
=
(TUser)userList2.get(
0
);
10
Transaction tx
=
session.beginTransaction();
11
Transaction tx2
=
session2.beginTransaction();
12
user2.setUserType(
99
);
13
tx2.commit();
14
user.setUserType(
1
);
15
tx.commit();
16
]]>
其实q一些代码都是早几个月写?自己很懒,所以到今天才写到自q博客?高深的文章自己写不了Q只能记录下一些简单的记录与点_其中的代码算是自p乐的Q希望高手不要把重构之类的砸下来...
1、在windowspȝ下的的C盘,Z个名叫s的文件夹,在该文g多w面随便徏三个txt文gQ随便v名啦Q就?1.txt","2.txt"?3.txt"?
其中1.txt的内容如下:
2、下载lucene包,攑֜classpath路径?
建立索引:
索引的结果:
3、徏立了索引之后Q查询啦....
其运行结果:
q是lucene1.4.3版的API
Lucene 其实很简单的,它最主要是做两件事:建立索引和进行搜?
来看一些在lucene中用的术语,q里q不打算作详l的介绍,只是点一下而已----因ؓq一个世界有一U好东西Q叫搜烦?/p>
IndexWriter:lucene中最重要的的cM一Q它主要是用来将文档加入索引Q同时控制烦引过E中的一些参C用?/p>
Analyzer:分析?主要用于分析搜烦引擎遇到的各U文本。常用的有StandardAnalyzer分析?StopAnalyzer分析?WhitespaceAnalyzer分析器等?/p>
Directory:索引存放的位|?lucene提供了两U烦引存攄位置Q一U是盘Q一U是内存。一般情况将索引攑֜盘上;相应地lucene提供了FSDirectory和RAMDirectory两个cR?/p>
Document:文档;Document相当于一个要q行索引的单元,M可以惌被烦引的文g都必{化ؓDocument对象才能q行索引?/p>
FieldQ字Dc?/p>
IndexSearcher:是lucene中最基本的检索工P所有的索都会用到IndexSearcher工具;
Query:查询Qlucene中支持模p查询,语义查询Q短语查询,l合查询{等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery{一些类?/p>
QueryParser: 是一个解析用戯入的工具Q可以通过扫描用户输入的字W串Q生成Query对象?/p>
Hits:在搜索完成之后,需要把搜烦l果q回q显C给用户Q只有这h是完成搜烦的目的。在lucene中,搜烦的结果的集合是用Hitscȝ实例来表C的?/p>
上面作了一大堆名词解释Q下面就看几个简单的实例?
1、简单的的StandardAnalyzer试例子
2、看另一个实?单地建立索引Q进行搜?
很久没有看lucene了,q两三天又复习了一?上一些代码都是前几个月写的,只是改动了一些字W串和包名显C。{载时误明,文章来自:http://lighter.javaeye.com?
如有什么错误的地方Q恳h出,谢谢?br />
StandardAnalyzer是lucene中内|的"标准分析?,可以做如下功?
1、对原有句子按照I格q行了分?
2、所有的大写字母都可以能转换为小写的字母
3、可以去掉一些没有用处的单词Q例?is","the","are"{单词,也删除了所有的标点
同时也可以对中文q行分词(效果不好),现在有很多的中文分词包可以采?
下面的这个站收录的比较全Q收藏之?
东西q真不少Q慢慢学啦,可惜没有我想要的
【Java开?Jsp标签库?
Posted by E_wsq 2006-3-29 9:32:00
displytag
与Strutsl合使用最出名的一个tag主要是显C格数据很漂亮、完善?
500)this.style.width=500;?border=0> http://displaytag.sourceforge.net/
cewolf tag
用来在web上显C复杂图形报表的一个jsp tag?
500)this.style.width=500;?border=0> http://cewolf.sourceforge.net/
Loading Tab
当一个复杂的操作可以加蝲比较长的旉Ӟ用这个tag?
500)this.style.width=500;?border=0> http://www.mycgiserver.com/~eboudrant/#taglibs
DbForms
DbForms!它是一个基?Java (Servlet,JSP/Taglib)的快速应用程序开发环境,可以帮助开发h员快速徏造基于Web的数据库应用E序?
500)this.style.width=500;?border=0> http://jdbforms.sourceforge.net/
Jakarta Taglibs
Jakarta Taglibs 是ؓJSP定制标签库和相关的项目提供的一个开源仓库,?TagLibraryValidatorc,和对面生成工具的扩展来支持标签库。Jakarta Taglibs 也包括了对JSP Standard Tag Library (JSTL)的参考实现。这个实现基于项目标准。目前,在Jakarta Taglibs 中没有其它标{ֺ代表了Java Community Process (JCP) 标准?
500)this.style.width=500;?border=0> http://jakarta.apache.org/taglibs/index.html
EasyLDAP
关键?J2EE Spring Acegi
对于一个典型的Web应用Q完善的认证和授权机制是必不可少的,在SpringFramework中,Juergen Hoeller提供的范例JPetStorel了一些这斚w的介l,但还q远不够QAcegi是一个专门ؓSpringFramework提供安全机制?目Q全UCؓAcegi Security System for SpringQ当前版本ؓ0.5.1Q就其目前提供的功能Q应该可以满绝大多数应用的需求?/p>
本文的主要目的是希望能够说明如何在基于Spring构架的Web应用中用AcegiQ而不是详l介l其中的每个接口、每个类。注意,即对已l存在的Spring应用Q通过下面介绍的步骤,也可以马上n受到Acegi提供的认证和授权?/p>
[基础工作]
在你的Web应用的lib中添加Acegi下蝲包中的acegi-security.jar
[web.xml]
实现认证和授权的最常用的方法是通过filterQAcegi亦是如此Q通常Acegi需要在web.xmld以下5个filter:
<filter>
<filter-name>Acegi Channel Processing Filter</filter-name>
<filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>net.sf.acegisecurity.securechannel.ChannelProcessingFilter</param-value>
</init-param>
</filter>
<filter>
<filter-name>Acegi Authentication Processing Filter</filter-name>
<filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter</param-value>
</init-param>
</filter>
<filter>
<filter-name>Acegi HTTP BASIC Authorization Filter</filter-name>
<filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>net.sf.acegisecurity.ui.basicauth.BasicProcessingFilter</param-value>
</init-param>
</filter>
<filter>
<filter-name>Acegi Security System for Spring Auto Integration Filter</filter-name>
<filter-class>net.sf.acegisecurity.ui.AutoIntegrationFilter</filter-class>
</filter>
<filter>
<filter-name>Acegi HTTP Request Security Filter</filter-name>
<filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter</param-value>
</init-param>
</filter>
最先引赯惑的是net.sf.acegisecurity.util.FilterToBeanProxyQAcegi自己的文档上解释是: “What FilterToBeanProxy does is delegate the Filter’s methods through to a bean which is obtained from the
Spring application context. This enables the bean to benefit from the Spring application context lifecycle support and configuration flexibility.”,如希望深I的话,ȝ看源代码应该不难理解?/p>
再下来就是添加filter-mapping了:
<filter-mapping>
<filter-name>Acegi Channel Processing Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Acegi Authentication Processing Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Acegi HTTP BASIC Authorization Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Acegi Security System for Spring Auto Integration Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Acegi HTTP Request Security Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
q里Q需要注意以下两点:
1) q几个filter的顺序是不能更改的,序不对无法正常工作;
2) 如果你的应用不需要安全传输,如httpsQ则”Acegi Channel Processing Filter”相兛_Ҏ释掉卛_Q?
3) 如果你的应用不需要Spring提供的远E访问机Ӟ如Hessian and BurlapQ将”Acegi HTTP BASIC Authorization
Filter”相兛_Ҏ释掉卛_?/p>
[applicationContext.xml]
接下来就是要dapplicationContext.xml中的内容了,从刚才FilterToBeanFactory的解释可以看出,真正的filter?
在Spring的applicationContext中管理:
1) 首先Q你的数据库中必d有保存用户名和密码的tableQAcegi要求table的schema必须如下Q?/p>
CREATE TABLE users (
username VARCHAR(50) NOT NULL PRIMARY KEY,
password VARCHAR(50) NOT NULL,
enabled BIT NOT NULL
);
CREATE TABLE authorities (
username VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL
);
CREATE UNIQUE INDEX ix_auth_username ON authorities ( username, authority );
ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) REFERENCES users
(username);
2) d讉K你的数据库的datasource和Acegi的jdbcDaoQ如下:
<bean id=”dataSource?class=”org.springframework.jdbc.datasource.DriverManagerDataSource?gt;
<property name=”driverClassName?gt;<value>${jdbc.driverClassName}</value></property>
<property name=”url?gt;<value>${jdbc.url}</value></property>
<property name=”username?gt;<value>${jdbc.username}</value></property>
<property name=”password?gt;<value>${jdbc.password}</value></property>
</bean>
<bean id=”jdbcDaoImpl?class=”net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl?gt;
<property name=”dataSource?gt;<ref bean=”dataSource?></property>
</bean>
3) dDaoAuthenticationProvider:
<bean id=”daoAuthenticationProvider?class=”net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider?gt;
<property name=”authenticationDao?gt;<ref bean=”authenticationDao?></property>
<property name=”userCache?gt;<ref bean=”userCache?></property>
</bean>
<bean id=”userCache?class=”net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache?gt;
<property name=”minutesToIdle?gt;<value>5</value></property>
</bean>
如果你需要对密码加密Q则在daoAuthenticationProvider中加入:<property name=”passwordEncoder?gt;<ref
bean=”passwordEncoder?></property>QAcegi提供了几U加密方法,详细情况可看?
net.sf.acegisecurity.providers.encoding
4) dauthenticationManager:
<bean id=”authenticationManager?class=”net.sf.acegisecurity.providers.ProviderManager?gt;
<property name=”providers?gt;
<list>
<ref bean=”daoAuthenticationProvider?>
</list>
</property>
</bean>
5) daccessDecisionManager:
<bean id=”accessDecisionManager?class=”net.sf.acegisecurity.vote.AffirmativeBased?gt;
<property name=”allowIfAllAbstainDecisions?gt;
<value>false</value>
</property>
<property name=”decisionVoters?gt;
<list><ref bean=”roleVoter?></list>
</property>
</bean>
<bean id=”roleVoter?class=”net.sf.acegisecurity.vote.RoleVoter?>
6) dauthenticationProcessingFilterEntryPoint:
<bean id=”authenticationProcessingFilterEntryPoint?
class=”net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint?gt;
<property name=”loginFormUrl?gt;<value>/acegilogin.jsp</value></property>
<property name=”forceHttps?gt;<value>false</value></property>
</bean>
其中acegilogin.jsp是登陆页面,一个最单的d面如下Q?/p>
<%@ taglib prefix=’c?uri=’http://java.sun.com/jstl/core?%>
<%@ page import=”net.sf.acegisecurity.ui.AbstractProcessingFilter?%>
<%@ page import=”net.sf.acegisecurity.AuthenticationException?%>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form action=?lt;c:url value=’j_acegi_security_check?>?method=”POST?gt;
<table>
<tr><td>User:</td><td><input type=’text?name=’j_username?gt;</td></tr>
<tr><td>Password:</td><td><input type=’password?name=’j_password?gt;</td></tr>
<tr><td colspan=??gt;<input name=”submit?type=”submit?gt;</td></tr>
<tr><td colspan=??gt;<input name=”reset?type=”reset?gt;</td></tr>
</table>
</form>
</body>
</html>
7) dfilterInvocationInterceptor:
<bean id=”filterInvocationInterceptor?
class=”net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor?gt;
<property name=”authenticationManager?gt;
<ref bean=”authenticationManager?>
</property>
<property name=”accessDecisionManager?gt;
<ref bean=”accessDecisionManager?>
</property>
<property name=”objectDefinitionSource?gt;
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
\A/sec/administrator.*\Z=ROLE_SUPERVISOR
\A/sec/user.*\Z=ROLE_TELLER
</value>
</property>
</bean>
q里h意,要objectDefinitionSource中定义哪些页面需要权限访问,需要根据自q应用需求进行修改,我上面给?
的定义的意思是q样的:
a. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON意思是在比较请求\径时全部转换为小?
b. \A/sec/administrator.*\Z=ROLE_SUPERVISOR意思是只有权限为ROLE_SUPERVISOR才能讉K/sec/administrator*的页?
c. \A/sec/user.*\Z=ROLE_TELLER意思是只有权限为ROLE_TELLER的用h能访?sec/user*的页?/p>
8) dsecurityEnforcementFilter:
<bean id=”securityEnforcementFilter?class=”net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter?gt;
<property name=”filterSecurityInterceptor?gt;
<ref bean=”filterInvocationInterceptor?>
</property>
<property name=”authenticationEntryPoint?gt;
<ref bean=”authenticationProcessingFilterEntryPoint?>
</property>
</bean>
9) dauthenticationProcessingFilter:
<bean id=”authenticationProcessingFilter?
class=”net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter?gt;
<property name=”authenticationManager?gt;
<ref bean=”authenticationManager?>
</property>
<property name=”authenticationFailureUrl?gt;
<value>/loginerror.jsp</value>
</property>
<property name=”defaultTargetUrl?gt;
<value>/</value>
</property>
<property name=”filterProcessesUrl?gt;
<value>/j_acegi_security_check</value>
</property>
</bean>
其中authenticationFailureUrl是认证失败的面?/p>
10) 如果需要一些页面通过安全通道的话Q添加下面的配置:
<bean id=”channelProcessingFilter?class=”net.sf.acegisecurity.securechannel.ChannelProcessingFilter?gt;
<property name=”channelDecisionManager?gt;
<ref bean=”channelDecisionManager?>
</property>
<property name=”filterInvocationDefinitionSource?gt;
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
\A/sec/administrator.*\Z=REQUIRES_SECURE_CHANNEL
\A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL
\A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL
\A.*\Z=REQUIRES_INSECURE_CHANNEL
</value>
</property>
</bean>
<bean id=”channelDecisionManager?class=”net.sf.acegisecurity.securechannel.ChannelDecisionManagerImpl?gt;
<property name=”channelProcessors?gt;
<list>
<ref bean=”secureChannelProcessor?>
<ref bean=”insecureChannelProcessor?>
</list>
</property>
</bean>
<bean id=”secureChannelProcessor?class=”net.sf.acegisecurity.securechannel.SecureChannelProcessor?>
<bean id=”insecureChannelProcessor?class=”net.sf.acegisecurity.securechannel.InsecureChannelProcessor?>
[~少了什么?]
Acegi目前提供了两U”secure object”,分别寚w面和Ҏq行安全认证理Q我q里介绍的只是利?
FilterSecurityInterceptor对访问页面的权限控制Q除此之外,Acegiq提供了另外一个Interceptor?
MethodSecurityInterceptorQ它l合runAsManager可实现对对象中的Ҏ的权限控Ӟ使用Ҏ可参看Acegi自带的文?
和contact范例?/p>
[最后要说的]
本来以ؓ只是说明如何使用Acegi而已Q应该非常简单,但真正写h才发现想要条理清楚的理顺所有需要的beanq是?
困难的,但愿我没有遗漏太多东西,如果我的文章有什么遗漏或错误的话Q还请参看Acegi自带的quick-start范例Q但?
注意Q这个范例是不能直接拿来用的?/p>
原文在这里:
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=54881
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="show_sql">true</property>
<property name="current_session_context_class">thread</property>
<!--Fetch Size 是设定JDBC的Statementd数据的时候每ơ从数据库中取出的记录条?->
<property name="jdbc.fetch_size">20</property>
<!--Batch Size是设定对数据库进行批量删除,扚w更新和批量插入的时候的Ҏ大小Q有点相当于讄Buffer~冲区大的意?->
<property name="jdbc.batch_size ">20</property>
<property name="connection.username">HNMC</property>
<property name="connection.password">sundy</property>
<property name="connection.url">jdbc:oracle:thin:@192.168.0.20:1521:ora9</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- 在这U情况下Q没问题?-->
<property name="c3p0.timeout">60</property>
<property name="c3p0.idle_test_period">600</property>
<!--
<!--<property name="c3p0.idle_test_period">120</property>-->
如改以下俩|或他们差距很大:
<property name="c3p0.timeout">600</property>
<!--<property name="c3p0.idle_test_period">60</property>-->
当我启动tomcatQ运行程序后Q空?00后出C列异?但程序还照常q行
-->
<!--
Hibernate里可以设|的属性不多:
#c3p0-native property name hibernate configuration key
#c3p0.acquireIncrement hibernate.c3p0.acquire_increment
#c3p0.idleConnectionTestPeriod hibernate.c3p0.idle_test_period
#c3p0.initialPoolSize not available -- uses minimum size
#c3p0.maxIdleTime hibernate.c3p0.timeout
#c3p0.maxPoolSize hibernate.c3p0.max_size
#c3p0.maxStatements hibernate.c3p0.max_statements
#c3p0.minPoolSize hibernate.c3p0.min_size
#c3p0.testConnectionsOnCheckout hibernate.c3p0.validate hibernate 2.x only!
另外的属性你需要配|c3p0.properties
比如Q?
c3p0.acquireRetryDelay=111
c3p0.acquireRetryAttempts=22
c3p0.breakAfterAcquireFailure=true
-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">2</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">50000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<!-- ?lt;property name="hibernate.c3p0.validate">false</property>实在hibernate中不可设| ?->
<property name="hibernate.c3p0.validate">false</property>
<!--C3P0 setting-->
<property name="c3p0.max_size">20</property>
<property name="c3p0.min_size">5</property>
<!--获取q接的等待时?->
<property name="c3p0.timeout">3600</property>
<property name="c3p0.max_statements">100</property>
<!--每隔3600毫秒试q接是否可以正常使用-->
<property name="c3p0.idle_test_period">3600</property>
<property name="c3p0.acquire_increment">2</property>
<mapping resource="com/sundy/hnmc/beans/AccountBean.hbm.xml"/>
</session-factory>
</hibernate-configuration>
另一个设|?br /> <!-- 数据源配|?/span>--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:mysql://localhost/tycho?useUnicode=true&characterEncoding=utf-8</value>
</property>
<property name="properties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="c3p0.minPoolSize">1</prop>
<prop key="hc3p0.maxPoolSize">10</prop>
<prop key="hc3p0.timeout">60</prop>
<prop key="c3p0.max_statement">50</prop>
<prop key="c3p0.testConnectionOnCheckout">true</prop>
<prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
<prop key="user">root</prop>
<prop key="password">root</prop>
</props>
</property>
</bean>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.acquire_increment">2</property>