最近做一个商户接口,发现同一weblogic下不同应用;appA应用的jsp与appB应用的servlet的session对象不能共享;苦想冥想,终于找到一个解决方案。
案例背景是这样的:
客户要调用我写的这个接口进行帐户验证,其操作流程如下:
1. 访问 appA(暂定为我的应用名) 中的一个jsp页面authCode.jsp,生成一个验证码给客户,同时生成session_id,现在暂定其值为 session1;
2. 客户填定待验证的帐户信息和验证码;
3. 客户发送请求到appA 下的一个 Servlet 进行帐户验证, 在 Servlet中会对验证码进行判断,如客户传送过来的的验证码错误将直接报错;与之比较的验证码从session中取。
但测试的时候发现前后两次请求(取验证码和帐户验证)的session_id不一致;因为以前我做这个接口的时候也是两个请求,不过帐户验证请求是发送到一个.do的URL,这次改动一则是需求变动,另外也想将帐户验证用统一的对外接口来写,便于维护。既然以前没有session_id 不一致的问题,说明同一Weblogic Server的不同应用,它们各自维护自己的session,并且不能跨应用访问其它应用下的session;所以在Servlet(接口Servlet) 中不能直接通过 request.getSession得到org.apache.struts.action.ActionServlet这个Servlet 下的session。
但最终这些Servlet 是在同一个应用下,所以它们可以在ServletContext下可以共享Object,所以将authCode.jsp中生成的session作为对象放在ServletContext中即可。
authCode.jsp代码片断:
ServletContext context = getServletConfig().getServletContext();
context.setAttribute("gauApp", session);
Servlet(接口入口) 代码片断:
ServletContext context = getServletConfig().getServletContext();
ServletContext contextGau = context.getContext("/gau");
HttpSession session = (HttpSession)contextGau.getAttribute("gauApp");
按以上方法即可实现同一Weblogic Server下不同应用共享session对象。
但如此共享还有一个问题,就是gauApp对象可能会不断被更新,所以必须在application下以key,value的方式存放对象,key唯一;理所当想的想到这个key就是session_id了。