做验证码注册用户,为什么总是新建session?

berg369 2009-11-13 01:30:54
我有一个servlet负责随机生成验证码图片,并记录到session,另一个servlet处理注册请求,但两边取到的session ID不同。
生成图片:

// 将四位数字的验证码保存到Session中。
HttpSession session = request.getSession(false);
session.setAttribute("validateCode", randomCode.toString());
logger.debug(session.getAttribute("validateCode")+" "+session.getId());

处理注册请求:

logger.debug("会话:"+request.getSession(false).getId()


输出日志显示会话ID是不同的,这两个servlet都是每请求一次都会有一个新的session ID,为什么会这样?
...全文
214 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
caryyu 2009-11-16
  • 打赏
  • 举报
回复
request.getSession().getAttribute("page");

是类似于这种格式吧
berg369 2009-11-13
  • 打赏
  • 举报
回复
进一步缩小问题所在:我的设置中,通过代理和反向代理去掉了URL中的abc,如果不去掉,改为如下:
ProxyPass /abc/getCheckCodeImg ajp://127.0.0.1:8009/abc/getCheckCodeImg
ProxyPassReverse /abc/getCheckCodeImg ajp://127.0.0.1:8009/abc/getCheckCodeImg

这就没有问题了!但这带来新的问题!

那个想去掉的abc是什么呢?它是tomcat/webapps/abc,是tomcat发布目录下应用的根,因为tomcat有一个默认的root,另外webapps下还有几个默认应用,因此自己建的应用需要有一个自定义目录,然后用http://localhost:8080/abc去访问它,但正式发布时是不想要这个目录的,我本来想用转发去掉,看来有点问题,请问高手们有没有遇到这个问题?大家是如何去掉这个目录名的?
berg369 2009-11-13
  • 打赏
  • 举报
回复
问题出在apache转发上,直接http://localhost:8080/abc/getCheckCodeImg没有问题,如果http://localhost/getCheckCodeImg则不行,httpd.conf配置如下:
。。。。
ProxyPass /getCheckCodeImg ajp://127.0.0.1:8009/abc/getCheckCodeImg
ProxyPassReverse /getCheckCodeImg ajp://127.0.0.1:8009/abc/getCheckCodeImg
。。。。
用的是代理,转发同时把abc这个目录名去掉了
  • 打赏
  • 举报
回复
用了负载均衡吧


把图片放到一个服务器里
道光2008 2009-11-13
  • 打赏
  • 举报
回复
生成图片应该是一个jsp吧。
直接用,不用通过request获得啦
session.setAttribute("validateCode", randomCode.toString());
logger.debug(session.getAttribute("validateCode")+" "+session.getId());
berg369 2009-11-13
  • 打赏
  • 举报
回复
新进展!如果不用apache就没有问题,我用apache转发,结果每次请求session ID都不一样,直接请求tomcat则正常。怎么会这样?
berg369 2009-11-13
  • 打赏
  • 举报
回复
我的问题问得不好,应该是:一个servlet负责随机生成验证码图片,并保存验证码到session中,从一个浏览器按f5多次请求这一个servlet,其session ID应该是相同的吧,但我发现每次都不一样

//servlet中session操作的代码
HttpSession session = request.getSession(false);
session.setAttribute("validateCode", randomCode.toString());
logger.debug(session.getAttribute("validateCode")+" "+session.getId());

结果日志中输出的session ID每次请求都不同。这可是一个servlet啊,1楼同志说不是一个request,当然不是一个请求了,但session不是多个请求共享吗?
cicigl 2009-11-13
  • 打赏
  • 举报
回复
只能说明不是一个session
yangxiao_jiang 2009-11-13
  • 打赏
  • 举报
回复
两个servlet不是同一个request吧?
你直接用request.getSession()看看对不对

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