当然有办法,你在登录验证完毕过后,就可以利用 session.setAttribute("variableName",value); 然后你如果在指定的页面获得这个值,你就可以利用 session.getAttribute("variableName"); 建议:如果你想保存的信息比较多的话,最好不要用session。 不知道这样的回答你是否满意,祝你成功! For example: session.setAttribute("se_name",user_name);//保存用户的姓名,数据表里的字段名称 session.getAttribute("se_name");//你就可以得到用户的姓名了 May you success!
to pigo(~_~ ^-^. 。o 0 O O=p&&t=O O 0 o 。. ^-^~_~): 但问题的关键是,如果用户非法退出的话,哈稀表中的值怎么删除呢?public class sessionlisten extends HttpServlet implements HttpSessionListener { public void sessionDestroyed(HttpSessionEvent se) { System.out.println("被释放的 sessionid is "+se.getSession().getId()); //把session的引用移出,好让系统可以及时释放内存 } }
网址:http://www.qq222.com/?r=gerard2008
如果用户合法并且没有在你的在线用户列表里面,
就加入,并且跳转到相关页面并且传送一个bean对象过去 ,
就可以知道了
session.setAttribute("variableName",value);
然后你如果在指定的页面获得这个值,你就可以利用
session.getAttribute("variableName");
建议:如果你想保存的信息比较多的话,最好不要用session。
不知道这样的回答你是否满意,祝你成功!
For example:
session.setAttribute("se_name",user_name);//保存用户的姓名,数据表里的字段名称
session.getAttribute("se_name");//你就可以得到用户的姓名了
May you success!
它不能被全局使用,也就是其他用户根本不知道其他用户的session,这是session的特点
如果要获得在线人数好像用application吧,我没有做过。
我认为可以这样做..
我想每一个用户登陆的时候,你会写一个javabean来实现它吧
在这个类中定义一个
static long count = 0
的变量,用户登陆一次
count ++ 一次,这个count就是在线人数
如果要统计未登陆用户的数量我想只能用application吧
用户在退出的时候
还要count --
至于怎么判断用户是否退出
你们想想办法
import javax.servlet.http.HttpSessionBindingListener;
import java.util.Hashtable;
import java.util.Enumeration;/**
* <pre>
* 调用方法示例:
* out.println("当前用户数量 " + SessionListener.getSessionCount() + "<br>");
* out.println("当前登录用户数量 " + SessionListener.getLoginSessionCount());
* SessionListener.getSessionUser().put(session.getId(),"张三");
* </pre>
*/
public class SessionListener implements HttpSessionListener {
private static Hashtable htSessionUser = new Hashtable();
/**
* 构造函数
*/
public SessionListener() {
}
/**
* @param se - HttpSessionEvent
*/
public void sessionCreated(HttpSessionEvent se) {
htSessionUser.put(se.getSession().getId(),"");
}
/**
* @param se - HttpSessionEvent
*/
public void sessionDestroyed(HttpSessionEvent se) {
htSessionUser.remove(se.getSession().getId());
}
/**
* @return Hashtable,该Hashtable的KEY含有所有会话的ID,如果该用户登录,则VALUE含有该用户的id。
*/
public static Hashtable getSessionUser() {
return htSessionUser;
}
/**
* @return int,访问当前站点的会话数。
*/
public static int getSessionCount() {
return htSessionUser.size();
}
/**
* @return int,访问当前站点的登录会话数。
*/
public static int getLoginSessionCount() {
Enumeration em = htSessionUser.elements();
int i = 0;
while(em.hasMoreElements()) {
String sValue = (String)em.nextElement();
if(!sValue.equals("")) i++;
}
return i;
}
}
可是我要的是,获取所有在线人员的信息,也就是在线人的ID了。
这样的话,Application 就很难做了!
而其实用户登录时,则有不同的值。
问题是怎么样能把所有“有效” Session 的值都取出来呢?
问题出现在这个地方?
把 session的引用 放到 一个全局的hashtable里就可以了,然后想操作哪个sesssion都可以,还可以踢人(让指定的session强制失效).
2、单纯利用session,很难作出一个真正准确的在线人员列表。HttpSessionListener只能期望session过期或者人为销毁,用起来未免有些古板。
3、刷新可以做到相对正确的取得在线人员,不过效率和闪烁感不太令人满意。如果只是针对IE的话,试试XMLHTTP,这个东东真的不错。
System.out.println("被释放的 sessionid is "+se.getSession().getId());
//把session的引用移出,好让系统可以及时释放内存
}
}
表字段包括:id(用户ID), first_time(第一次访问时间), last_time(最后一次访问时间), place(在社区的什么地方), doing(正在做什么)
我在用户没做一次对服务器段的请求时,就会做一系列的工作,最主要的就是比对last_time,我定义的是只要两次请求间隔不操过15分钟就算在现,并修改last_time。同时又一个后台线程没15分钟算一遍内存表,并把那些15分钟自内没有请求的用户删除。
这样做的效果挺好的,就是对服务器的内存要求高,大访问量的时候对cpu要求也很高。我们的机器是sun的,具体什么型号记不清了,配置是2G memory,2*p42.0G cpu。对于你的需求只用id(用户ID), first_time(第一次访问时间), last_time(最后一次访问时间)就行了。原理一样,不知道你的机器行不行。
那里有很多高手乐意帮忙.也有刚出道的少年. QQ群 号码:4025186
import javax.servlet.*;
import java.util.*; public class onLineUser implements HttpSessionBindingListener {
public onLineUser(){
} private Vector users=new Vector();
public int getCount(){
users.trimToSize();
return users.capacity();
}
public boolean existUser(String userName){
users.trimToSize();
boolean existUser=false;
for (int i=0;i<users.capacity();i++ )
{
if (userName.equals((String)users.get(i)))
{
existUser=true;
break;
}
}
return existUser;
} public boolean deleteUser(String userName) {
users.trimToSize();
if(existUser(userName)){
int currUserIndex=-1;
for(int i=0;i<users.capacity();i++){
if(userName.equals((String)users.get(i))){
currUserIndex=i;
break;
}
}
if (currUserIndex!=-1){
users.remove(currUserIndex);
users.trimToSize();
return true;
}
}
return false;
} public Vector getOnLineUser()
{
return users;
}
public void valueBound(HttpSessionBindingEvent e) {
users.trimToSize();
if(!existUser(e.getName())){
users.add(e.getName());
System.out.print(e.getName()+"\t 登入到系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}else
System.out.println(e.getName()+"已经存在");
} public void valueUnbound(HttpSessionBindingEvent e) {
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
System.out.print(userName+"\t 退出系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}
} /////////////////////////////////////////////////////////////////////////////
<%
/**这是显示在线用户的jsp文件文件名为onLineUser.jsp*/
%>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="onLineUser,java.util.*" %>
<jsp:useBean id="onlineuser" class="onLineUser" scope="application"/>
<html>
<head>
<title>搞定JSP在线人数</title>
</head>
<body>
<center>
<p><h1>登陆成功,欢迎您访问!</h1></p>
</center>
<% session = request.getSession(false); %>
<%
String username=request.getParameter("username");
if (onlineuser.existUser(username)){
out.println("用户<font color=red>"+username+"</font>已经登陆!");
}else{
session.setMaxInactiveInterval(50); file://Sesion有效时长,以秒为单位
session.setAttribute(username,onlineuser);
out.println("欢迎新用户:<font color=red>"+username+"</font>登陆到系统!");
}
out.println("<br>当前在线用户人数:<font color=red>"+onlineuser.getCount()+"</font><br>");
Vector vt=onlineuser.getOnLineUser();
Enumeration e = vt.elements();
out.println("在线用户列表");
out.println("<table border=1>");
out.println("<tr><td>用户名</td></tr>");
while(e.hasMoreElements()){
out.println("<tr><td>");
out.println((String)e.nextElement()+"<br>");
out.println("</td></tr>");
}
out.println("</table>");
%>
<center>
<p>elapsed制作</p>
<p> </p>
<%
out.println("<p><a href='logout.jsp?username="+username+"'>退出系统</a></p>");
%>
</center>
</body>
</html> ////////////////////////////////////////////////////////////////////////////////////
<%
/**这是用户退出的jsp文件文件名为logout.jsp*/
%>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="onLineUser,java.util.*" %>
<jsp:useBean id="onlineuser" class="onLineUser" scope="application"/>
<html>
<head>
<title>搞定JSP在线人数</title>
</head>
<body>
<center>
<p><h1>登陆成功,欢迎您访问!</h1></p>
</center>
<%
String username=request.getParameter("username");
if(onlineuser.deleteUser(username))
out.println(username+"已经退出系统!");
else
out.println(username+"没有登陆到系统!");
%>
<center>
<p>elapsed制作</p>
<p> </p>
<p><a href="logout.jsp">退出系统</a></p>
</center>
</body>
</html>
后来想出一种可能比较笨的办法:
1、在数据库用户表中加入在线状态字段,然后用一个作业每隔一定的时间将它重置为0;
2、在页面上也每隔一定的时间调用一个方法,将状态字段置为1。要绝对准确好像是不太可能的,不过这个办法目前暂时满足我们项目的需要,没怎么测试,不知道访问人数多了行不行。
所以呀,不要专精这些应用的东西,而要好好深入的研究,
希望大家编出个像session,application这样的内置组件来解决这个问题,
这种人才牛!我只是个小菜菜,发表一下感想而以。我用模式一:jsp+javaBean 做过一个小型项目
做得还行,但我一做完就不想再做JSP了,它太不简单,太不美观。我想你们一定会说用MVC模式二来做就会好一些,但MVC也有很多缺陷。我感觉这东西太不成熟。其实只有一个东西做得简练美观才是最有生命力的。JSP再过一些时间就要Die了。有志之士还是多研究一些更深的东西,虽然开始可能没什么成效,但这种时间和精力决对花得值,不知道我这人是不是太理想化了。
楼上不用JSP,又高就什么了呢?
这话,是不是有点大了。我遇到的这确实是个难题,
但这并不能说JSP不行啊,而是我们学的还不够,学得还不深!