论坛首页 入门技术论坛

一种繁琐的SSH设计(三)

浏览 1958 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-10  
说他繁琐是因为每增加一个小功能,就必须书写很多代码,数据层书写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表单。


论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics