UsersInfo usersInfo=(UsersInfo)session.getAttribute("usersInfo");
这里居然输出的是注册输入的密码“123” 而不是“***”了
System.out.println(loginUsersInfo.getPassword());
你输出的是loginUsersInfo,并不是userInfo.
这里居然输出的是注册输入的密码“123” 而不是“***”了
System.out.println(loginUsersInfo.getPassword());
你输出的是loginUsersInfo,并不是userInfo.
不好意思 这是我贴代码时 忘记把那剪掉了 那是userInfo
这是纠正后的问题,前面为了精简代码变量,忘记把loginUsersInfo前面的login剪掉了
话说我注册的信息压根就没保存到session,这也存在同步,多线程我不是很懂咧
从你描述看,那部分代码没什么问题。既然这里你说没剪切调loginUsersInfo的代码,我怀疑是这部分混乱了,还是好好检查下!你可以先把userName打印出来看看。还有getPassword方法也看看,仔细检查吧
我这么说吧 我代码里的那个变量 都是loginUserInfo ,没有usersInfo只是我发帖的时候为了让你们看的变量简短一点 修剪了一下,最后一句发帖时忘记修剪了,这session里就一个保存用户信息的对象 没其他对象
因为只对密码进行了加密 所以用户名就是变了也看不出来,我个人觉得这肯定跟struts2 或者是sping的缓存有一定关系 在最后一次输出密码时,确实注册的信息也通过转发转过来了,但是并未存到session啊,我从session中获得session中的密码 为什么只通过一次页面的转发就改变了呢,这问题,我问过我们教员,他也不知道原因,都觉得很奇怪
因为只对密码进行了加密 所以用户名就是变了也看不出来,我个人觉得这肯定跟struts2 或者是sping的缓存有一定关系 在最后一次输出密码时,确实注册的信息也通过转发转过来了,但是并未存到session啊,我从session中获得session中的密码 为什么只通过一次页面的转发就改变了呢,这问题,我问过我们教员,他也不知道原因,都觉得很奇怪那你先把tomcat的缓存清空下,机器和服务都重启下试试
因为只对密码进行了加密 所以用户名就是变了也看不出来,我个人觉得这肯定跟struts2 或者是sping的缓存有一定关系 在最后一次输出密码时,确实注册的信息也通过转发转过来了,但是并未存到session啊,我从session中获得session中的密码 为什么只通过一次页面的转发就改变了呢,这问题,我问过我们教员,他也不知道原因,都觉得很奇怪那你先把tomcat的缓存清空下,机器和服务都重启下试试我已经tomcat都删除了 从新下了一个 还是这样
不好意思 这是我贴代码时 忘记把那剪掉了 那是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。
不好意思 这是我贴代码时 忘记把那剪掉了 那是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 但是最后一次输出明显是注册提交的值,数据库里面都是加密后的信息。
退一万步说 如果是被覆盖了 但是第一次输出和最后一次输出 中间只经过了页面的的一个转发操作,也就说覆盖发生在这个转发操作前后 但中间只有一个转发 我实在想不出是哪被覆盖的
不好意思 这是我贴代码时 忘记把那剪掉了 那是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中,跳转。
在跳转后的页面输出信息。
每一步的关键代码看看
第二步 请求参数会提交到下图方法 里面只有图中的代码 其它都被注释了,这里转换输出了一下,保存到session里面
第三步 上面方法转发到下图页面 页面中也只有下图中的小脚本 获取第二步中保存到session中的对象 输出没问题
第四步 页面会转发到 下图中的方法 同样只有途中方法 这时候获取session中的输出 就变成未加密前的 aaa了
这里说明一下 struts版本是 2.3.15 spring版本是3.2.5
当你在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虽然是用来接收请求参数的,但这个对象的密码我直接用set赋值成加密后的密码了 也就是说 voteUser里面的密码也是加密后的密码
你要是从数据库查出来的对象赋值给voteUser,同样会存在此问题。
voteUser在index.jsp页面转发之前其密码的确是加密后的密码,当转发后你可以在login()方法打印出voteUser,你会看到其值就是你之前的值,我猜测的是框架再一次封装了voteUser。你要是测试了上面的if代码块的代码就会看到其实他们是同一个对象。
这种情况也不太可能
第一 我这个项目确实是一个对象,但是我以前的项目这个对象是从数据库又查了一遍的对象在放进去的
,这里只是为了减掉数据库功能才这么写的,第二 你看我代码,voteUser虽然是用来接收请求参数的,但这个对象的密码我直接用set赋值成加密后的密码了 也就是说 voteUser里面的密码也是加密后的密码
你要是从数据库查出来的对象赋值给voteUser,同样会存在此问题。
voteUser在index.jsp页面转发之前其密码的确是加密后的密码,当转发后你可以在login()方法打印出voteUser,你会看到其值就是你之前的值,我猜测的是框架再一次封装了voteUser。你要是测试了上面的if代码块的代码就会看到其实他们是同一个对象。
我从新从数据库查的值不是在赋值给了voteUser 而是付给了一个新对象 源码发到了你邮箱,你看一下就知道了
这种情况也不太可能
第一 我这个项目确实是一个对象,但是我以前的项目这个对象是从数据库又查了一遍的对象在放进去的
,这里只是为了减掉数据库功能才这么写的,第二 你看我代码,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一个对象,本质就一样。我这测试出来是正确的。