系统要集群,使用SNA方案。
一、 缓存的处理
缓存要使用统一的缓存服务器,集中式缓存。
原先的实现采用ehcache。
在spring里的配置,以资源缓存为例:
-
-
<
bean
id
=
"cacheManager"
class
=
"org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
>
-
<
property
name
=
"configLocation"
>
-
<
value
>
classpath:ehcache.xml
</
value
>
-
</
property
>
-
</
bean
>
-
-
<
bean
id
=
"resourceCacheBackend"
-
class
=
"org.springframework.cache.ehcache.EhCacheFactoryBean"
>
-
<
property
name
=
"cacheManager"
ref
=
"cacheManager"
/>
-
<
property
name
=
"cacheName"
value
=
"resourceCache"
/>
-
</
bean
>
-
-
<
bean
id
=
"resourceCache"
-
class
=
"com.framework.extcomponent.security.authentication.services.acegi.cache.EhCacheBasedResourceCache"
-
autowire
=
"byName"
>
-
<
property
name
=
"cache"
ref
=
"resourceCacheBackend"
/>
-
</
bean
>
cacheManager负责对ehcache进行管理,初始化、启动、停止。
resourceCacheBackend负责实际执行缓存操作,put 、get、remove。
resourceCache实现具有业务语义的业务应用层面的缓存操作,内部调用resourceCacheBackend操作。
现在采用memcached。
关于客户端,采用文初封装的客户端,地址在http://code.google.com/p/memcache-client-forjava/
。
使用spring的FactoryBean进行二次封装。同理:
memcachedManager负责对memcached进行管理,初始化、启动、停止。
代码:
-
-
-
-
-
-
-
public
class
MemcachedCacheManagerFactoryBean
implements
FactoryBean,InitializingBean,DisposableBean{
-
-
protected
final
Loglogger=LogFactory.getLog(getClass());
-
-
private
ICacheManager<IMemcachedCache>cacheManager;
-
-
public
ObjectgetObject()
throws
Exception{
-
return
cacheManager;
-
}
-
-
public
ClassgetObjectType(){
-
return
this
.cacheManager.getClass();
-
}
-
-
public
boolean
isSingleton(){
-
return
true
;
-
}
-
-
public
void
afterPropertiesSet()
throws
Exception{
-
logger.info(
"InitializingMemcachedCacheManager"
);
-
cacheManager=CacheUtil.getCacheManager(IMemcachedCache.
class
,
-
MemcachedCacheManager.
class
.getName());
-
cacheManager.start();
-
}
-
-
public
void
destroy()
throws
Exception{
-
logger.info(
"ShuttingdownMemcachedCacheManager"
);
-
cacheManager.stop();
-
}
-
}
配置:
-
<
bean
id
=
"memcachedManager"
-
class
=
"com.framework.extcomponent.cache.MemcachedCacheManagerFactoryBean"
/>
resourceCacheBackend负责实际执行缓存操作,put 、get、remove。
代码:
-
-
-
-
-
-
-
public
class
MemcachedCacheFactoryBean
implements
FactoryBean,BeanNameAware,InitializingBean{
-
-
protected
final
Loglogger=LogFactory.getLog(getClass());
-
-
private
ICacheManager<IMemcachedCache>cacheManager;
-
private
StringcacheName;
-
private
StringbeanName;
-
private
IMemcachedCachecache;
-
-
public
void
setCacheManager(ICacheManager<IMemcachedCache>cacheManager){
-
this
.cacheManager=cacheManager;
-
}
-
-
public
void
setCacheName(StringcacheName){
-
this
.cacheName=cacheName;
-
}
-
-
public
ObjectgetObject()
throws
Exception{
-
return
cache;
-
}
-
-
public
ClassgetObjectType(){
-
return
this
.cache.getClass();
-
}
-
-
public
boolean
isSingleton(){
-
return
true
;
-
}
-
-
public
void
setBeanName(Stringname){
-
this
.beanName=name;
-
}
-
-
public
void
afterPropertiesSet()
throws
Exception{
-
-
if
(
this
.cacheName==
null
){
-
this
.cacheName=
this
.beanName;
-
}
-
cache=cacheManager.getCache(cacheName);
-
}
-
}
配置:
-
<
bean
id
=
"resourceCacheBackend"
-
class
=
"com.framework.extcomponent.cache.MemcachedCacheFactoryBean"
>
-
<
property
name
=
"cacheManager"
ref
=
"memcachedManager"
/>
-
<
property
name
=
"cacheName"
value
=
"memcache"
/>
-
</
bean
>
resourceCache同上,替换新的实现类MemcachedBasedResourceCache即可。
二、 Session失效的处理
采用memcached作为httpsession的存储,并不直接保存httpsession对象,自定义SessionMap,SessionMap直接继承HashMap,保存SessionMap。
会话胶粘:未失败转发的情况下没必要在memcached保存的SessionMap和httpsession之间复制来复制去,眉来眼去。
利用memcached计数器保存在线人数。
系统权限采用了acegi,在acegi的拦截器链里配置snaFilter
-
<
bean
id
=
"filterChainProxy"
-
class
=
"org.acegisecurity.util.FilterChainProxy"
>
-
<
property
name
=
"filterInvocationDefinitionSource"
>
-
<
value
>
-
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
-
PATTERN_TYPE_APACHE_ANT
-
/**=snaFilter,httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,basicProcessingFilter,securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterInvocationInterceptor
-
</
value
>
-
</
property
>
-
</
bean
>
注意需要配置在第一个。
snaFilter的职责:
1、 没有HttpSession时,创建HttpSession;
2、 创建Cookie保存HttpSession id;
3、 如果Cookie保存的HttpSession id与当前HttpSession id一致,说明是正常请求;
4、 如果Cookie保存的HttpSession id与当前HttpSession id不一致,说明是失败转发;失败转发的处理:
4.1、根据Cookie保存的HttpSession id从memcached获取SessionMap;
4.2、SessionMap属性复制到当前HttpSession;
4.3、memcached删除SessionMap。
5、 判断当前请求url是否是登出url,是则删除SessionMap,在线人数减1.
代码:
-
public
void
doFilter(ServletRequestservletRequest,ServletResponseservletResponse,
-
FilterChainfilterChain)
throws
IOException,ServletException{
-
final
HttpServletRequesthrequest=(HttpServletRequest)servletRequest;
-
final
HttpServletResponsehresponse=(HttpServletResponse)servletResponse;
-
Stringuri=hrequest.getRequestURI();
-
logger.debug(
"开始SNA拦截-----------------"
+uri);
-
HttpSessionhttpSession=hrequest.getSession();
-
StringsessionId=httpSession.getId();
-
-
if
(uri.equals(logoutUrl)){
-
logger.debug(
"removesessionmap:"
+sessionId);
-
-
getCache().addOrDecr(
"userCount"
,
1
);
-
getCache().remove(sessionId);
-
}
else
{
-
Stringcookiesessionid=getSessionIdFromCookie(hrequest,hresponse);
-
if
(!sessionId.equals(cookiesessionid)){
-
createCookie(sessionId,hresponse);
-
SessionMapsessionMap=getSessionMap(cookiesessionid);
-
if
(sessionMap!=
null
){
-
logger.debug(
"failover--------sessionid:"
+sessionId+
"cookiesessionid:"
+cookiesessionid);
-
initialHttpSession(sessionMap,httpSession);
-
cache.remove(cookiesessionid);
-
}
-
}
-
}
-
filterChain.doFilter(hrequest,hresponse);
-
}
利用HttpSessionAttributeListener监听httpsession的属性变化,同步到memecached中的sessionmap。
-
public
void
attributeAdded(HttpSessionBindingEventevent){
-
HttpSessionhttpSession=event.getSession();
-
StringattrName=event.getName();
-
ObjectattrValue=event.getValue();
-
StringsessionId=httpSession.getId();
-
logger.debug(
"attributeAddedsessionId:"
+sessionId+
"name:"
+attrName+
",value:"
+attrValue);
-
SessionMapsessionMap=getSessionMap(sessionId);
-
if
(sessionMap==
null
){
-
-
getCache().addOrIncr(
"userCount"
,
1
);
-
sessionMap=
new
SessionMap();
-
}
-
logger.debug(
"name:"
+attrName+
",value:"
+attrValue);
-
sessionMap.put(attrName,attrValue);
-
getCache().put(sessionId,sessionMap);
-
}
-
-
public
void
attributeRemoved(HttpSessionBindingEventevent){
-
HttpSessionhttpSession=event.getSession();
-
-
StringattrName=event.getName();
-
StringsessionId=httpSession.getId();
-
logger.debug(
"attributeRemovedsessionId:"
+sessionId+
"name:"
+attrName);
-
SessionMapsessionMap=getSessionMap(sessionId);
-
if
(sessionMap!=
null
){
-
logger.debug(
"remove:"
+attrName);
-
sessionMap.remove(attrName);
-
getCache().put(sessionId,sessionMap);
-
}
-
}
-
-
public
void
attributeReplaced(HttpSessionBindingEventevent){
-
attributeAdded(event);
-
}
利用HttpSessionListener,sessionDestroyed事件时根据sessionid删除memcached里的sessionMap(如果存在)。不再担心httpsession的过期问题。
-
public
void
sessionDestroyed(HttpSessionEventevent){
-
HttpSessionhttpSession=event.getSession();
-
StringsessionId=httpSession.getId();
-
logger.debug(
"sessionRemovedsessionId:"
+sessionId);
-
SessionMapsessionMap=getSessionMap(sessionId);
-
if
(sessionMap!=
null
){
-
logger.debug(
"removesessionmap:"
+sessionId);
-
-
getCache().addOrDecr(
"userCount"
,
1
);
-
getCache().remove(sessionId);
-
}
-
}
三、 文件保存的处理
和缓存类似,采用集中式的文件服务。对于linux,采用nfs。参考文档http://linux.vbird.org/linux_server/0330nfs.php#What_NFS_perm
。关键在于对权限的分配。
应用程序本身不用修改。
分享到:
相关推荐
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
rbac权限控制框架:1.支持角色继承,数据组,行为组.zip abac,rbac权限控制框架 支持角色继承,数据组,行为组 支持动态角色和静态角色 usage 用户与角色需要额外维护 权限控制规则默认驻留内存, 可自定义RuleRepository实现 角色继承关系默认驻留内存, 可自定义RoleHierarchyRepository实现 数据组关系默认驻留内存, 可自定义DataGroupRepository实现 行为组关系默认驻留内存, 可自定义ActionGroupRepository实现 若使用动态角色需要实现DynamicRoleDefiner
utlog.sqlite
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
xia0FridaScript-master.zip
煤炭地质勘查钻孔质量标准MTT1042-2007.pdf
149煤矿生产安全事故现场处置方案.pdf
javaweb登录注册页面,[信息办公]个人求职管理系统,jsp开发源码。
煤矿重要用途钢丝绳.PDF
2023-06-30-东方财富证券-华电重工-深度研究:乘氢能之风,新能源巨轮远航
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
超详细Python教程,包含Python数据结构、对象、模块、迭代器等等超多内容 Django框架教程
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
微信小程序考试系统.zip 微信小程序考试系统 1.安装微信web开发工具 2.运行微信web开发工具,点击小程序项目,选择新建(+),选择压缩包下的examSystem-exam1.0文件夹, 填写AppID(AppID:wx2fd6fcc3d4a9a059),定义项目名称,导入项目 3.文件目录说明 app.json 当前小程序的全局配置,包含了小程序所有页面路径 .wxml wxml文件定义小程序页面布局 .js js文件定义用户相关操作事件(交互逻辑) .wxss wxss文件定义当前小程序页面的局部页面样式 具体页面路径 pages/index/index:系统登录页面 pages/grid/index:登录成功后系统菜单页 pages/answer/answer:考试中心答题页面 pages/wrongQuestion/wrongQuestion:错题集页面 pages/logs/logs:日志文件 image:系统需用到图片 dist:UI框架需要icon、js 4.登录账号 姓名:admin 部门:001
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
功能概述 100% 支持 AMD 规格。支持模块化开发。定义模块后,无需维护依赖模块即可使用模块,只需编写一个依赖,lodJS 会自动负责依赖注入。 特性 模块化开发支持 异步加载 依赖注入 灵活的自定义功能 兼容性 Safari 浏览器 6+ (Mac) iOS 5+ Safari浏览器 Chrome 23+(Windows、Mac、Android、iOS、Linux、Chrome 操作系统) Firefox 4+(Windows、Mac、Android、Linux、Firefox 操作系统) Internet Explorer 6+(Windows、Windows Phone) Opera 10+(Windows、Linux、Android