为什么session.isNew()刷新页面后总会返回TRUE

yc451075935 2014-10-24 08:21:21
小白最近刚接触JSP,在用session对象写一个防刷新计数器时遇到了问题。理想情况下是刷新页面时计数器不+1,仅当关闭浏览器再重新打开时才会+1;可是在Eclipse JavaEE的内部浏览器测试时刷新网页计数器也会+1,不知道出了什么问题,下面贴出代码,恳请各位前辈指教
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%!
int number=0;
synchronized void countpeople(){
number++;
}
%>
<%
if (session.isNew()){
countpeople();
String num=String.valueOf(number);
session.setAttribute("counter", num);
}
%>
您是第<%=session.getAttribute("counter")%>位访问者!
</body>
</html>
...全文
326 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2014-10-27
  • 打赏
  • 举报
回复
(可选的:你可以下载一份 java 反编译工具。它可以让你看正在运行的代码的样子) http://tomcat.apache.org/tomcat-6.0-doc/jasper-howto.html 这里说如果让 tomcat 在编译 jsp 时保留一份由 JSP 编译生成的 Servlet 源码不要删除,你可以在 tomcat 的 work / tmp 之类的目录下去找 java 源码文件,应该有你自己的那个份,你可以看到 <%! 中的代码最后是什么样的 %>。 那你个把计数器放在 session 中的做法是有问题的,因为浏览器关闭时 session 就消失了,重新打开就是新的 session,又从1开始计算,期望的办法是把数值放在 application 里面。

  application.setAttribute("counter", number);
再说了,你已经有个 servlet 变量 number ,为什么还用 session 来存储它呢?直接用 number 不好么? 一般来说第几位访客正式的版本应该保存在持久性的存储中,比如文件中或数据库,这样服务器重启后也能接着计数。
yc451075935 2014-10-26
  • 打赏
  • 举报
回复
引用 3 楼 humanity 的回复:
那就换桌面型浏览器,不要用 eclipse 自带的嵌入式的浏览器,那个嵌入式的浏览器组件是10年前的技术,早过时了。 基本上如果一个请求带上了 jsessionid 这个 cookie 它就是要对应到已经存在的一个 session,如果没有这个 cookie 则相当于没有 session,在服务器上就是每次创建一个背后的。 你可以通过 eclipse 的 TCP/IP Monitor 视图来观察你的 HTTP 通信,比如添加一个配置: listen at: 8888, forward 到原来的服务器的监听端口,比如: localhost:8080 你然后在浏览器中用 :8888 这个端口来访问你原来的网页,之后你的通信过程可以在 TCP/IP Monitor 中观察到,你可以确认它是否带上了 jsessionid 这个 cookie。
感谢大侠认真的解答,我刚接触JSP,Eclipse用的也不熟,不知道怎么用TCP/IP Monitor视图监听。我把JSP文件拷贝到tomcat的根目录下用桌面浏览器打开,这次刷新倒是不+1了,可是关闭再打开后还是显示“您是第1位访问者”不知道该怎么搞了,不知道大侠能不能帮帮我,能配些图最好,我这人脑子慢,还请多担待
rumlee 2014-10-25
  • 打赏
  • 举报
回复
session.isNew这个方法没有用过,不知道这个方法是不是这个意思。 不过你可以采用另一个种解决方式啊。首次访问的时候计算器加1,并且往session中写入一个值,然后每次就判断session中是否存在这个值,如果存在这个值,则不加,不存在则认为是首次访问。
humanity 2014-10-25
  • 打赏
  • 举报
回复
那就换桌面型浏览器,不要用 eclipse 自带的嵌入式的浏览器,那个嵌入式的浏览器组件是10年前的技术,早过时了。 基本上如果一个请求带上了 jsessionid 这个 cookie 它就是要对应到已经存在的一个 session,如果没有这个 cookie 则相当于没有 session,在服务器上就是每次创建一个背后的。 你可以通过 eclipse 的 TCP/IP Monitor 视图来观察你的 HTTP 通信,比如添加一个配置: listen at: 8888, forward 到原来的服务器的监听端口,比如: localhost:8080 你然后在浏览器中用 :8888 这个端口来访问你原来的网页,之后你的通信过程可以在 TCP/IP Monitor 中观察到,你可以确认它是否带上了 jsessionid 这个 cookie。
yc451075935 2014-10-24
  • 打赏
  • 举报
回复
坐等大神来解救

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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