Available categories: [/] [development. ~]
关于servlet的线程模式 [Permalink] Mon Nov 29 10:25:06 CST 2004 昨天做refactoring时候差点犯错误。因为目前的设计,是所有servlet继承公共基类,而基类中进行一些例如错误处理之类的系统级操作(参看这里),所以两者都要用到request/response。以前的做法,是从基类传入request/response,而在子类中调用各个方法时候,也是统统传入。 public class SessionListener extends BaseListener implements HttpSessionListener, ServletRequestListener, Constant { private HttpServletRequest request; //Notification that a session was created public void sessionCreated(HttpSessionEvent se) { logger.debug("New session started!"); setEquipmentInfo(se.getSession()); clearAllAntiAttackRecs(); } private void setEquipmentInfo(HttpSession session) { WebStringUtil webStringUtil=WebStringUtil.getInstance(); String agent=webStringUtil.getUserAgent(request); String info=null; EquipmentService service=EquipmentServiceFactory.getService(); try { info=service.getUserEquipmentByAgent(agent); } catch( DidyException ex) { logger.warn(ex.getMessage()); } UserTracker userTracker=UserTracker.getInstance(); userTracker.setEquipmentInfo(session, info); } //Notification that a session was invalidated public void sessionDestroyed(HttpSessionEvent se) { logger.debug("Session ended!"); } private void clearAllAntiAttackRecs() { Map actAntiAttackRecs=BaseDidyServlet.getActAntiAttackRecs(); Iterator it=actAntiAttackRecs.keySet().iterator(); while(it.hasNext()) { clearAntiAttackRecs(actAntiAttackRecs, (String) it.next()); } } private void clearAntiAttackRecs(Map actAntiAttackRecs, String ip) { NumberUtil numberUtil=NumberUtil.getInstance(); Map ipAntiAttackMap=(Map) actAntiAttackRecs.get(ip); if(ipAntiAttackMap == null) { return; } Set obsoleteKeys=new HashSet(); Iterator it=ipAntiAttackMap.keySet().iterator(); while(it.hasNext()) { String key=it.next().toString(); Map myIpActAntiAttackMap=(Map) ipAntiAttackMap.get(key); long lastActTime= numberUtil.getLong(myIpActAntiAttackMap.get("TIME")); long minInterval= numberUtil.getLong( AppProp.read(ANTI_ATTACK_PREFIX_INTERVAL + "." + key) ); if(System.currentTimeMillis() - lastActTime >= minInterval) { obsoleteKeys.add(key); } } it=obsoleteKeys.iterator(); while(it.hasNext()) { ipAntiAttackMap.remove(it.next()); } if(ipAntiAttackMap.isEmpty()) { actAntiAttackRecs.remove(ip); } } /** The request is about to go out of scope of the web application. */ public void requestDestroyed(ServletRequestEvent sre) { } /** The request is about to come into scope of the web application. */ public void requestInitialized(ServletRequestEvent sre) { request=(HttpServletRequest) sre.getServletRequest(); } }这里就麻烦大了!上网找了资料,还是没有找到合适的。不行的话只能试试看加一个overall的filter来为session listener取得request了。UGLY啊!!
Posted by: miles |
? |
Available categories: [/] [development. ~]
html hits:?51303