基于struts2的记住账号密码的登录设计

简介:   一个简单的基于struts2的登录功能,实现的额外功能有记住账号密码,登录错误提示。这里写上我在设计时的思路流程,希望大家能给点建设性的意见,帮助我改善设计。   登录功能的制作,首先将jsp界面搭建出来,界面搭建出来之后,我首先想的是如何用cookie来实现记住账号密码,这里我选择的是在class中实现这个cookie。

  一个简单的基于struts2的登录功能,实现的额外功能有记住账号密码,登录错误提示。这里写上我在设计时的思路流程,希望大家能给点建设性的意见,帮助我改善设计。

  登录功能的制作,首先将jsp界面搭建出来,界面搭建出来之后,我首先想的是如何用cookie来实现记住账号密码,这里我选择的是在class中实现这个cookie。

jsp页面中的checkbox标签作为一个标记参数来判断用户是否选择了记住账号和密码,在登录提交之后,伴随着登录的账号、密码、激活码一起传递到action中,checkbox选中,则传递true,不选中,则不传递。

1         if(checkbox){
2             Cookie namecookie = new Cookie("loginName",loginName);//新建cookie对象
3             Cookie passwordcookie = new Cookie("password",password);
4             namecookie.setMaxAge(60*60*24*365);//设置cookie对象的有效时间
5             passwordcookie.setMaxAge(60*60*24*365);
6             response.addCookie(namecookie);
7             response.addCookie(passwordcookie); 
8         }

  记住账号密码的cookie实现后,我有2个操作要做,一个是判断登录账号是否存在,是否允许登录,还有一个是验证码是否正确。在这里我设计的是先判断验证码的正确性。因为验证码是为了防止特定程序以暴力破解的方式不断的进行登录尝试。说白了就是用来区分人和电脑的,先判断验证码,验证码错误,则不进行账户匹配的操作,可以减少程序对数据库的访问,节省资源。验证码正确,再进行账号匹配操作。

1 String code = (String) ActionContext.getContext().getSession().get("code");//得到系统生成并存储在session中的验证码
2 if(code!=null&&code.equalsIgnoreCase(yzm)){
3                 
4                 admin = adminBiz.loginByNamePassword(loginName,password);
5                 if(admin!=null){
6                     ActionContext.getContext().getSession().put("manager",admin);
7                     return "loginok";//跳转到登录操作页面
8                 }
9 }

  这样一个简单的登录就实现了,但还是有很多问题没有解决,比如我创建了cookie,但没有读取,那记住的账号密码从哪里来显示到登录页面上呢?

我想设计的是在action中用同一个方法来实现读取cookie。也就是我登录提交和显示登录jsp页面访问的都是同一个action的同一个方法。

那我怎么区分它是第一次访问,要显示登录页面而不是要它去判断登录提交呢?

  因为我的登录提交是用form表单来实现的,所以我账号密码就算不输值,form表单中的input也会提交""字符给action,但如果我不是通过form表单来跳转,则不会提交""给action。因此,我就通过判断账号和密码是否为空来区分是第一次访问要显示登录页面还是判断登录情况,而且我的验证码是在登录页面中显示的,我如果不是通过登录页面去访问这个action,则session中存储的验证码也为空(但不能排除你是重复刷新登录页面的情况,所以不用session中的验证码)。既然已经能区分第一次访问和提交访问,则当它是第一次访问的时候,判断是否存在cookie,并读取传递到登录页面显示。

 1 if(loginName==null&&password==null){
 2                 loginName = "";
 3                 password = "";
 4                 Cookie[] cookies = request.getCookies();
 5                 if(cookies!=null)
 6                 {
 7                     checkbox = true;//标记checkbox,传递到登录页面,使checkbox默认勾选
 8                     for (int i = 0; i < cookies.length; i++) 
 9                     {
10                        Cookie c = cookies[i];     
11                        if(c.getName().equalsIgnoreCase("loginName"))
12                        {
13                           loginName = c.getValue();
14                         }
15                         else if(c.getName().equalsIgnoreCase("password"))
16                         {
17                            password = c.getValue();
18                         }     
19                     } 
20                   }
21                 return "login";//跳转到登录页面

22 }

  这样登录的记住和读取账号密码就都能实现了。但还缺少登录错误提示,我在action中设计了变量warn,初始值为"",在直接访问action时,不对warn做处理,

若为form表单提交访问,则根据不同的情况赋予warn不同的提示语。

