ssh框架 中 session保存的对象 因转发被莫名更改
用ssh框架做了一个项目,先说下流程。用户注册 输入的账号密码保存到 一个对象中,在保存到数据库的时候 会对对密码进行加密后保存。
比如输入 123 数据库中密码会变成其它编码,这里暂称 ***
注册成功后,我会把这个用户查出来(查出来是个对象) 暂称为 userInfo{userName:"admin",pwd:"***"}
这时候查出来的对象密码是加密后的密码,成功后转发到主页。
主页内容为了减少其它影响免得说我其它方法改变了session的值。jsp页面只有如下内容(写成小脚本是为了调试).
<%
获取到session中保存的userInfo对象,并打印输出用户中的密码,结果为加密后的密码"***" 这里没有问题,正常
UsersInfo usersInfo=(UsersInfo) session.getAttribute("usersInfo");
System.out.println("----------"+usersInfo.getPassword());
这里是转发到一个action中的一个方法
request.getRequestDispatcher("Resources_searchForm.action").forward(request, response);
%>
转发后的action方法代码如下
public String searchForm(){
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session =request.getSession();
转发成功后再次获取保存在session中的对象
UsersInfo usersInfo=(UsersInfo)session.getAttribute("usersInfo");
这里居然输出的是注册输入的密码“123” 而不是“***”了
System.out.println(loginUsersInfo.getPassword());
}
这里要说明几点 注册--查询--保存到session中--转发到主页(主页只有上面的小脚本)--转发到action中的那个方法 中间没有其它任何操作了
session中的用户信息 在主页的转发之前输出密码是加密后的正常密码,但中间只经过一个转发 到action中时session中的用户密码居然变成未加密之前了 这是何故啊 ,是在不知道原因
献上我仅有的所有积分,忘大神解决 --------------------编程问答-------------------- UsersInfo usersInfo=(UsersInfo)session.getAttribute("usersInfo");
这里居然输出的是注册输入的密码“123” 而不是“***”了
System.out.println(loginUsersInfo.getPassword());
你输出的是loginUsersInfo,并不是userInfo. --------------------编程问答--------------------
不好意思 这是我贴代码时 忘记把那剪掉了 那是userInfo --------------------编程问答--------------------
这是纠正后的问题,前面为了精简代码变量,忘记把loginUsersInfo前面的login剪掉了 --------------------编程问答-------------------- 楼主还是要好好检查一下代码,session是否安全,是否存在多线程同步现象。 --------------------编程问答--------------------
话说我注册的信息压根就没保存到session,这也存在同步,多线程我不是很懂咧 --------------------编程问答-------------------- 我看不出有什么问题,,,楼主检查下其他代码,或者检查下session中的用户名有没有变、、、 --------------------编程问答-------------------- 这是纠正后的问题,前面为了精简代码变量,忘记把loginUsersInfo前面的login剪掉了
=========
从你描述看,那部分代码没什么问题。既然这里你说没剪切调loginUsersInfo的代码,我怀疑是这部分混乱了,还是好好检查下!你可以先把userName打印出来看看。还有getPassword方法也看看,仔细检查吧 --------------------编程问答--------------------
我这么说吧 我代码里的那个变量 都是loginUserInfo ,没有usersInfo只是我发帖的时候为了让你们看的变量简短一点 修剪了一下,最后一句发帖时忘记修剪了,这session里就一个保存用户信息的对象 没其他对象 --------------------编程问答--------------------
因为只对密码进行了加密 所以用户名就是变了也看不出来,我个人觉得这肯定跟struts2 或者是sping的缓存有一定关系 在最后一次输出密码时,确实注册的信息也通过转发转过来了,但是并未存到session啊,我从session中获得session中的密码 为什么只通过一次页面的转发就改变了呢,这问题,我问过我们教员,他也不知道原因,都觉得很奇怪 --------------------编程问答-------------------- 在说一下,贴中的loginUsersInfo 就是usrsInfo 我发帖的时候最后一句打错了,忘记改过来了,发现时发觉帖子已经不能修改了 --------------------编程问答--------------------
那你先把tomcat的缓存清空下,机器和服务都重启下试试。。。 --------------------编程问答--------------------
我看不出有什么问题,,,楼主检查下其他代码,或者检查下session中的用户名有没有变、、、
因为只对密码进行了加密 所以用户名就是变了也看不出来,我个人觉得这肯定跟struts2 或者是sping的缓存有一定关系 在最后一次输出密码时,确实注册的信息也通过转发转过来了,但是并未存到session啊,我从session中获得session中的密码 为什么只通过一次页面的转发就改变了呢,这问题,我问过我们教员,他也不知道原因,都觉得很奇怪
那你先把tomcat的缓存清空下,机器和服务都重启下试试。。。
我已经tomcat都删除了 从新下了一个 还是这样 --------------------编程问答--------------------
UsersInfo usersInfo=(UsersInfo)session.getAttribute("usersInfo");
这里居然输出的是注册输入的密码“123” 而不是“***”了
System.out.println(loginUsersInfo.getPassword());
你输出的是loginUsersInfo,并不是userInfo.
不好意思 这是我贴代码时 忘记把那剪掉了 那是userInfo
我写了个demo,模拟了你所说的业务逻辑,取出来的是正确的。
Register.action
String pwd = MD5.encode(getPassword());//省略了查数据库,直接用MD5加密
UserInfo userInfo = new UserInfo(getUserName(),pwd);
ActionContext.getContext().getSession().put("usersInfo", userInfo);//放入session
index.jsp
<%
UserInfo usersInfo = (UserInfo) session.getAttribute("usersInfo");
System.out.println("----------" + usersInfo.getPassword());
request.getRequestDispatcher("/resources.action")
.forward(request, response);
%>
控制台输入:----------2c42cf97190fb1be49620f952c7a46d3(36405132经过MD5加密的字符串)
Resources_searchForm.action
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session =request.getSession();
UserInfo usersInfo=(UserInfo)session.getAttribute("usersInfo");
System.out.println(usersInfo.getPassword());
return "success";
}
控制台输出:2c42cf97190fb1be49620f952c7a46d3
我个人觉得,你好好的检查下代码~看是否覆盖过加密后的session。 --------------------编程问答--------------------
UsersInfo usersInfo=(UsersInfo)session.getAttribute("usersInfo");
这里居然输出的是注册输入的密码“123” 而不是“***”了
System.out.println(loginUsersInfo.getPassword());
你输出的是loginUsersInfo,并不是userInfo.
不好意思 这是我贴代码时 忘记把那剪掉了 那是userInfo
我写了个demo,模拟了你所说的业务逻辑,取出来的是正确的。
Register.action
String pwd = MD5.encode(getPassword());//省略了查数据库,直接用MD5加密
UserInfo userInfo = new UserInfo(getUserName(),pwd);
ActionContext.getContext().getSession().put("usersInfo", userInfo);//放入session
index.jsp
<%
UserInfo usersInfo = (UserInfo) session.getAttribute("usersInfo");
System.out.println("----------" + usersInfo.getPassword());
request.getRequestDispatcher("/resources.action")
.forward(request, response);
%>
控制台输入:----------2c42cf97190fb1be49620f952c7a46d3(36405132经过MD5加密的字符串)
Resources_searchForm.action
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session =request.getSession();
UserInfo usersInfo=(UserInfo)session.getAttribute("usersInfo");
System.out.println(usersInfo.getPassword());
return "success";
}
控制台输出:2c42cf97190fb1be49620f952c7a46d3
我个人觉得,你好好的检查下代码~看是否覆盖过加密后的session。
我觉得不可能 第一点:我注册的提交的信息没有放进去session 但是最后一次输出明显是注册提交的值,数据库里面都是加密后的信息。
退一万步说 如果是被覆盖了 但是第一次输出和最后一次输出 中间只经过了页面的的一个转发操作,也就说覆盖发生在这个转发操作前后 但中间只有一个转发 我实在想不出是哪被覆盖的 --------------------编程问答--------------------
UsersInfo usersInfo=(UsersInfo)session.getAttribute("usersInfo");
这里居然输出的是注册输入的密码“123” 而不是“***”了
System.out.println(loginUsersInfo.getPassword());
你输出的是loginUsersInfo,并不是userInfo.
不好意思 这是我贴代码时 忘记把那剪掉了 那是userInfo
我写了个demo,模拟了你所说的业务逻辑,取出来的是正确的。
Register.action
String pwd = MD5.encode(getPassword());//省略了查数据库,直接用MD5加密
UserInfo userInfo = new UserInfo(getUserName(),pwd);
ActionContext.getContext().getSession().put("usersInfo", userInfo);//放入session
index.jsp
<%
UserInfo usersInfo = (UserInfo) session.getAttribute("usersInfo");
System.out.println("----------" + usersInfo.getPassword());
request.getRequestDispatcher("/resources.action")
.forward(request, response);
%>
控制台输入:----------2c42cf97190fb1be49620f952c7a46d3(36405132经过MD5加密的字符串)
Resources_searchForm.action
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session =request.getSession();
UserInfo usersInfo=(UserInfo)session.getAttribute("usersInfo");
System.out.println(usersInfo.getPassword());
return "success";
}
控制台输出:2c42cf97190fb1be49620f952c7a46d3
我个人觉得,你好好的检查下代码~看是否覆盖过加密后的session。
我刚刚又新建了一个测试项目 这种情况还真存在 还是那样 我贴份代码出来 有需要 可以找我要源码 --------------------编程问答--------------------
/**
* 注册用户
* @return
*/
public String register(){
this.voteUser.setPassword(CommoUtil.generateMD5(this.voteUser.getPassword()));
//这里是输出加密后的密码
System.out.println(this.voteUser.getPassword());
session.put("userInfo", this.voteUser);
//设置跳转的页面,默认跳转方式为转发
setSuccessPage("index.jsp");
return SUCCESS;
}
这是index.jsp页面
<%
VoteUser userInfo=(VoteUser)session.getAttribute("userInfo");
//输出是加密后的密码
System.out.println(userInfo.getPassword());
//转发到action的login方法
request.getRequestDispatcher("voteUser_login").forward(request, response);
%>
这里补充说明一下,由于ssh整合后页面无法转发,在web.xml的struts配置加了如下代码
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
[color=#0000FF]<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
[/color]
aciton的login方法
public String login(){
VoteUser userInfo=(VoteUser) session.get("userInfo");
//这里输出就变了 编程提交密码了
System.out.println(userInfo.getPassword());
return SUCCESS;
}
这是一个新项目 也有这问题 我下面截图给你们看看 --------------------编程问答-------------------- 楼主的代码能否详细看下
一般流程为:注册,然后查询注册成功的用户,将查询成功用户(加密)信息保存到session中,跳转。
在跳转后的页面输出信息。
每一步的关键代码看看 --------------------编程问答--------------------
/**
* 注册用户
* @return
*/
public String register(){
this.voteUser.setPassword(CommoUtil.generateMD5(this.voteUser.getPassword()));
//这里是输出加密后的密码
System.out.println(this.voteUser.getPassword());
session.put("userInfo", this.voteUser);
//设置跳转的页面,默认跳转方式为转发
setSuccessPage("index.jsp");
return SUCCESS;
}
这是index.jsp页面
<%
VoteUser userInfo=(VoteUser)session.getAttribute("userInfo");
//输出是加密后的密码
System.out.println(userInfo.getPassword());
//转发到action的login方法
request.getRequestDispatcher("voteUser_login").forward(request, response);
%>
这里补充说明一下,由于ssh整合后页面无法转发,在web.xml的struts配置加了如下代码
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
[color=#0000FF]<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
[/color]
aciton的login方法
public String login(){
VoteUser userInfo=(VoteUser) session.get("userInfo");
//这里输出就变了 编程提交密码了
System.out.println(userInfo.getPassword());
return SUCCESS;
}
这是一个新项目 也有这问题 我下面截图给你们看看
看不出来问题,你发个测试项目看看 yoxibaga147@126.com --------------------编程问答-------------------- 我就是发这问题的 因为原账号不能回帖了,不得又注册了一个 这是一个新项目的截图
第一步 因为只是为了测试,直接在地址栏请求里面传参数
第二步 请求参数会提交到下图方法 里面只有图中的代码 其它都被注释了,这里转换输出了一下,保存到session里面
第三步 上面方法转发到下图页面 页面中也只有下图中的小脚本 获取第二步中保存到session中的对象 输出没问题
第四步 页面会转发到 下图中的方法 同样只有途中方法 这时候获取session中的输出 就变成未加密前的 aaa了
这里说明一下 struts版本是 2.3.15 spring版本是3.2.5 --------------------编程问答--------------------
/**
* 注册用户
* @return
*/
public String register(){
this.voteUser.setPassword(CommoUtil.generateMD5(this.voteUser.getPassword()));
//这里是输出加密后的密码
System.out.println(this.voteUser.getPassword());
session.put("userInfo", this.voteUser);
//设置跳转的页面,默认跳转方式为转发
setSuccessPage("index.jsp");
return SUCCESS;
}
这是index.jsp页面
<%
VoteUser userInfo=(VoteUser)session.getAttribute("userInfo");
//输出是加密后的密码
System.out.println(userInfo.getPassword());
//转发到action的login方法
request.getRequestDispatcher("voteUser_login").forward(request, response);
%>
这里补充说明一下,由于ssh整合后页面无法转发,在web.xml的struts配置加了如下代码
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
[color=#0000FF]<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
[/color]
aciton的login方法
public String login(){
VoteUser userInfo=(VoteUser) session.get("userInfo");
//这里输出就变了 编程提交密码了
System.out.println(userInfo.getPassword());
return SUCCESS;
}
这是一个新项目 也有这问题 我下面截图给你们看看
看不出来问题,你发个测试项目看看 yoxibaga147@126.com
已发邮箱 注意查收 谢谢 --------------------编程问答-------------------- 如果有需要看源码的 可以留下邮箱 我发你们测试代码 回帖有次数限制 我已经回不了帖了 见谅 --------------------编程问答-------------------- 大致问题我猜想应该是:
当你在register()方法里把voteUser放进session跳转到index.jsp页面,此时session里的voteUser是经过加密的,然后在index.jsp转发到login方法时,Struts2框架又会经过一系列的易做图的处理,因为request里面封装的有参数,因此此时的voteUser就是最开始的状态,也就是说重新封装了一次。此时当你在login方法从session里取userInfo时,其实这个对象和voteUser对象是同一个对象。
你可以在login方法里测试下
if(voteUser == userInfo){
System.out.println(userInfo);
}
解决方法,重新new个voteUser放入session里。 --------------------编程问答--------------------
大致问题我猜想应该是:
当你在register()方法里把voteUser放进session跳转到index.jsp页面,此时session里的voteUser是经过加密的,然后在index.jsp转发到login方法时,Struts2框架又会经过一系列的易做图的处理,因为request里面封装的有参数,因此此时的voteUser就是最开始的状态,也就是说重新封装了一次。此时当你在login方法从session里取userInfo时,其实这个对象和voteUser对象是同一个对象。
你可以在login方法里测试下
if(voteUser == userInfo){
System.out.println(userInfo);
}
解决方法,重新new个voteUser放入session里。
这种情况也不太可能
第一 我这个项目确实是一个对象,但是我以前的项目这个对象是从数据库又查了一遍的对象在放进去的
,这里只是为了减掉数据库功能才这么写的,第二 你看我代码,voteUser虽然是用来接收请求参数的,但这个对象的密码我直接用set赋值成加密后的密码了 也就是说 voteUser里面的密码也是加密后的密码 --------------------编程问答--------------------
大致问题我猜想应该是:
当你在register()方法里把voteUser放进session跳转到index.jsp页面,此时session里的voteUser是经过加密的,然后在index.jsp转发到login方法时,Struts2框架又会经过一系列的易做图的处理,因为request里面封装的有参数,因此此时的voteUser就是最开始的状态,也就是说重新封装了一次。此时当你在login方法从session里取userInfo时,其实这个对象和voteUser对象是同一个对象。
你可以在login方法里测试下
if(voteUser == userInfo){
System.out.println(userInfo);
}
解决方法,重新new个voteUser放入session里。
这种情况也不太可能
第一 我这个项目确实是一个对象,但是我以前的项目这个对象是从数据库又查了一遍的对象在放进去的
,这里只是为了减掉数据库功能才这么写的,第二 你看我代码,voteUser虽然是用来接收请求参数的,但这个对象的密码我直接用set赋值成加密后的密码了 也就是说 voteUser里面的密码也是加密后的密码
你要是从数据库查出来的对象赋值给voteUser,同样会存在此问题。
voteUser在index.jsp页面转发之前其密码的确是加密后的密码,当转发后你可以在login()方法打印出voteUser,你会看到其值就是你之前的值,我猜测的是框架再一次封装了voteUser。你要是测试了上面的if代码块的代码就会看到其实他们是同一个对象。 --------------------编程问答--------------------
大致问题我猜想应该是:
当你在register()方法里把voteUser放进session跳转到index.jsp页面,此时session里的voteUser是经过加密的,然后在index.jsp转发到login方法时,Struts2框架又会经过一系列的易做图的处理,因为request里面封装的有参数,因此此时的voteUser就是最开始的状态,也就是说重新封装了一次。此时当你在login方法从session里取userInfo时,其实这个对象和voteUser对象是同一个对象。
你可以在login方法里测试下
if(voteUser == userInfo){
System.out.println(userInfo);
}
解决方法,重新new个voteUser放入session里。
这种情况也不太可能
第一 我这个项目确实是一个对象,但是我以前的项目这个对象是从数据库又查了一遍的对象在放进去的
,这里只是为了减掉数据库功能才这么写的,第二 你看我代码,voteUser虽然是用来接收请求参数的,但这个对象的密码我直接用set赋值成加密后的密码了 也就是说 voteUser里面的密码也是加密后的密码
你要是从数据库查出来的对象赋值给voteUser,同样会存在此问题。
voteUser在index.jsp页面转发之前其密码的确是加密后的密码,当转发后你可以在login()方法打印出voteUser,你会看到其值就是你之前的值,我猜测的是框架再一次封装了voteUser。你要是测试了上面的if代码块的代码就会看到其实他们是同一个对象。
我从新从数据库查的值不是在赋值给了voteUser 而是付给了一个新对象 源码发到了你邮箱,你看一下就知道了 --------------------编程问答--------------------
大致问题我猜想应该是:
当你在register()方法里把voteUser放进session跳转到index.jsp页面,此时session里的voteUser是经过加密的,然后在index.jsp转发到login方法时,Struts2框架又会经过一系列的易做图的处理,因为request里面封装的有参数,因此此时的voteUser就是最开始的状态,也就是说重新封装了一次。此时当你在login方法从session里取userInfo时,其实这个对象和voteUser对象是同一个对象。
你可以在login方法里测试下
if(voteUser == userInfo){
System.out.println(userInfo);
}
解决方法,重新new个voteUser放入session里。
这种情况也不太可能
第一 我这个项目确实是一个对象,但是我以前的项目这个对象是从数据库又查了一遍的对象在放进去的
,这里只是为了减掉数据库功能才这么写的,第二 你看我代码,voteUser虽然是用来接收请求参数的,但这个对象的密码我直接用set赋值成加密后的密码了 也就是说 voteUser里面的密码也是加密后的密码
你要是从数据库查出来的对象赋值给voteUser,同样会存在此问题。
voteUser在index.jsp页面转发之前其密码的确是加密后的密码,当转发后你可以在login()方法打印出voteUser,你会看到其值就是你之前的值,我猜测的是框架再一次封装了voteUser。你要是测试了上面的if代码块的代码就会看到其实他们是同一个对象。
我从新从数据库查的值不是在赋值给了voteUser 而是付给了一个新对象 源码发到了你邮箱,你看一下就知道了
register()
//创建一个新对象放入session
VoteUser user = new VoteUser(voteUser.getUserName(),voteUser.getPassword());
//放进session(是一个map由BaseAction注入近来);
session.put("userInfo", user);
//验证输出一下
VoteUser userInfo=(VoteUser) session.get("userInfo");
System.out.println(userInfo);
login()
VoteUser userInfo = (VoteUser) session.get("userInfo");
System.out.println(userInfo);
if(voteUser == userInfo){
System.out.println("同一个对象");
}
控制台输出:
VoteUser [password=Dx9Fq+O67gHUA1vPR6FKqw==, userName="aa"]
Dx9Fq+O67gHUA1vPR6FKqw==
VoteUser [password=Dx9Fq+O67gHUA1vPR6FKqw==, userName="aa"]
你好好的检查下你的代码吧,从数据库取出来和new一个对象,本质就一样。我这测试出来是正确的。
--------------------编程问答-------------------- 几天应该结了吧。 --------------------编程问答-------------------- 你的注册跟登录功能是在同一个Action里面吗? --------------------编程问答--------------------
你的注册跟登录功能是在同一个Action里面吗?
不在同一action 也是这样的 这里是为了测试 重写了一个 我晚上已经大致找到原因了
补充:Java , Java EE