jsp和servlet中的session共享
最近做一个商户接口,发现同一应用下jsp与servlet的session对象不能共享;苦想冥想,终于找到一个解决方案。
案例背景是这样的:
客户要调用我写的这个接口进行帐户验证,其操作流程如下:
1. 访问 appA(暂定为我的应用名) 中的一个jsp页面authCode.jsp,生成一个验证码给客户,同时生成session_id,现在暂定其值为 session1;
2. 客户填定待验证的帐户信息和验证码;
3. 客户发送请求到appA 下的一个 Servlet 进行帐户验证, 在 Servlet中会对验证码进行判断,如客户传送过来的的验证码错误将直接报错;与之比较的验证码从session中取。
但测试的时候发现前后两次请求(取验证码和帐户验证)的session_id不一致;因为以前我做这个接口的时候也是两个请求,不过帐户验证请求是发送到一个.do的URL,这次改动一则是需求变动,另外也想将帐户验证用统一的对外接口来写,便于维护。既然以前没有session_id 不一致的问题,说明同一应用下如果有不同的Servlet,它们各自维护自己的session,并且不能跨Servlet访问其它Servlet下的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");
按以上方法即可实现同一应用下jsp和servlet中的共享session对象。
相关文档:
一:web.xml配置
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>cont ......
JSP自定义标签(tag)
什么是自定义标签
1,用户自定义的Java语言元素, 实质是运行一个或者两个接口的JavaBean;
2,可以非常机密地和JSP的表示逻辑联系在一起,又具有和普通JavaBean相同的业务逻辑处理能力;
3,当一个JSP页面转变为servlet时,其间的用户自定义标签转化为操作一个称为标签hander的对象;
4,可操作默认 ......
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page language="java"%>
<%@ page info="database handler"%>
<%@ page import="java.io.*"%>
<%@ page import="java.lang.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%> ......
Jsp的九种对象我简述之:
page
application
request
response
session
config
out
pageContext
page
<%@page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" %>
response
<%
response.setHeader("Pragma","No-cache");
respons ......