最后,附上完整的action_login方法

 1  1 private String warn;
 2  2 private boolean checkbox;
 3  3 private String loginName;
 4  4 private String password;
 5  5 private String yzm;//验证码
 6  6 private Admin admin;
 7  7 public String login(){
 8  8 
 9  9         HttpServletRequest request = ServletActionContext.getRequest(); 
10 10         HttpServletResponse  response = ServletActionContext.getResponse();
11 11         if(checkbox){
12 12             Cookie namecookie = new Cookie("loginName",loginName);//新建cookie对象
13 13             Cookie passwordcookie = new Cookie("password",password);
14 14             namecookie.setMaxAge(60*60*24*365);//设置cookie对象的有效时间
15 15             passwordcookie.setMaxAge(60*60*24*365);
16 16             response.addCookie(namecookie);
17 17             response.addCookie(passwordcookie); 
18 18         }
19 19         String code = (String) ActionContext.getContext().getSession().get("code");//得到系统生成并存储在session中的验证码
20 20             if(loginName==null&&password==null){
21 21                 loginName = "";
22 22                 password = "";
23 23                 Cookie[] cookies = request.getCookies();
24 24                 if(cookies!=null)
25 25                 {
26 26                     checkbox = true;//传递到登录页面,作为标签checkbox默认勾选的判断
27 27                     for (int i = 0; i < cookies.length; i++) 
28 28                     {
29 29                        Cookie c = cookies[i];     
30 30                        if(c.getName().equalsIgnoreCase("loginName"))
31 31                        {
32 32                           loginName = c.getValue();
33 33                         }
34 34                         else if(c.getName().equalsIgnoreCase("password"))
35 35                         {
36 36                            password = c.getValue();
37 37                         }     
38 38                     } 
39 39                   }
40 40                 return "login";//跳转到登录页面
41 41             }else if("".equals(loginName)||"".equals(password)){
42 42                 warn = "用户名或密码不能为空!";
43 43                 return "login";
44 44             }else if(code!=null&&code.equalsIgnoreCase(yzm)){
45 45                 
46 46                 admin = adminBiz.loginByNamePassword(loginName,password);
47 47                 if(admin!=null){
48 48                     ActionContext.getContext().getSession().put("manager",admin);
49 49                     return "loginok";//跳转到登录成功页面
50 50                 }else{
51 51                     warn = "账号或密码错误!";
52 52                     return "login";
53 53                 }
54 54             }else{
55 55                 warn = "验证码错误!";
56 56                 return "login";
57 57             }    
58 58     }

  希望大家多多提意见~~一起共勉,一起提升~~~

 

 

 

 

 

 

 

相关文章
|
存储 缓存 网络协议
HTTP协议【网络基础/应用层】
HTTP协议【网络基础/应用层】
996 3
|
文字识别 API Python
在Apifox中调用OCR服务,可以按照以下步骤操作
在Apifox中调用OCR服务,可以按照以下步骤操作
490 2
|
SQL 关系型数据库 数据挖掘
软件测试|教你学会SQL LEFT JOIN的使用
软件测试|教你学会SQL LEFT JOIN的使用
|
5月前
|
机器学习/深度学习 数据采集 人工智能
构建AI智能体:五十九、特征工程:数据预处理到特征创造的系统性方法
摘要:特征工程是将原始数据转化为机器学习模型可理解格式的关键步骤,类比于食材烹饪过程。其核心包括数据清洗(处理缺失值、异常值)、特征转换(标准化、分箱)、特征创造和特征选择。通过员工离职预测案例,展示了如何通过单变量分析(满意度、工作时长分布)、多变量分析(满意度与绩效关系)和业务分析(部门薪资组合)构建有效特征。特征工程能提升模型性能(如使用简单模型获得好效果)、增强可解释性(明确风险因素)并减少数据需求。
353 5
|
消息中间件 运维 Serverless
商业版vs开源版:一图看懂云消息队列 RocketMQ 版核心优势
自建开源 RocketMQ 集群,为保证业务稳定性,往往需要按照业务请求的峰值去配置集群资源。云消息队列 RocketMQ 版 Serverless 实例通过资源快速伸缩,实现资源使用量与实际业务负载贴近,并按实际使用量计费,有效降低企业的运维压力和使用成本。
975 116
|
7月前
|
存储 机器学习/深度学习 人工智能
54_模型优化:大模型的压缩与量化
随着大型语言模型(LLM)的快速发展,模型规模呈指数级增长,从最初的数亿参数到如今的数千亿甚至万亿参数。这种规模扩张带来了惊人的能源消耗和训练成本,同时也给部署和推理带来了巨大挑战。2025年,大模型的"瘦身"已成为行业发展的必然趋势。本文将深入剖析大模型压缩与量化的核心技术、最新进展及工程实践,探讨如何通过创新技术让大模型在保持高性能的同时实现轻量化部署,为企业和开发者提供全面的技术指导。
629 0
|
11月前
|
机器学习/深度学习 存储 缓存
Chonkie:面向大语言模型的轻量级文本分块处理库
Chonkie是一个专为大语言模型(LLM)应用场景设计的轻量级文本分块处理库,提供高效的文本分割和管理解决方案。该库采用最小依赖设计理念,特别适用于现实世界的自然语言处理管道。本文将详细介绍Chonkie的核心功能、设计理念以及五种主要的文本分块策略。
558 0
Chonkie:面向大语言模型的轻量级文本分块处理库
|
数据采集 DataWorks 大数据
数据开发平台/工具对比测评:
数据开发平台/工具对比测评
533 23
|
Nacos 微服务
Zookeeper 的 ZAB 协议 以及 zookeeper 与 nacos 注册中心比对
Zookeeper 的 ZAB 协议 以及 zookeeper 与 nacos 注册中心比对
554 4
|
存储 安全 JavaScript
XSS 检测神器:BruteXSS 保姆级教程
XSS 检测神器:BruteXSS 保姆级教程