关于Struts2的登陆、退出以及重复登陆的问题。

时间:2023-01-07 17:54:24
用户登陆的时候,将用户信息存入Session中

HttpSession session = ServletActionContext.getRequest().getSession();

session.setAttribute("username", Muser.getUsername().toString()
.trim());
session.setAttribute("realname", Muser.getName().toString()
.trim());
session.setAttribute("id", Muser.getId().toString().trim());
session.setAttribute("mobilePhone", Muser.getMobialphone()
.toString().trim());



用户退出的时候:remove这些字段

public String logout() throws Exception {
Map session = ActionContext.getContext().getSession();
try {
session.remove("username");

session.remove("realname");
session.remove("id");


System.out.println("退出成功!");
return SUCCESS;
} catch (Exception e) {
return INPUT;
}

}


①但是,我发现写的那个SessionListener,总是提示帐号已登陆,请重复登陆,这样再登陆一次就没问题了,貌似就是退出的时候那执行的有问题。

②如果我修改了session中的值,为什么页面不能及时的反馈,以及判断呢,而是要下次登陆才能及时的更新。
例如: realname 这个字段,登陆的时候,把这个字段存入了session,
然后用户登陆后,更改了这个字段,但是发现在session中的值并没有修改,
而是下次登陆之后才修改。这是因为这还是同一个session的原因吧?请问有好的解决办法没啊 ?
谢谢。

29 个解决方案

#1


Map session = ActionContext.getContext().getSession(false);//

#2


引用 1 楼 fangmingshijie 的回复:
Map session = ActionContext.getContext().getSession(false);//


啥意思啊 

#3


只读取,不创建新的session。

#4


引用 3 楼 fangmingshijie 的回复:
只读取,不创建新的session。



The method getSession() in the type ActionContext is not applicable for the arguments (boolean)


额,这是个好想法,这个报错呢 谢谢。

#5


Map session =ServletActionContext.getRequest().getSession(false);

#6


引用 5 楼 fangmingshijie 的回复:
Map session =ServletActionContext.getRequest().getSession(false);



额,我刚才Debug了下,登陆的那个session的值和我退出登陆的

Map session = ActionContext.getContext().getSession();

这个里面的session是一样的,并没有创建新的session。
所以还是同一个session

。我打算重写那个重复登陆判断的方法了。

另外问题②有好的解决方法吗?谢谢。

#7


让  session 强制过期!!

#8


1.你退出时是不是少删一个session属性叫“mobilePhone”的?

2.我们一般登录时先要判断session中是否已有用户属性。你这个简单,直接先判断session是否为空就行。
if(session == null){
    //执行你添加属性的操作
}else{
    //已登录状态
}

3.发表点个人意见...
像你这种session,退出时完全可以用getSession().clear()方法直接清空。
还有,为什么不把你的这些属性封装成一个user对象呢?以后设置session时只要传一个对象就搞定,很方便的。

#9


引用 7 楼 blackkeai 的回复:
让  session 强制过期!!


额,请问第②点该怎么做呢,谢谢。

#10


引用 8 楼 coder_dai 的回复:
1.你退出时是不是少删一个session属性叫“mobilePhone”的?

2.我们一般登录时先要判断session中是否已有用户属性。你这个简单,直接先判断session是否为空就行。
if(session == null){
    //执行你添加属性的操作
}else{
    //已登录状态
}

3.发表点个人意见...
像你这种sess……


额,谢谢,您提的一件非常有道理。接下来我就打算这么改,呵呵,另外问下,
①把我添加的那些session信息封装成,user对象,是不是要new 一个user信息呢?这个user会不会和当前用户冲突呢?
②如果我修改了session中的值,为什么页面不能及时的反馈,以及判断呢,而是要下次登陆才能及时的更新。
例如: realname 这个字段,登陆的时候,把这个字段存入了session,
然后用户登陆后,更改了这个字段,但是发现在session中的值并没有修改,
而是下次登陆之后才修改。这是因为这还是同一个session的原因吧?请问有好的解决办法没啊 ?
谢谢。

#11


