会话维护,验证验证码

***开发习惯

开发文档注释

养成习惯:在类前记得写开发文档注释
以便于二次开发
具体如下:

/**
     * 随机生成多个字符的字符串
     * @param count :字符串中字符的个数
     * @return :生成的字符串
     */
    public String randomString(int count){ //定义一个方法 ,count代表想要生成的字符个数
        StringBuilder builder = new StringBuilder(); //生成一个动态的字符串
        String source = "abcdefghijklmnpqrstuvwxy0123456789";//定义随机字符可选空间
        Random rnd = new Random();
        for(int i=0;i<count;i++) {
            int pos = rnd.nextInt(source.length());// 定义一个随机数,不超过可选字符空间长度
            String s = source.substring(pos, pos + 1);// 取一个字符
            builder.append(s);//把s中的字符加到字符串builder中
        }
        return builder.toString();//转换为String类
    }
}

将一些常用工具写成工具类

1.在java文件夹下新建一个util,用于存放一些需要重复调用的工具
2.新建一个字符串工具类StrUtil
3.将随机生成多个字符的字符串的代码复制进去
如下:
注意事项
一般情况下为了简便,我们会在要调用的类名前加上static
如:public static String randomString(int count)

/**
 * 有关字符串的方法
 */
public class StrUtil {
    /**
     * 随机生成多个字符的字符串
     * @param count :字符串中字符的个数
     * @return :生成的字符串
     */
    public static String randomString(int count){ //定义一个方法 ,count代表想要生成的字符个数
        StringBuilder builder = new StringBuilder(); //生成一个动态的字符串
        String source = "abcdefghijklmnpqrstuvwxy0123456789";//定义随机字符可选空间
        Random rnd = new Random();
        for(int i=0;i<count;i++) {
            int pos = rnd.nextInt(source.length());// 定义一个随机数,不超过可选字符空间长度
            String s = source.substring(pos, pos + 1);// 取一个字符
            builder.append(s);//把s中的字符加到字符串builder中
        }
        return builder.toString();//转换为String类
    }
}

——————————————分割线——————

正式开始

1.登录页面插入验证码

1.在LoginController类的doget方法里插入:显示验证码的代码

stringBuilder.append("验证码:<img src='./captche' width=100 height=80 /><br>");//登录界面插入验证码

2.运行程序,确保验证码和登录界面运行正常
3.img src=’ '中有两种情况,根据自己的情况输入,以显示验证码
①当前路径:./captche
②父路径:…/captche

2.验证

session方法

特点:安全性高,数据在服务端
步骤:
1.在CaptcheController中,生成验证码字符串的位置,添加如下代码

HttpSession session = req.getSession(); //用户请求,取session对象
session.setAttribute("code",code); //在生成验证码的部分进行存储,以便验证
        //生成一个口袋,用来放code

2.在LoginController中,在form表单中,将用户输入验证码的文本框命名为validCode
此行代码如下:

stringBuilder.append("验证码:<input type='text' name='validCode'/><img src='./captche' width=100 height=80 /><br>");
                             //让用户填写验证码          并命名为validCode          登录界面插入验证码并存放

3.获取用户输入的验证码,以及系统生成的验证码
代码如下:

String validCode = req.getParameter("validCode");//获取到用户输入的验证码
String saveCode = (String)req.getSession().getAttribute("code");//强制转化为String,并取出识别码
                // 将code强制转换成String类型      找req要getSession里getAttribute的code

4.写一个用于判断值是否为空的工具类
注意:写它,一来是解决第5步遇到的问题
二来,判断空值也是经常需要使用到的方法
在StrUtil里,添加代码:

/**
     * 判断是否为空工具类
     */
    public static boolean isBlank(String str){
        boolean ret = false; //先给ret一个默认值
        if(str == null || str.trim().equals("")){ //trim 去掉输入空格的情况
            ret = true;
        }
        return  ret;
    }

5.使用if语句,对账号,密码,验证码,逐步进行判断
代码如下:

        if(loginName.equals("5197101236") && loginPwd.equals("1234")) { //第一个if判断账号密码是否正确

            if(StrUtil.isBlank(validCode)){//第二个if调用工具类,判断验证码是否为空
                msg = "<font size='20'>请输入验证码"  + "</font>";
            }else {

                if(validCode.equals(saveCode)){//第三个if判断用户输入的验证码,是否与生成的一致
                    msg = "<font size='20'>欢迎憨批"  + loginName + "</font>";
                }else {
                    msg = "<font size='20'>验证码错误"  + "</font>";
                }
            }

        }else {
            msg = "<font size='20'>账号或密码错误"  + "</font>";
        }

第五步中遇到的问题(已解决)(原因未知)
系统判断是否为空语句,如下:

if(validCode != null)

这个判断,在实际操作中
当我在验证码处,不输入任何东西,直接提交时,他会直接判断
validCode 不为空

(挖坑)

拓展:取随机数工具类plus版本

如下:

/**
     * 多规则的字符串生成工具
     */
    public static String randomStringPuls(int count,int option){//定义一个方法 ,count代表想要生成的字符个数
        StringBuilder builder = new StringBuilder();//生成一个动态的字符串
        String str0="abcdefghijklmnpqrstuvwxy";//定义随机字符可选空间,目前定义str1,str2,str0三种
        String str1="0123456789";
        String str2="ABCDEFGHIJKLMNOPQRSTUVWXY";
        String str =str0;
        switch (option){  //多分支语句来选择字符区域
            case 1:
                str =str1;
                break;
            case 2:
                str =str2;
                break;
            default:
                str =str0;
                break;
        }
        Random rnd = new Random();//定义随机数容器
        for(int i=0;i<count;i++) {
            int pos = rnd.nextInt(str.length());// 定义一个随机数,不超过可选字符空间长度
            String s = str.substring(pos, pos + 1);// 取一个字符
            builder.append(s);//把s中的字符加到字符串builder中
        }
        return builder.toString();//转换为String类
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值