说他繁琐是因为每增加一个小功能,就必须书写很多代码,数据层书写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表单。
分享到:
相关推荐
本项目通过整合这三个框架,旨在提供一种便捷的方式来设计和实现复杂的网页系统。 Struts2是MVC(Model-View-Controller)架构模式的一个优秀实现,它为开发者提供了强大的请求处理和视图展示能力。Struts2框架通过...
针对学生在专业技术方面实施基础训练,在这个过程当中,学生的理论知识能力可以得到提高,可以帮助学生将课堂的理论知识转化为实践能力,提高在实际操作当中处理问题的效率,同时也能够作为一种方式,来检测理论实际...
通过本次课程设计,不仅可以让学习者深入理解SSH三大框架的工作原理及其应用场景,还能培养实际项目的开发能力和团队协作精神。未来随着技术的发展,还可以考虑引入更多先进的技术和理念来优化和完善该项目,比如...
在本项目"SSH-struts第一种方式整合"中,我们将深入探讨如何将这三个组件结合在一起,构建出强大的后端业务逻辑和直观的前端展示。 首先,Struts作为MVC(模型-视图-控制器)设计模式的实现,主要负责处理HTTP请求...
【标题】"基于SSH框架的系统"是一种常见的企业级应用开发模式,SSH分别代表Spring、Struts和Hibernate三个开源框架的首字母缩写。Spring作为核心的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented ...
它提供了一种灵活的Action机制,使得开发者可以通过配置文件或注解定义URL到Action的映射,以及Action执行后的结果跳转。在这个博客系统中,Struts2可能用于处理用户的登录、注册、发布文章、评论等操作。 2. **...
在这个SSH毕业设计项目中,很可能是使用MySQL作为后端数据库,MySQL是一种广泛使用的开源关系型数据库管理系统,因其高效、稳定和易于管理而受到青睐。JSP(JavaServer Pages)则被用作视图层,用于展示动态生成的...
SSH三大框架指的是Spring、Struts和Hibernate这三个在Java Web开发中广泛应用的开源框架。它们各自承担着不同的职责,共同构建出高效、灵活的企业级应用程序。 Spring框架是核心,它提供了全面的架构支持,包括依赖...
它提供了一种组织应用结构的方式,使得视图、模型和控制器之间保持松耦合。Struts通过Action类处理用户请求,并将结果转发到JSP页面进行展示。 Hibernate作为ORM(对象关系映射)工具,解决了Java应用程序与数据库...
1. **Struts2**:作为表现层框架,它提供了一种组织应用结构和处理HTTP请求的方式。Struts2的核心是Action,它负责接收请求,调用业务逻辑,然后返回结果到视图。此外,Struts2还有丰富的拦截器机制,可以实现如权限...
Hibernate是一个优秀的对象关系映射(ORM)框架,它提供了一种在Java应用中操作数据库的便捷方式,消除了SQL和Java对象之间的转换工作。 1. **实体类**:Hibernate通过Java类映射数据库表,这些类就是实体类。 2. *...
它提供了一种灵活的Action机制,允许开发者定义特定的Action类来处理不同的用户请求。在创建三级联动下拉框时,Struts2的拦截器和结果类型配置将起到关键作用,它们可以控制页面跳转和数据传递。 接下来是Spring...
"注解三表SSH框架"通常指的是在Java开发中...总之,"注解三表SSH框架"是一种高效、灵活的Java Web开发方式,它利用注解简化了框架的配置和数据库操作,使得开发者能更专注于业务逻辑的实现,提高了开发效率和代码质量。
Struts2提供了一种灵活的拦截器机制,可以方便地扩展和定制应用程序的行为。 2. **Hibernate**:作为持久层,它是一个强大的对象关系映射(ORM)框架,使得开发者可以用Java对象来操作数据库,而无需编写SQL语句。...
DWR(Direct Web Remoting)则是一种JavaScript库,允许在浏览器和服务器之间进行实时的、异步的数据交换,增强了Web应用的用户体验。在这个场景中,“SSH + dwr 实现三级级联”指的是使用SSH框架与DWR技术结合,来...
这个框架组合提供了一种高效且灵活的方式来构建Web应用程序,尤其在处理增删改查(CRUD)操作、分页、上传下载等功能时表现出色。下面将详细介绍这三个框架及其相互作用。 1. **Spring框架**: Spring 是一个全面...
2. Windows操作系统的图形化优势:Windows操作系统凭借其图形化操作优势,设计开发一种Windows平台下的跨平台操作Linux系统的软件具有重要意义。 3. SSH技术的安全性:SSH技术可以把所有传输的数据进行加密,从而...
它的主要优点是提供了一种声明式编程方式,通过配置文件可以轻松管理控制器逻辑。Struts2还提供了丰富的拦截器机制,允许开发者自定义行为,如登录验证、权限检查等。 2. **Spring框架**:Spring是Java企业级应用的...
【描述】提到的"使用Java开发的毕业设计系统项目源码"意味着该系统是用Java编程语言编写的,这是一种广泛应用的、面向对象的语言,特别适合于企业级应用开发。它具有高度的可移植性,能够运行在多种操作系统上。此外...