引用 8 楼 coder_dai 的回复:
1.你退出时是不是少删一个session属性叫“mobilePhone”的?

2.我们一般登录时先要判断session中是否已有用户属性。你这个简单,直接先判断session是否为空就行。
if(session == null){
    //执行你添加属性的操作
}else{
    //已登录状态
}

3.发表点个人意见...
像你这种sess……


还有  用 HttpSession session = ServletActionContext.getRequest().getSession();//这个是我登录的时候用。

和Map session = ActionContext.getContext().getSession();//这个是注销,以及其他用。

这没啥区别吧?

#12


没差,依我看HttpSession 就是一个设定了泛型的map<String, Object>。
问题怎么样,解决了没啊

#13


引用 楼主 Javainging 的回复:
用户登陆的时候,将用户信息存入Session中


Java code
?



12345678910

HttpSession session = ServletActionContext.getRequest().getSession();                   session.setAttribute("username", Muser.getUserna……

你能提供你怎么判断用户已登录的代码或逻辑不?

#14


额,刚才没看到你10楼的问题。
1.你应该已经有一个名叫user的javabean吧?如果没有,创建一个,属性按需要添加。
例如:当你需要存入session时,这样做:
User u = new User(name, age, info);//实例化一个user,把登录信息注入
session.setAttribute("u", u);//这能看懂吧。。。存入session。
搞定。

2.第二个问题稍等,我有空时实验看看是不是你说的情况。

#15


接楼上。
第二个问题我刚试了一下,见下:

private ActionContext ctx = ActionContext.getContext();//得到session

public String test() {
System.out.println(ctx.getSession().isEmpty());//看是否为空
ctx.getSession().put("user", "dai");//添加值
ctx.getSession().put("user", "xiaoyi");//修改值
System.out.println(ctx.getSession().get("user"));//打印值
return SUCCESS;
}
打印出的是:
true
xiaoyi

由此可得:session是实时更新的。至于你的session没有更新,可能是
1.你给session重新设值时出错。
2.你获取session时出错。

学长只能帮你到这了。

#16


该回复于2012-12-18 13:34:14被管理员删除

#17


向session中存放值的时候如果名字一样,后者会覆盖前者;你上面说的realname没有及时更新的问题,我想问下,你修改的过有没有重新替换下session中之前的realname。

#18


引用 15 楼 coder_dai 的回复:
接楼上。
第二个问题我刚试了一下,见下:

private ActionContext ctx = ActionContext.getContext();//得到session

public String test() {
System.out.println(ctx.getSession().isEmpty());//看是否为空
ctx.getSessi……


恩,谢谢,前面的问题都解决了,
后面的那个session更新的,还是没能解决呢。,
页面上那个获取的还是没更新之前的值。

#19


引用 18 楼 Javainging 的回复:
引用 15 楼 coder_dai 的回复:接楼上。
第二个问题我刚试了一下,见下:

private ActionContext ctx = ActionContext.getContext();//得到session

public String test() {
System.out.println(ctx.getSession().isEmpty())……


把你引用的那段代码贴出来看看。

#20


引用 19 楼 coder_dai 的回复:
引用 18 楼 Javainging 的回复:引用 15 楼 coder_dai 的回复:接楼上。
第二个问题我刚试了一下,见下:

private ActionContext ctx = ActionContext.getContext();//得到session

public String test() {
System.out.println(ctx.……



<c:if test="${session.teamState=='未审核'}">
<Strong><font color="red"> 预约之前请提交预约申请,然后等待导师审核。</font>
</Strong>
如果没有提交申请,请在个人中心处申请.
</c:if>


这就是就是页面的那段代码 ${session.teamState} 输出的也是修改之前的值,有说是缓存的问题,但是我

加了清理缓存的代码,还是不行。



<%  
   // 这三句话只是为了防止浏览器缓存  
   response.setHeader("Cache-Control", "no-cache, no-store"); //HTTP 1.1    
    response.setHeader("Pragma", "no-cache"); //HTTP 1.0    
    response.setDateHeader("Expires", 0); //prevents caching at the proxy server  
 

%>  

#21


1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。

#22


引用 21 楼 coder_dai 的回复:
1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。



登陆的时候,把值存入了session,
页面只是获取session的值,jsp取session咋能保证他取到更新后的sessin的值呢,

是不是要重新获取session的值

#23


引用 22 楼 Javainging 的回复:
引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。


登陆的时候,把值存入了session,
页面只是获取session的值,jsp取session咋能保证他取到更新后的sessin的值呢,

……


更新过当然要重新获取session才行了。就好像我整容前你认识我,但是整容之后,我肯定要向你自我介绍了你才知道是我啊。

你没有重新获取么。。。?

#24


引用 23 楼 coder_dai 的回复:
引用 22 楼 Javainging 的回复:引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。


登陆的时候,把值存入了session,
页面只是获取session的值,jsp取session咋……


额,没有重新获取呢,咋重新获取啊,
难不成真要重新登陆嘛?呵呵,谢谢。

#25


引用 24 楼 Javainging 的回复:
引用 23 楼 coder_dai 的回复:引用 22 楼 Javainging 的回复:引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。


登陆的时候,把值存入了session,
页面只是获取……


struts中更新完session,直接跳转到之前的jsp(等于是刷新了),顺理成章一气呵成。

#26


在sessionRemove方法下面调用一下invalidate()方法,来注销session。

#27


引用 26 楼 wwyyhhww 的回复:
在sessionRemove方法下面调用一下invalidate()方法,来注销session。


如果我修改了session中的值,为什么页面不能及时的反馈,以及判断呢,而是要下次登陆才能及时的更新。
例如: realname 这个字段,登陆的时候,把这个字段存入了session,
然后用户登陆后,更改了这个字段,但是发现在session中的值并没有修改,
而是下次登陆之后才修改。这是因为这还是同一个session的原因吧?请问有好的解决办法没啊 ?
谢谢。 

#28


引用 25 楼 coder_dai 的回复:
引用 24 楼 Javainging 的回复:
引用 23 楼 coder_dai 的回复:引用 22 楼 Javainging 的回复:引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。


登陆的时候,把值存入了sess……


额,我不是更新session 是更新那个session中的字段,额,要不这样,更新那个字段了再更新下session,。
可能跟session的生命周期有关系吧。

#29


引用 28 楼 Javainging 的回复:
引用 25 楼 coder_dai 的回复:引用 24 楼 Javainging 的回复:
引用 23 楼 coder_dai 的回复:引用 22 楼 Javainging 的回复:引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer()……


光更新字段没用啊,session里还是原来那东西。
就好像我写信告诉你我整容了,但你还是只认识整容前的我一样。

必须要重新session.put(...)才行啊,多想想session的用法。

#1


Map session = ActionContext.getContext().getSession(false);//

#2


引用 1 楼 fangmingshijie 的回复:
Map session = ActionContext.getContext().getSession(false);//


啥意思啊 

#3


只读取,不创建新的session。

#4


引用 3 楼 fangmingshijie 的回复:
只读取,不创建新的session。



The method getSession() in the type ActionContext is not applicable for the arguments (boolean)


额,这是个好想法,这个报错呢 谢谢。

#5


Map session =ServletActionContext.getRequest().getSession(false);

#6


引用 5 楼 fangmingshijie 的回复:
Map session =ServletActionContext.getRequest().getSession(false);



额,我刚才Debug了下,登陆的那个session的值和我退出登陆的

Map session = ActionContext.getContext().getSession();

这个里面的session是一样的,并没有创建新的session。
所以还是同一个session

。我打算重写那个重复登陆判断的方法了。

另外问题②有好的解决方法吗?谢谢。

#7


让  session 强制过期!!

#8


1.你退出时是不是少删一个session属性叫“mobilePhone”的?

2.我们一般登录时先要判断session中是否已有用户属性。你这个简单,直接先判断session是否为空就行。
if(session == null){
    //执行你添加属性的操作
}else{
    //已登录状态
}

3.发表点个人意见...
像你这种session,退出时完全可以用getSession().clear()方法直接清空。
还有,为什么不把你的这些属性封装成一个user对象呢?以后设置session时只要传一个对象就搞定,很方便的。

#9


引用 7 楼 blackkeai 的回复:
让  session 强制过期!!


额,请问第②点该怎么做呢,谢谢。

#10


引用 8 楼 coder_dai 的回复:
1.你退出时是不是少删一个session属性叫“mobilePhone”的?

2.我们一般登录时先要判断session中是否已有用户属性。你这个简单,直接先判断session是否为空就行。
if(session == null){
    //执行你添加属性的操作
}else{
    //已登录状态
}

3.发表点个人意见...
像你这种sess……


额,谢谢,您提的一件非常有道理。接下来我就打算这么改,呵呵,另外问下,
①把我添加的那些session信息封装成,user对象,是不是要new 一个user信息呢?这个user会不会和当前用户冲突呢?
②如果我修改了session中的值,为什么页面不能及时的反馈,以及判断呢,而是要下次登陆才能及时的更新。
例如: realname 这个字段,登陆的时候,把这个字段存入了session,
然后用户登陆后,更改了这个字段,但是发现在session中的值并没有修改,
而是下次登陆之后才修改。这是因为这还是同一个session的原因吧?请问有好的解决办法没啊 ?
谢谢。

#11


引用 8 楼 coder_dai 的回复:
1.你退出时是不是少删一个session属性叫“mobilePhone”的?

2.我们一般登录时先要判断session中是否已有用户属性。你这个简单,直接先判断session是否为空就行。
if(session == null){
    //执行你添加属性的操作
}else{
    //已登录状态
}

3.发表点个人意见...
像你这种sess……


还有  用 HttpSession session = ServletActionContext.getRequest().getSession();//这个是我登录的时候用。

和Map session = ActionContext.getContext().getSession();//这个是注销,以及其他用。

这没啥区别吧?

#12


没差,依我看HttpSession 就是一个设定了泛型的map<String, Object>。
问题怎么样,解决了没啊

#13


引用 楼主 Javainging 的回复:
用户登陆的时候,将用户信息存入Session中


Java code
?



12345678910

HttpSession session = ServletActionContext.getRequest().getSession();                   session.setAttribute("username", Muser.getUserna……

你能提供你怎么判断用户已登录的代码或逻辑不?

#14


额,刚才没看到你10楼的问题。
1.你应该已经有一个名叫user的javabean吧?如果没有,创建一个,属性按需要添加。
例如:当你需要存入session时,这样做:
User u = new User(name, age, info);//实例化一个user,把登录信息注入
session.setAttribute("u", u);//这能看懂吧。。。存入session。
搞定。

2.第二个问题稍等,我有空时实验看看是不是你说的情况。

#15


接楼上。
第二个问题我刚试了一下,见下:

private ActionContext ctx = ActionContext.getContext();//得到session

public String test() {
System.out.println(ctx.getSession().isEmpty());//看是否为空
ctx.getSession().put("user", "dai");//添加值
ctx.getSession().put("user", "xiaoyi");//修改值
System.out.println(ctx.getSession().get("user"));//打印值
return SUCCESS;
}
打印出的是:
true
xiaoyi

由此可得:session是实时更新的。至于你的session没有更新,可能是
1.你给session重新设值时出错。
2.你获取session时出错。

学长只能帮你到这了。

#16


该回复于2012-12-18 13:34:14被管理员删除

#17


向session中存放值的时候如果名字一样,后者会覆盖前者;你上面说的realname没有及时更新的问题,我想问下,你修改的过有没有重新替换下session中之前的realname。

#18


引用 15 楼 coder_dai 的回复:
接楼上。
第二个问题我刚试了一下,见下:

private ActionContext ctx = ActionContext.getContext();//得到session

public String test() {
System.out.println(ctx.getSession().isEmpty());//看是否为空
ctx.getSessi……


恩,谢谢,前面的问题都解决了,
后面的那个session更新的,还是没能解决呢。,
页面上那个获取的还是没更新之前的值。

#19


引用 18 楼 Javainging 的回复:
引用 15 楼 coder_dai 的回复:接楼上。
第二个问题我刚试了一下,见下:

private ActionContext ctx = ActionContext.getContext();//得到session

public String test() {
System.out.println(ctx.getSession().isEmpty())……


把你引用的那段代码贴出来看看。

#20


引用 19 楼 coder_dai 的回复:
引用 18 楼 Javainging 的回复:引用 15 楼 coder_dai 的回复:接楼上。
第二个问题我刚试了一下,见下:

private ActionContext ctx = ActionContext.getContext();//得到session

public String test() {
System.out.println(ctx.……



<c:if test="${session.teamState=='未审核'}">
<Strong><font color="red"> 预约之前请提交预约申请,然后等待导师审核。</font>
</Strong>
如果没有提交申请,请在个人中心处申请.
</c:if>


这就是就是页面的那段代码 ${session.teamState} 输出的也是修改之前的值,有说是缓存的问题,但是我

加了清理缓存的代码,还是不行。



<%  
   // 这三句话只是为了防止浏览器缓存  
   response.setHeader("Cache-Control", "no-cache, no-store"); //HTTP 1.1    
    response.setHeader("Pragma", "no-cache"); //HTTP 1.0    
    response.setDateHeader("Expires", 0); //prevents caching at the proxy server  
 

%>  

#21


1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。

#22


引用 21 楼 coder_dai 的回复:
1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。



登陆的时候,把值存入了session,
页面只是获取session的值,jsp取session咋能保证他取到更新后的sessin的值呢,

是不是要重新获取session的值

#23


引用 22 楼 Javainging 的回复:
引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。


登陆的时候,把值存入了session,
页面只是获取session的值,jsp取session咋能保证他取到更新后的sessin的值呢,

……


更新过当然要重新获取session才行了。就好像我整容前你认识我,但是整容之后,我肯定要向你自我介绍了你才知道是我啊。

你没有重新获取么。。。?

#24


引用 23 楼 coder_dai 的回复:
引用 22 楼 Javainging 的回复:引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。


登陆的时候,把值存入了session,
页面只是获取session的值,jsp取session咋……


额,没有重新获取呢,咋重新获取啊,
难不成真要重新登陆嘛?呵呵,谢谢。

#25


引用 24 楼 Javainging 的回复:
引用 23 楼 coder_dai 的回复:引用 22 楼 Javainging 的回复:引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。


登陆的时候,把值存入了session,
页面只是获取……


struts中更新完session,直接跳转到之前的jsp(等于是刷新了),顺理成章一气呵成。

#26


在sessionRemove方法下面调用一下invalidate()方法,来注销session。

#27


引用 26 楼 wwyyhhww 的回复:
在sessionRemove方法下面调用一下invalidate()方法,来注销session。


如果我修改了session中的值,为什么页面不能及时的反馈,以及判断呢,而是要下次登陆才能及时的更新。
例如: realname 这个字段,登陆的时候,把这个字段存入了session,
然后用户登陆后,更改了这个字段,但是发现在session中的值并没有修改,
而是下次登陆之后才修改。这是因为这还是同一个session的原因吧?请问有好的解决办法没啊 ?
谢谢。 

#28


引用 25 楼 coder_dai 的回复:
引用 24 楼 Javainging 的回复:
引用 23 楼 coder_dai 的回复:引用 22 楼 Javainging 的回复:引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer();jsp里加上这个方法试试。


登陆的时候,把值存入了sess……


额,我不是更新session 是更新那个session中的字段,额,要不这样,更新那个字段了再更新下session,。
可能跟session的生命周期有关系吧。

#29


引用 28 楼 Javainging 的回复:
引用 25 楼 coder_dai 的回复:引用 24 楼 Javainging 的回复:
引用 23 楼 coder_dai 的回复:引用 22 楼 Javainging 的回复:引用 21 楼 coder_dai 的回复:1.确定你jsp页面取session的时候是在session更新之后。不然就白忙活了。。。

2.response.flushBuffer()……


光更新字段没用啊,session里还是原来那东西。
就好像我写信告诉你我整容了,但你还是只认识整容前的我一样。

必须要重新session.put(...)才行啊,多想想session的用法。