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对象。
相关文档:
一、文件下载及版本
apache-tomcat-6.0.20.exe
jdk-6u2-windows-i586-p.exe
二、安装及环境变量设置
软件安装后,需要配置环境变量。新建JAVA_HOME, CATALINA_HOME, classpath,修改path:
classpath = ".;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\lib\servlet-api.jar"
path += ";%JAVA_ ......
Java代码:
package com.zhaipuhong.common.util;
import java.util.ArrayList;
import org.apache.log4j.Logger;
import javax.servlet.http.HttpServletRequest;
public class PageBean { & ......
此实现共分三个文件,即:CreatImage.java 生成图像流的类,提供用于生成图片流的方法;images.jsp 图片包装,用于将图片加入到response输出流中;login.jsp 调用前面的jsp,显示验证码。
CreatImage.java 类:
3 import java.awt.Color;
4 import java.awt.Font;
5 import java.awt.Graphics;
6 im ......
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 ......
一、page 对象
page对象代表JSP本身,更准确地说它代表JSP被转译后的Servlet,它可以调用Servlet类所定义的方法。
二、config 对象
config 对象里存放着一些Servlet 初始的数据结构。
config 对象实现于javax.servlet.ServletConfig 接 ......