- 浏览: 192189 次
- 性别:
文章分类
最新评论
-
路人甲wxf:
.net可以在不使用证书的情况下修改密码,java做不到吗?
添加用户、修改ad密码 -
zxsosozhuzhu:
你好,我也遇到这个问题了,但是按照你的方法还是附件中文还是乱码 ...
java mail 纯文本附件乱码的解决方案 -
balaschen:
can4you 写道 请教问题:你好,请教一个问题,我现在要模 ...
spring2.0事务配置实验 -
can4you:
/**
* Created: 2007-2-1
* ...
FreeMarker解析字符串模板 -
can4you:
请教问题:你好,请教一个问题,我现在要模拟两个事务同时更新一 ...
spring2.0事务配置实验
实现思路,使用一个拦截器实现session的处理:
- 获取sessionId,查找sessionAttribute(自定义hashmap)
- 设置session attribute到webwork
- 监控session attribute,一旦发现修改,则持久化到cache中
使用方法:
1、配置拦截器
<interceptor class="com.comwave.sna.interceptor.SNAInterceptor" name="snaInterceptor"></interceptor>
<interceptor-ref name="snaInterceptor"></interceptor-ref>
2、配置spring
<bean class="com.comwave.sna.cache.provider.MemcachedCacheManager" id="cacheManager" destroy-method="close"></bean>
<constructor-arg value="127.0.0.1:11212"></constructor-arg>
如果使用struct2,则需要修改相应的接口,并增加setCacheManager方法
- webwork-sna.zip (5.5 KB)
- 下载次数: 559
评论
10 楼
davexin
2007-08-30
搂住能不能讲得更详细一点,希望能借鉴一下,现在正需要这样的设计。还希望搂主能够讲得更详细一点,比如client和主服务器的通信等等。先谢谢了。
9 楼
balaschen
2007-06-01
不过,如果有第三方lib直接调用HttpSession.getId()这个方法,估计会有问题,没有测试过,推测而已。
8 楼
balaschen
2007-06-01
pupi 写道
这种方案有一个小问题:
如果项目用到的包自己用到了httpsession,failover就会出问题。
如果项目用到的包自己用到了httpsession,failover就会出问题。
如果使用了Acegi之类直接使用httpsession的话,解决方法也不会太复杂,不过需要使用filter,可以这么搞:
/** * $Revision: 1.0 $ * Created: 2007-6-1 * $Date: 2007-6-1 $ * * Author: Keven Chen */ package com.comwave.sna.filter; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Enumeration; import java.util.Iterator; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.comwave.sna.SessionMap; import com.comwave.sna.cache.provider.MemcachedCacheManager; /** * @author Keven Chen * @version $Revision 1.0 $ * */ public class SNAFilter implements Filter { private static final String REMOVE_ATTRIBUTE_METHOD = "removeAttribute"; private static final String SET_ATTRIBUTE_METHOD = "setAttribute"; private static final String GET_SESSION_METHOD = "getSession"; private static final String SERVER_LIST = "serverList"; private static final String SESSION_NAME = "cookie-session-id"; private MemcachedCacheManager cacheManager; public void init(FilterConfig config) throws ServletException { String serverList = config.getInitParameter(SERVER_LIST); if(serverList == null || serverList.trim().length() ==0){ throw new ServletException("SNAFilter missing serverList parameter."); } cacheManager = new MemcachedCacheManager(serverList); } public void destroy() { if (cacheManager != null) { cacheManager.close(); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { final HttpServletRequest hrequest = (HttpServletRequest) request; final HttpServletResponse hresponse = (HttpServletResponse) response; String sessionId = getSessionId(hrequest,hresponse); SessionMap session = getSession(sessionId); initialHttpSession(session,hrequest.getSession()); try { chain.doFilter(proxyRequest(hrequest,session), hresponse); } finally { if(session.isClear() || session.isEmpty()){ boolean result = cacheManager.flushCache(sessionId); } else if(session.isModified()){ session.setModified(false); boolean result = cacheManager.putToCache(sessionId, session); } } } private HttpServletRequest proxyRequest(final HttpServletRequest request,final SessionMap session){ final HttpSession hSession = request.getSession(); return (HttpServletRequest) Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(), new Class[] { HttpServletRequest.class }, new InvocationHandler() { private HttpSession proxySession = null; public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equalsIgnoreCase(GET_SESSION_METHOD)){ if(proxySession == null){ proxySession = proxySession(hSession,session); } return proxySession; } return method.invoke(request, args); } }); } private HttpSession proxySession(final HttpSession hsession,final SessionMap session){ return (HttpSession) Proxy.newProxyInstance(HttpSession.class.getClassLoader(), new Class[] {HttpSession.class}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); if(methodName.equalsIgnoreCase(SET_ATTRIBUTE_METHOD)){ System.out.println("name:"+args[0]+",value:"+args[1]); session.put(args[0], args[1]); } else if(methodName.equalsIgnoreCase(REMOVE_ATTRIBUTE_METHOD)){ System.out.println("remove:"+args[0]); session.remove(args[0]); } return method.invoke(hsession, args); } }); } private void initialHttpSession(SessionMap session, HttpSession hsession){ Enumeration oldAttributes = hsession.getAttributeNames(); while(oldAttributes.hasMoreElements()){ hsession.removeAttribute((String)oldAttributes.nextElement()); } Iterator newAttributes = session.keySet().iterator(); while(newAttributes.hasNext()){ String attribute = (String) newAttributes.next(); hsession.setAttribute(attribute, session.get(attribute)); } } private String getSessionId(HttpServletRequest request,HttpServletResponse hresponse){ Cookie[] cookies = request.getCookies(); String sessionId = null ; if (cookies != null) { for (int i = 0; cookies != null && i < cookies.length; i++) { if (SESSION_NAME.equals(cookies[i].getName())) { sessionId = cookies[i].getValue(); break; } } } if(sessionId == null || sessionId.trim().length() == 0){ sessionId = buildSessionId(request); createCookie(sessionId,hresponse); } return sessionId; } private void createCookie(String sessionId,HttpServletResponse response) { Cookie cookie = new Cookie(SESSION_NAME,sessionId); cookie.setPath("/"); response.addCookie(cookie); } private String buildSessionId(HttpServletRequest request) { return request.getSession().getId(); } protected SessionMap getSession(String Id){ Object value = cacheManager.getFromCache(Id); if(value == null){ return new SessionMap(); } return (SessionMap) value; } }
当然你得在web.xml配置filter
7 楼
pupi
2007-05-30
这种方案有一个小问题:
如果项目用到的包自己用到了httpsession,failover就会出问题。
如果项目用到的包自己用到了httpsession,failover就会出问题。
6 楼
balaschen
2007-05-29
是struct2.0
5 楼
pupi
2007-05-29
balaschen 写道
和其他方案相比最大的特点就是简单,并且能支持webwork或struct支持的任何应用服务器而无需修改代码,可以方便的切换到其他cache实现。缺点就是不支持其他web framework。我们公司的项目都是用webwork或struct,所以这样就够用了。
是struts2.0吧。
4 楼
balaschen
2007-05-29
和其他方案相比最大的特点就是简单,并且能支持webwork或struct支持的任何应用服务器而无需修改代码,可以方便的切换到其他cache实现。缺点就是不支持其他web framework。我们公司的项目都是用webwork或struct,所以这样就够用了。
3 楼
balaschen
2007-05-29
pupi 写道
看了楼主的代码。
楼主是用memcached实现了ActionContext的session。
挺棒 !!
有几个问题:
<1> 只要serverlist一样,是不是memcached server就是同一个实例?
<2> 是否代码中要约定大家不能使用HttpSession了
楼主是用memcached实现了ActionContext的session。
挺棒 !!
有几个问题:
<1> 只要serverlist一样,是不是memcached server就是同一个实例?
<2> 是否代码中要约定大家不能使用HttpSession了
1、是,只要serverList一样
2、是,不能直接使用httpSession,应该使用ActionContext的session,不过webwork或struct直接使用httpsession的情况应该不多
2 楼
pupi
2007-05-29
看了楼主的代码。
楼主是用memcached实现了ActionContext的session。
挺棒 !!
有几个问题:
<1> 只要serverlist一样,是不是memcached server就是同一个实例?
<2> 是否代码中要约定大家不能使用HttpSession了
楼主是用memcached实现了ActionContext的session。
挺棒 !!
有几个问题:
<1> 只要serverlist一样,是不是memcached server就是同一个实例?
<2> 是否代码中要约定大家不能使用HttpSession了
1 楼
balaschen
2007-05-28
代码非常简单,cookieId的值并没有自己实现,简单借用应用服务器的sessionId,当然你以可以实现自己的sessionId算法。
发表评论
-
利用sax和xslt转换csv文件内容
2008-02-03 15:57 3228package jaxp; import java.io.B ... -
通过BOM探测文本文件编码类型
2008-01-24 15:19 2430从tomcat源码抄来的改的: private Object ... -
java mail 纯文本附件乱码的解决方案
2008-01-24 15:16 6219java mail在发送纯文本附件时,当附件内容的编码和jvm ... -
ntdsutil设置AD查询返回最大条目
2008-01-18 16:56 1782AD缺省的最大查询结果为1000个,如果超过1千个,则需要客户 ... -
struts2-layout
2007-11-09 18:17 51testvvvv -
Http基本明文验证
2007-06-13 12:55 1886base64解码使用了novell的实现 java 代码 ... -
如何启用活动目录SSL连接
2007-06-13 10:49 3469ad:http://www.cnblogs.com/chnki ... -
AD User重要属性
2007-06-11 14:55 2234objectClass=User User-Account ... -
添加用户、修改ad密码
2007-06-11 11:28 15885java 代码 /** * ... -
ldap 访问AD测试
2007-06-08 16:37 4440java 代码 java 代码 /** ... -
JNDI 连接Windows Active Directory 教程(转)
2007-06-08 16:36 3307个人收藏,来源:http:// ... -
正确认识memcached的缓存失效
2007-05-29 10:56 9657最近javaeye上memcached相当火,不少人把它当作s ... -
activemq实验
2007-05-17 11:37 2178实验环境:activemq4.1.1/spring1.2.8 ... -
发现用Spring配置事务不爽的一个地方
2007-05-11 16:41 2074举个例子: SomeService implement I ... -
Java Transaction Design Strategies读书笔记
2007-05-14 15:34 2452第一种:Client Owner Transaction Ma ... -
有谁知道银行的跨行转帐是怎么保证交易的原子性和一致性?
2007-05-10 09:18 23292最近在看《Java Transaction Design St ... -
InnerClass引用的外层local final变量,究竟具有什么语义
2006-12-21 18:04 6694先看这段代码: public class ShowAnon ...
相关推荐
WebWork是一个古老的Java Web开发框架,它在早期的MVC(模型-视图-控制器)架构中占有重要地位,为开发者提供了丰富的功能和强大的动作映射能力。在深入理解WebWork源码之前,我们首先需要了解一些基本概念。 1. **...
### 如何实现WebWork+Spring+Hibernate框架结合 随着企业级应用需求的不断增加和技术的不断发展,集成多种技术栈成为一种趋势。WebWork+Spring+Hibernate是早期比较流行的一种技术组合,它们各自解决的问题域不同,...
7. **标签库**:WebWork与JSTL等标签库兼容,同时还有自己的标签库,例如`displaytag-1.0`,这是一个用于表格展示的开源标签库,提供了分页、排序、导出等功能,与WebWork结合可以方便地创建复杂的表格展示。...
结合WebWork和Hibernate,开发者可以实现以下关键功能: 1. **模型管理**:WebWork中的Action类作为业务逻辑的载体,可以通过属性绑定获取前端传来的数据,然后调用Hibernate的Session接口进行数据操作。 2. **视图...
WebWork 是一个基于Java的轻量级Web应用框架,它为开发者提供了强大的MVC(Model-View-Controller)架构支持,使得开发Web应用程序更加高效和便捷。本文将详细介绍如何使用WebWork来实现一个基础的"HelloWorld"示例...
XWork主要负责处理业务逻辑和数据操作,而WebWork则专注于MVC架构的实现,这种分工明确的设计理念成为了后续Struts 2.0框架的基础。 #### 核心特性解析 ##### Action驱动模式 WebWork 2.0引入了Action驱动模式,...
1. **MVC模式**:WebWork1.4遵循MVC架构,将应用程序分为模型、视图和控制器三个部分,提高了代码的可维护性和可扩展性。模型负责业务逻辑,视图负责数据显示,控制器则协调模型和视图的交互。 2. **动作映射**:...
【搭建WEBWORK+SPRING+HIBERNATE框架】是一个集成三大流行开源框架的过程,用于构建...这个框架结合了WebWork的MVC架构、Spring的依赖注入和事务管理以及Hibernate的对象关系映射,提供了强大而灵活的应用开发能力。
在这个"WebWork 2.2.4开发指南"中,我们将深入探讨WebWork的核心概念、架构以及如何利用其特性来构建应用程序。 一、WebWork核心概念 1. MVC模式:WebWork遵循MVC设计模式,将业务逻辑(Model)、用户界面(View)...
WebWork与Spring的集成可以让开发者利用Spring的强大功能,如服务定位和安全性,同时保持WebWork的MVC架构。 Hibernate,则是Java领域的一个持久化框架,它简化了数据库操作,通过对象关系映射(ORM)使开发者能够...
用到知识是webwork做表现层 spring的事务层,IOC AOP hibernate 数据库的映射 Model view control传说中的三层+service 数据库是sqlserver 2005 更重要的是提供所有的.jar框架包
webwork中结合spring说明,自己看吧,对你或许有用
WebWork2.0是一款基于Java的企业级Web应用框架,它为开发者提供了强大的MVC(Model-View-Controller)架构支持,旨在简化Web应用程序的开发流程,提高代码的可维护性和可扩展性。本讲解将围绕WebWork2.0的核心概念、...
WebWork 是一个基于 Java 的开源 MVC(Model-View-Controller)框架,它在早期的 Web 应用开发中非常流行,尤其是在 Struts 1 之前。WebWork 提供了强大的动作(Action)处理、类型转换、拦截器(Interceptor)机制...
本示例中,“Spring Webwork Hibernate结合登录示例”展示的是如何整合这三个框架来实现一个完整的用户登录功能。下面将详细解释这个示例中的关键知识点: 1. **Spring框架**:Spring的核心是依赖注入,它允许...
WebWork2是一款基于Java的轻量级Web应用框架,它为开发者提供了强大的MVC(Model-View-Controller)架构支持,使得构建动态、数据驱动的Web应用变得更加简单和高效。这款框架在2000年代中期较为流行,是Struts的一个...
WebWork 2.1.7 是一个古老的Java Web框架,由Apache软件基金会开发,它在Struts的基础上进行了改进,提供了更强大的MVC(Model-View-Controller)架构支持。这个框架的主要目标是简化Web应用程序的开发,提高代码的...
1. **WebWork2基础**:介绍WebWork2的基本架构,包括Action、Interceptor、DispatcherServlet等核心组件的作用和工作原理。解释如何配置WebWork2项目,如web.xml和struts-config.xml文件的设置。 2. **Action与控制...