`
tovegar
  • 浏览: 31205 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一种繁琐的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表单。


分享到:
评论

相关推荐

    SSH三大框架的网页系统设计

    本项目通过整合这三个框架,旨在提供一种便捷的方式来设计和实现复杂的网页系统。 Struts2是MVC(Model-View-Controller)架构模式的一个优秀实现,它为开发者提供了强大的请求处理和视图展示能力。Struts2框架通过...

    ssh课程设计--课程设计管理系统

    针对学生在专业技术方面实施基础训练,在这个过程当中,学生的理论知识能力可以得到提高,可以帮助学生将课堂的理论知识转化为实践能力,提高在实际操作当中处理问题的效率,同时也能够作为一种方式,来检测理论实际...

    ssh网上商城项目代码全 课程设计

    通过本次课程设计,不仅可以让学习者深入理解SSH三大框架的工作原理及其应用场景,还能培养实际项目的开发能力和团队协作精神。未来随着技术的发展,还可以考虑引入更多先进的技术和理念来优化和完善该项目,比如...

    SSH-struts第一种方式整合

    在本项目"SSH-struts第一种方式整合"中,我们将深入探讨如何将这三个组件结合在一起,构建出强大的后端业务逻辑和直观的前端展示。 首先,Struts作为MVC(模型-视图-控制器)设计模式的实现,主要负责处理HTTP请求...

    毕业设计 基于SSH框架的系统

    【标题】"基于SSH框架的系统"是一种常见的企业级应用开发模式,SSH分别代表Spring、Struts和Hibernate三个开源框架的首字母缩写。Spring作为核心的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented ...

    SSH课程设计——博客网站

    它提供了一种灵活的Action机制,使得开发者可以通过配置文件或注解定义URL到Action的映射,以及Action执行后的结果跳转。在这个博客系统中,Struts2可能用于处理用户的登录、注册、发布文章、评论等操作。 2. **...

    SSH框架毕业设计

    在这个SSH毕业设计项目中,很可能是使用MySQL作为后端数据库,MySQL是一种广泛使用的开源关系型数据库管理系统,因其高效、稳定和易于管理而受到青睐。JSP(JavaServer Pages)则被用作视图层,用于展示动态生成的...

    SSH三大框架

    SSH三大框架指的是Spring、Struts和Hibernate这三个在Java Web开发中广泛应用的开源框架。它们各自承担着不同的职责,共同构建出高效、灵活的企业级应用程序。 Spring框架是核心,它提供了全面的架构支持,包括依赖...

    SSH框架课程设计影院管理系统.rar

    它提供了一种组织应用结构的方式,使得视图、模型和控制器之间保持松耦合。Struts通过Action类处理用户请求,并将结果转发到JSP页面进行展示。 Hibernate作为ORM(对象关系映射)工具,解决了Java应用程序与数据库...

    基于SSH三大框架的信息管理系统的毕业设计带数据库和论文

    1. **Struts2**:作为表现层框架,它提供了一种组织应用结构和处理HTTP请求的方式。Struts2的核心是Action,它负责接收请求,调用业务逻辑,然后返回结果到视图。此外,Struts2还有丰富的拦截器机制,可以实现如权限...

    SSH三大框架整合jar包

    Hibernate是一个优秀的对象关系映射(ORM)框架,它提供了一种在Java应用中操作数据库的便捷方式,消除了SQL和Java对象之间的转换工作。 1. **实体类**:Hibernate通过Java类映射数据库表,这些类就是实体类。 2. *...

    SSH2 三级联下拉框

    它提供了一种灵活的Action机制,允许开发者定义特定的Action类来处理不同的用户请求。在创建三级联动下拉框时,Struts2的拦截器和结果类型配置将起到关键作用,它们可以控制页面跳转和数据传递。 接下来是Spring...

    注解三表ssh框架

    "注解三表SSH框架"通常指的是在Java开发中...总之,"注解三表SSH框架"是一种高效、灵活的Java Web开发方式,它利用注解简化了框架的配置和数据库操作,使得开发者能更专注于业务逻辑的实现,提高了开发效率和代码质量。

    java web课程设计+ssh

    Struts2提供了一种灵活的拦截器机制,可以方便地扩展和定制应用程序的行为。 2. **Hibernate**:作为持久层,它是一个强大的对象关系映射(ORM)框架,使得开发者可以用Java对象来操作数据库,而无需编写SQL语句。...

    SSH+dwr实现三级级联

    DWR(Direct Web Remoting)则是一种JavaScript库,允许在浏览器和服务器之间进行实时的、异步的数据交换,增强了Web应用的用户体验。在这个场景中,“SSH + dwr 实现三级级联”指的是使用SSH框架与DWR技术结合,来...

    Java三大框架SSH框架

    这个框架组合提供了一种高效且灵活的方式来构建Web应用程序,尤其在处理增删改查(CRUD)操作、分页、上传下载等功能时表现出色。下面将详细介绍这三个框架及其相互作用。 1. **Spring框架**: Spring 是一个全面...

    基于SSH技术的Linux远程控制系统的设计与实现.pdf

    2. Windows操作系统的图形化优势:Windows操作系统凭借其图形化操作优势,设计开发一种Windows平台下的跨平台操作Linux系统的软件具有重要意义。 3. SSH技术的安全性:SSH技术可以把所有传输的数据进行加密,从而...

    java毕业设计基于SSH

    它的主要优点是提供了一种声明式编程方式,通过配置文件可以轻松管理控制器逻辑。Struts2还提供了丰富的拦截器机制,允许开发者自定义行为,如登录验证、权限检查等。 2. **Spring框架**:Spring是Java企业级应用的...

    JSP基于SSH2物流快递管理系统设计毕业源码案例设计.zip

    【描述】提到的"使用Java开发的毕业设计系统项目源码"意味着该系统是用Java编程语言编写的,这是一种广泛应用的、面向对象的语言,特别适合于企业级应用开发。它具有高度的可移植性,能够运行在多种操作系统上。此外...

Global site tag (gtag.js) - Google Analytics