请教关于HttpSessionAttributeListener的问题(初学)

梅子 2010-08-30 10:31:48
我开始学习的时候写了一个类,这个类implements HttpSessionAttributeListener

然后在attributeAdded方法里面得到每个登录的Session,在Session里面得到userId

具体写法是:


int userid=0;
public void attributeAdded(HttpSessionBindingEvent arg0) {
// TODO 自动生成方法存根
if(arg0.getSession().getAttribute("user")!=null){
Login login=(Login)arg0.getSession().getAttribute("user");
userid=login.getUid();
//System.out.println(userid);
}
}



插入日志的方法如下:

public boolean addLog(String log,String type){
boolean bool=false;
if(userid!=0){
Object[] parpre=new Object[4];
parpre[0]=userid;
parpre[1]=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
parpre[2]=type;
parpre[3]=log;
bool=sqlhelp.executeUpdate("insert into log (managerid,datetime,acttype,loginfo) values (?,?,?,?)",parpre);
}
return bool;
}


现在问题来了,因为以前理解错误。。。以为每个Session都是独立的,现在发现,这个userid,只是记录最后一个登录的人的userid。。杯具呀。。。现在日志表很混乱,userID都不对的。。有什么简单的方法可以把这段代码改掉么?

我的架构只是简单的JSP+Servlet

请各位大大帮忙呀~~3Q。。。
...全文
302 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kitajima-- 2012-09-03
  • 打赏
  • 举报
回复
public void attributeAdded(HttpSessionBindingEvent arg0)
{
String name = arg0.getName();
String value = "";
ServletContext context = arg0.getSession().getServletContext();

if ("userId".equals(name)) {
value = (String)arg0.getValue();

Set userIds = (Set)context.getAttribute("loginUsers");

if (userIds == null) {
userIds = new HashSet();
userIds.add(value);
}
else {
userIds.add(value);
}

context.setAttribute("loginUsers", userIds);
}
}
liufeng0209 2010-08-31
  • 打赏
  • 举报
回复
这样,你会AOP么,如果会的话,做一个aop after通知,在某些service方法进行拦截,可以取到HttpServletRequest,然后再取userID
梅子 2010-08-31
  • 打赏
  • 举报
回复
再看看有没有其他人有意见。。再挂2天结贴。。
zzh200411 2010-08-31
  • 打赏
  • 举报
回复
帮顶 .
梅子 2010-08-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liufeng0209 的回复:]
这样,你会AOP么,如果会的话,做一个aop after通知,在某些service方法进行拦截,可以取到HttpServletRequest,然后再取userID
[/Quote]

我不会。。



只能老老实实改代码了。谢谢各位。。
thegodofwar 2010-08-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sunnxxy 的回复:]
引用 11 楼 crazylaa 的回复:
引用 8 楼 sunnxxy 的回复:

引用 7 楼 liufeng0209 的回复:
attributeAdded是用户登陆时调用的方法.每个用户登陆后都会覆盖你的userID,你要做日志根本不需要记录这个值,每次去session里面取就行了


我知道每次去取就行了
问题是怎么取?

比如 insert操作

我在一个方法里……
[/Quote]
我觉得这个改的代码量也不会太大,你就重现做一下吧O(∩_∩)O~
cheng20100915 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunnxxy 的回复:]
我开始学习的时候写了一个类,这个类implements HttpSessionAttributeListener

然后在attributeAdded方法里面得到每个登录的Session,在Session里面得到userId

具体写法是:


Java code

int userid=0;
public void attributeAdded(HttpSessionBind……
[/Quote]
这样写肯定不行的啊,只会出现最后一个的,把前面的都覆盖了

做法:
if(登录成功){
把用户名作为编号把user存入sessin
写法:session[userId],这样userid是不同的,那么session就不同了,要是相同就会记录最后一个.
}

因为不知道楼主具体是要干什么,只好先写这样的思路,楼主考验试试看
梅子 2010-08-30
  • 打赏
  • 举报
回复
沉了
自己顶一个
梅子 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 crazylaa 的回复:]
引用 8 楼 sunnxxy 的回复:

引用 7 楼 liufeng0209 的回复:
attributeAdded是用户登陆时调用的方法.每个用户登陆后都会覆盖你的userID,你要做日志根本不需要记录这个值,每次去session里面取就行了


我知道每次去取就行了
问题是怎么取?

比如 insert操作

我在一个方法里面做insert,然后要插入日志,这个inse……
[/Quote]


我知道可以这样做,问题是,因为我以前犯的错误,如果现在要改每个Servlet会很复杂。。我就是不想去改每个Servlet。。。想说有没有什么办法,在那个类里面直接判断是哪个UserID在做操作。。
crazylaa 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sunnxxy 的回复:]

引用 7 楼 liufeng0209 的回复:
attributeAdded是用户登陆时调用的方法.每个用户登陆后都会覆盖你的userID,你要做日志根本不需要记录这个值,每次去session里面取就行了


我知道每次去取就行了
问题是怎么取?

比如 insert操作

我在一个方法里面做insert,然后要插入日志,这个insert的方法是servlet跳转,servle……
[/Quote]

用不着这么复杂吧。登录成功的session.setAttribute("user",user);
插入那里直接getAttribute然后取id插日志么好了。
梅子 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sunnxxy 的回复:]
引用 6 楼 pussywagon_ 的回复:
userSession.setAttribute(user.getId(), user)


这个要怎么做?研究下下。。
[/Quote]

这个怎么取session????不知道UserID么。。。
梅子 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pussywagon_ 的回复:]
userSession.setAttribute(user.getId(), user)
[/Quote]

这个要怎么做?研究下下。。
梅子 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liufeng0209 的回复:]
attributeAdded是用户登陆时调用的方法.每个用户登陆后都会覆盖你的userID,你要做日志根本不需要记录这个值,每次去session里面取就行了
[/Quote]

我知道每次去取就行了
问题是怎么取?

比如 insert操作

我在一个方法里面做insert,然后要插入日志,这个insert的方法是servlet跳转,servlet是可以得到session,但是我不想在每个servlet里面传userid。。该怎么做呢?
liufeng0209 2010-08-30
  • 打赏
  • 举报
回复
attributeAdded是用户登陆时调用的方法.每个用户登陆后都会覆盖你的userID,你要做日志根本不需要记录这个值,每次去session里面取就行了
小小嗨皮 2010-08-30
  • 打赏
  • 举报
回复
userSession.setAttribute(user.getId(), user)
梅子 2010-08-30
  • 打赏
  • 举报
回复
不好意思,可能我没说清楚

我登陆的时候写的东西如下:

if(true){
HttpSession userSession = request.getSession();
userSession.setAttribute("user", user);
}


我想要实现,每个人做每一个动作的时候,比如增删改
都调用上面那个类(implements HttpSessionAttributeListener)
可以不用我每个动作都传UserId进来

举例说明:
比如A登陆了,在A登陆后,B又登陆了,然后A所做的操作都变成B的UserId了,我现在就是想A的UserID对应A所作的动作,B的userID对应B所做的操作,都在一个类里面实现,有没有这个可能?
⊙﹏⊙b汗

不知道说清楚没。。。

请各位大大批评指教
colin_pxx 2010-08-30
  • 打赏
  • 举报
回复
你在登录成功的时候把userId放入session里面了吗
xiaolu_0312 2010-08-30
  • 打赏
  • 举报
回复
你到底要干嘛啊?你自己定义一个ID又干嘛啊?

67,550

社区成员

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

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