struts2的记住账号密码的登录设计
2015-05-22 11:46
183 查看
一个简单的基于struts2的登录功能,实现的额外功能有记住账号密码,登录错误提示。这里写上我在设计时的思路流程,希望大家能给点建设性的意见,帮助我改善设计。
登录功能的制作,首先将jsp界面搭建出来,界面搭建出来之后,我首先想的是如何用cookie来实现记住账号密码,这里我选择的是在class中实现这个cookie。
jsp页面中的checkbox标签作为一个标记参数来判断用户是否选择了记住账号和密码,在登录提交之后,伴随着登录的账号、密码、激活码一起传递到action中,checkbox选中,则传递true,不选中,则不传递。
记住账号密码的cookie实现后,我有2个操作要做,一个是判断登录账号是否存在,是否允许登录,还有一个是验证码是否正确。在这里我设计的是先判 断验证码的正确性。因为验证码是为了防止特定程序以暴力破解的方式不断的进行登录尝试。说白了就是用来区分人和电脑的,先判断验证码,验证码错误,则不进 行账户匹配的操作,可以减少程序对数据库的访问,节省资源。验证码正确,再进行账号匹配操作。
这样一个简单的登录就实现了,但还是有很多问题没有解决,比如我创建了cookie,但没有读取,那记住的账号密码从哪里来显示到登录页面上呢?
我想设计的是在action中用同一个方法来实现读取cookie。也就是我登录提交和显示登录jsp页面访问的都是同一个action的同一个方法。
那我怎么区分它是第一次访问,要显示登录页面而不是要它去判断登录提交呢?
因为我的登录提交是用form表单来实现的,所以我账号密码就算不输值,form表单中的input也会提交""字符给action,但如果我 不是通过form表单来跳转,则不会提交""给action。因此,我就通过判断账号和密码是否为空来区分是第一次访问要显示登录页面还是判断登录情况, 而且我的验证码是在登录页面中显示的,我如果不是通过登录页面去访问这个action,则session中存储的验证码也为空(但不能排除你是重复刷新登 录页面的情况,所以不用session中的验证码)。既然已经能区分第一次访问和提交访问,则当它是第一次访问的时候,判断是否存在cookie,并读取 传递到登录页面显示。
这样登录的记住和读取账号密码就都能实现了。但还缺少登录错误提示,我在action中设计了变量warn,初始值为"",在直接访问action时,不对warn做处理,
若为form表单提交访问,则根据不同的情况赋予warn不同的提示语。
最后,附上完整的action_login方法
登录功能的制作,首先将jsp界面搭建出来,界面搭建出来之后,我首先想的是如何用cookie来实现记住账号密码,这里我选择的是在class中实现这个cookie。
jsp页面中的checkbox标签作为一个标记参数来判断用户是否选择了记住账号和密码,在登录提交之后,伴随着登录的账号、密码、激活码一起传递到action中,checkbox选中,则传递true,不选中,则不传递。
if(checkbox){ Cookie namecookie = new Cookie("loginName",loginName);//新建cookie对象 Cookie passwordcookie = new Cookie("password",password); namecookie.setMaxAge(60*60*24*365);//设置cookie对象的有效时间 passwordcookie.setMaxAge(60*60*24*365); response.addCookie(namecookie); response.addCookie(passwordcookie); }
记住账号密码的cookie实现后,我有2个操作要做,一个是判断登录账号是否存在,是否允许登录,还有一个是验证码是否正确。在这里我设计的是先判 断验证码的正确性。因为验证码是为了防止特定程序以暴力破解的方式不断的进行登录尝试。说白了就是用来区分人和电脑的,先判断验证码,验证码错误,则不进 行账户匹配的操作,可以减少程序对数据库的访问,节省资源。验证码正确,再进行账号匹配操作。
String code = (String) ActionContext.getContext().getSession().get("code");//得到系统生成并存储在session中的验证码 if(code!=null&&code.equalsIgnoreCase(yzm)){ admin = adminBiz.loginByNamePassword(loginName,password); if(admin!=null){ ActionContext.getContext().getSession().put("manager",admin); return "loginok";//跳转到登录操作页面 } }
这样一个简单的登录就实现了,但还是有很多问题没有解决,比如我创建了cookie,但没有读取,那记住的账号密码从哪里来显示到登录页面上呢?
我想设计的是在action中用同一个方法来实现读取cookie。也就是我登录提交和显示登录jsp页面访问的都是同一个action的同一个方法。
那我怎么区分它是第一次访问,要显示登录页面而不是要它去判断登录提交呢?
因为我的登录提交是用form表单来实现的,所以我账号密码就算不输值,form表单中的input也会提交""字符给action,但如果我 不是通过form表单来跳转,则不会提交""给action。因此,我就通过判断账号和密码是否为空来区分是第一次访问要显示登录页面还是判断登录情况, 而且我的验证码是在登录页面中显示的,我如果不是通过登录页面去访问这个action,则session中存储的验证码也为空(但不能排除你是重复刷新登 录页面的情况,所以不用session中的验证码)。既然已经能区分第一次访问和提交访问,则当它是第一次访问的时候,判断是否存在cookie,并读取 传递到登录页面显示。
if(loginName==null&&password==null){ loginName = ""; password = ""; Cookie[] cookies = request.getCookies(); if(cookies!=null) { checkbox = true;//标记checkbox,传递到登录页面,使checkbox默认勾选 for (int i = 0; i < cookies.length; i++) { Cookie c = cookies[i]; if(c.getName().equalsIgnoreCase("loginName")) { loginName = c.getValue(); } else if(c.getName().equalsIgnoreCase("password")) { password = c.getValue(); } } } return "login";//跳转到登录页面 }
这样登录的记住和读取账号密码就都能实现了。但还缺少登录错误提示,我在action中设计了变量warn,初始值为"",在直接访问action时,不对warn做处理,
若为form表单提交访问,则根据不同的情况赋予warn不同的提示语。
最后,附上完整的action_login方法
private String warn;
private boolean checkbox;
private String loginName;
private String password;
private String yzm;//验证码
private Admin admin;
public String login(){
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
if(checkbox){ Cookie namecookie = new Cookie("loginName",loginName);//新建cookie对象 Cookie passwordcookie = new Cookie("password",password); namecookie.setMaxAge(60*60*24*365);//设置cookie对象的有效时间 passwordcookie.setMaxAge(60*60*24*365); response.addCookie(namecookie); response.addCookie(passwordcookie); }
String code = (String) ActionContext.getContext().getSession().get("code");//得到系统生成并存储在session中的验证码
if(loginName==null&&password==null){
loginName = "";
password = "";
Cookie[] cookies = request.getCookies();
if(cookies!=null)
{
checkbox = true;//传递到登录页面,作为标签checkbox默认勾选的判断
for (int i = 0; i < cookies.length; i++)
{
Cookie c = cookies[i];
if(c.getName().equalsIgnoreCase("loginName"))
{
loginName = c.getValue();
}
else if(c.getName().equalsIgnoreCase("password"))
{
password = c.getValue();
}
}
}
return "login";//跳转到登录页面
}else if("".equals(loginName)||"".equals(password)){
warn = "用户名或密码不能为空!";
return "login";
}else if(code!=null&&code.equalsIgnoreCase(yzm)){
admin = adminBiz.loginByNamePassword(loginName,password);
if(admin!=null){
ActionContext.getContext().getSession().put("manager",admin);
return "loginok";//跳转到登录成功页面
}else{
warn = "账号或密码错误!";
return "login";
}
}else{
warn = "验证码错误!";
return "login";
}
}
相关文章推荐
- 基于struts2的记住账号密码的登录设计
- 登录时记住账号密码功能示例代码
- 如何让git小乌龟工具记住Git账号密码 免多次登录
- 登录记住账号和密码小Demo
- 用SharedPerference设计登录页面,可以选择是否记住密码
- 13周:2.请编程设计一个登录界面,要求输入账号密码(不考虑事件)
- android 登录界面 记住多组账号与密码
- 登录界面记住密码设计
- jquery记住密码,记住账号,自动登录
- 原创思考 NSUserDefaults实现自动登录--保存账号和密码--记住登录状态
- 利用h5的本地存储实现登录页面里的记住账号和密码功能
- Struts2——简单的账号密码登录实例
- Android笔记:SharedPreference封装常用的工具类(用于记住密码、自动登录、引导页、账号密码等)
- C#序列化实现用户登录记住账号密码功能
- Android 手机存储及sd卡操作--案例登录记住帐号密码
- 请编程设计一个登陆界面,要求输入账号和密码(不考虑事件)
- 【Android】移动端与服务器端简单的交互(账号密码登录) Android+PHP+MySQL
- C语言怎么将用户账号密码写入文件实现登录注册功能?
- 记一次登录程序的改进过程(改进记住密码功能、提高用户交互)
- Openfire报账号或密码错误_c#版UC客户端登录