一种繁琐的SSH设计(三)

说他繁琐是因为每增加一个小功能,就必须书写很多代码,数据层书写service 接口与实现。dao 接口与实现。
action层要写strus-config.xml Define.xml validation.xml等
方法配置里面必须在ApplicationResources.properties LookupMethods.properties
还有spirng bean定义。太多了,繁琐。
还有我说一下关于此SSH定义中一些其他的东西:

登陆 用户 权限验证 :acegi
利用配置文件就可以完成用户的登陆和 权限的控制方便。
但是acegi缺点是 比较慢,并且如果在TOMCAT启动的时候有人进行登陆,那么就会造成权限丢失。不知道是我
配置的问题还是acegi的问题。
acegi配置:applicationContext-acegi.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

<bean id="loggerListener" class="org.acegisecurity.event.authentication.LoggerListener" />

<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
</value>
</property>
</bean>

<!-- 根据session中存放的信息组装ContextHolder。ContextHolder主要用于存放SecureContext,包括用户的权限信息-->
<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"></bean>

<!-- 处理认证请求(通常是一个登录页面的表单请求) -->
<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager">
<ref bean="authenticationManager" />
</property>
<property name="authenticationFailureUrl">
<value>/login.jsp?login_error=1</value>
</property>
<property name="defaultTargetUrl">
<value>/main.do?method=main</value>
</property>
<property name="filterProcessesUrl">
<value>/j_acegi_security_check</value>
</property>
<property name="rememberMeServices"><ref local="rememberMeServices"/></property>
</bean>
<!-- 匿名用户处理。如果用户尚未登录,将生成一个匿名用户的Authentication存放到ContextHolder中-->
<bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
<property name="key">
<value>anonymous</value>
</property>
<property name="userAttribute">
<value>anonymousUser,AUTH_ANONYMOUS</value>
</property>
</bean>

<!-- 认证管理器-->
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="daoAuthenticationProvider" />
<ref local="anonymousAuthenticationProvider" />
<ref local="rememberMeAuthenticationProvider"/>
</list>
</property>
<!--禁止同一帐号重复登陆系统(可选)-->
<property name="sessionController">
<ref bean="concurrentSessionController" />
</property>
</bean>

<bean id="concurrentSessionController" class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">
<property name="maximumSessions">
<value>1</value>
</property>
<property name="sessionRegistry"><ref local="sessionRegistry"/></property>
</bean>

<bean id="sessionRegistry" class="org.acegisecurity.concurrent.SessionRegistryImpl"/>


<!-- 用于认证匿名用户-->
<bean id="anonymousAuthenticationProvider" class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
<property name="key">
<value>anonymous</value>
</property>
</bean>
<!-- 基于数据库的认证提供者,daoAuthenticationProvider主要功能是从数据库取出用户名和密码,判断登录信息是否正确,如果是,则取出用户权限等用户
信息,并且存放到cache中,以便以后再次使用。-->
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
<property name="userDetailsService">
<ref local="userDetailsServiceHibernate" />
</property>
<property name="userCache">
<ref bean="userCache" />
</property>
<property name="passwordEncoder">
<ref bean="passwordEncoder" />
</property>
</bean>

<bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder" />

<!-- 自定义userDetailsServiceHibernateImplTarget 检验用户合法性 -->
<bean id="userDetailsServiceHibernateImplTarget" class="com.bidlink.acegi.UserDetailsServiceHibernate">
<property name="userDao">
<ref bean="userDao" />
</property>
</bean>

<bean id="userDetailsServiceHibernate" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.acegisecurity.userdetails.UserDetailsService</value>
</property>
<property name="interceptorNames">
<list>
<idref bean="transactionInterceptor" />
<idref local="userDetailsServiceHibernateImplTarget" />
</list>
</property>
</bean>

<!--
<bean id="userServiceTransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributeSource">
<value>org.acegisecurity.userdetails.UserDetailsService.loadUserByUsername=PROPAGATION_REQUIRED</value>
</property>
</bean>
-->


<!-- 强制安全验证过滤器。验证所请求的url是否在用户的权限范围内.-->
<bean id="securityEnforcementFilter" class="org.acegisecurity.intercept.web.SecurityEnforcementFilter">
<property name="filterSecurityInterceptor">
<ref local="filterInvocationInterceptor" />
</property>
<property name="authenticationEntryPoint">
<ref local="authenticationProcessingFilterEntryPoint" />
</property>
</bean>

<!-- 配置登录界面信息-->
<bean id="authenticationProcessingFilterEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl">
<value>/login.jsp</value>
</property>
<property name="forceHttps">
<value>false</value>
</property>
</bean>
<!-- securityEnforcementFilter的作用主要是将http请求转发给filterSecurityInterceptor,由filterSecurityInterceptor来对HTTP请求的合法
性进行判断-->
<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager">
<ref bean="authenticationManager" />
</property>
<property name="accessDecisionManager">
<ref local="httpRequestAccessDecisionManager" />
</property>
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/login.jsp*=AUTH_ANONYMOUS,AUTH_USER
/bidinfoaction.do?method?post=AUTH_ANONYMOUS,AUTH_USER
/bidinfoaction.do?method?oppugn=AUTH_ANONYMOUS,AUTH_USER
/1982456112aadsfad/datadts.do*=AUTH_ANONYMOUS,AUTH_USER
/**=AUTH_USER</value>
</property>
</bean>

<!-- 投票通过策略管理器
allowIfAllAbstainDecisions:设定是否允许:“没人反对就通过”的投票策略
decisionVoters:投票者
-->
<bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
<property name="allowIfAllAbstainDecisions">
<value>false</value>
</property>
<property name="decisionVoters">
<list>
<ref bean="roleVoter" />
</list>
</property>
</bean>

<!-- 投票者-->
<bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter">
<property name="rolePrefix">
<value>AUTH_</value>
</property>
</bean>


<bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
<property name="rememberMeServices">
<ref local="rememberMeServices"/>
</property>
</bean>

<bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService"><ref local="userDetailsServiceHibernate"/></property>
<property name="key"><value>springRocks</value></property>
</bean>

<bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key"><value>springRocks</value></property>
</bean>

</beans>

利用的是集成接口出来自己写的Dao登陆,还有是单点多系统登陆。

关于全文检索lucene利用的是solr:
看大家在JAVAEYE中有很多利用solr的介绍,我也就不赘述了。
但是因为公司大约有40多人在这个系统上进行不间断的操作(一个人一天处理300-400条信息)。
为了保证实时性只能1分钟建立以此索引。后来solr确实撑不住这么频繁的文件操作,所以改成3分钟建立以此索引。
用solr的commit进行提交。
但是还是有问题,索引文件大约有5G的样子,每晚进行优化。还有经常报出来 内存溢出的问题。
附录:solr的服务器,2G内存分配给 tomcat1G

spring 的后拦截问题:
不知道算不算spring 的BUG在,在利用spring的后拦截来处理,在保存文档到数据库的过程中,利用拦截把连接下来的model保存到全文检索中。但是如果文档保存数据库失败,拦截器仍然进行,在索引中保存造成数据库和检索不一致。

与其他系统的交互,与其他系统的交互很多,方式也不一样:
1.利用oracle定时处理,和存储过程直接进行数据库的复制和转移
2.利用RMI进行交互,这种交互基本是实时进行的
3.和PHP 和 ASP语言进行交互时,利用的form表单的post方法进行提交过来,在本系统中进行接收form表单。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值