注册功能
展示验证码,点击能切换;校验验证码,填写不正确,则注册失败
当用户填写了注册的用户名与密码时,在数据库调用select方法查询是否存在该用户,若不存在,则调用add方法添加该用户信息
service:
jsp:拥有账号密码已经验证码填写三大块
registerServlet:
由于我们要发送动态请求,因此我们需要在jsp页面将值输出
这时我们用已注册的账号注册,会发现页面确实响应了
而新注册一个用户发现成功
然后用刚刚的账号登陆成功
验证码功能
然后做验证码
由于验证码工具类文件实在太长,所以我们直接略过此处工具类编写[在最底下有完整的]
但是,由于此util工具类是利用输出流将图片输出到本地的一个固定路径的图片上,因此,在调用时我们只需要调用此图片路径(即在图片的src里写入虚拟路径以及验证码调用的servlet即可)以及验证码数据即可
我们写一个调用验证码的checkCodeServlet
将图片路径改为动态的servlet
然后启动项目就能发现验证码进行了动态切换
每刷新一次,验证码都不同
接下来将旁边的按钮优化:点击按钮时,重新请求此方法一次即可
但是这样,我们却发现点击按钮时验证码图没变化!因为图片已被缓存
这时我们可以在这后面加上永远不一样的参数:时间
现在我们就可以随时切换验证码了
校验验证码
现在便是校验验证码
首先我们将验证码存入session
在servlet里面获取用户输入的验证码
然后获取程序生成的验证码进行比对
这样我们的验证码功能便完善了
同时,为了解决中文异常,我们依旧规定字符集,下面的语句放在每个需要调用中文的servlet的doget方法开头即可
//处理post请求乱码问题
request.setCharacterEncoding("utf-8");
验证码工具类原码
package com.example.util;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;
//生成验证码工具类
public class CheckCodeUtil {
public static final String VERIFY_CODES = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static Random random = new Random();
//输出随机验证码图片流,并返回验证码值(一般传入输出流,响应response页面端,Web项目用的较多)
public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException {
String verifyCode = generateVerifyCode(verifySize);
outputImage(w, h, os, verifyCode);
return verifyCode;
}
//使用系统默认字符源生成验证码
//@param verifySize 验证码长度
public static String generateVerifyCode(int verifySize) {
return generateVerifyCode(verifySize, VERIFY_CODES);
}
//使用指定源生成验证码
//@param verifySize 验证码长度
//@param sources 验证码字符源
public static String generateVerifyCode(int verifySize, String sources) {
// 未设定展示源的字码,赋默认值大写字母+数字
if (sources == null || sources.length() == 0) {
sources = VERIFY_CODES;
}
int codesLen = sources.length();
Random rand = new Random(System.currentTimeMilli