今天笔者在写个小项目时用到记住密码,这个的实现原理也简单一般都是使用cookie,笔者也这样写的,先看我的servlet层的代码:
Customer customer=getReqParamObj(request, Customer.class);
String remPwd=request.getParameter("checkboxSuccess");
boolean flage=false;
if(remPwd!=null&&remPwd.equals("on")){
Cookie[] cs=request.getCookies();
for(Cookie c:cs){
if(c.getName().equals("userpwd")){
c.setValue(customer.getCpwd());
flage=true;
break;
}
}
if(!flage){
Cookie cookie=new Cookie("userpwd", customer.getCpwd());
cookie.setMaxAge(60*30);
response.addCookie(cookie);
}
}
getReqParamObj是我自己写的一个方法,通过反射机制将传过来的参数转换成对象,checkboxSuccess是对应是否勾选记住密码的复选框
看起来很简单很流畅,页面的cookie也有,问题来了,我在界面是这么取的
<div class="col-sm-10">
<input type="password" class="form-control" id="cpwd"name="cpwd" placeholder="请输入密码"
value="${cookie.userpwd.value}" >
</div>
一切都是那么的自然,然而就是取不到,我以为是我的el表达式写错了,反反复复没看出毛病,换成小脚本来写如下:
<%
Cookie [] cs=request.getCookies();
String s="";
if(cs!=null&&cs.length>0){
for(Cookie c:cs){
if(c.getName().equals("userpwd")){
s=c.getValue();
break;
}
}
}
%>
再把input那改一下,居然还是不行,我只好debug,进去之后发现通过火狐浏览器看到的cookie中存在userpwd,但通过request取到的cookie中没有这个东西!!
不淡定了,伤自尊了,后来我手贱,在servlet中多写了这么一句:
Customer customer=getReqParamObj(request, Customer.class);
String remPwd=request.getParameter("checkboxSuccess");
boolean flage=false;
if(remPwd!=null&&remPwd.equals("on")){
Cookie[] cs=request.getCookies();
for(Cookie c:cs){
if(c.getName().equals("userpwd")){
c.setValue(customer.getCpwd());
flage=true;
break;
}
}
if(!flage){
Cookie cookie=new Cookie("userpwd", customer.getCpwd());
cookie.setMaxAge(60*30);
cookie.setPath("/");//就这一句话设置路径
response.addCookie(cookie);
}
}
然后他就可以了el轻松取到,我取网上看了一下原因,解释的不多,就记得好像不设置路径就会可能出现多个,但具体原因不清楚
先这样写着,我去问问大神。