3_32江_0413—随机产生验证码验证码
引言
首先,通过上节课的学习,我们进行了简单的一个验证码显示固定内容1234并通过命令加入了干扰线,今天我们要实现产生容易的随机的内容的验证码:
1、编写StrUtil类
我们在之前的源码根路径下新建一个工具包utils,并新建一个Java类StrUtil,在其中进行编写代码如下,我们可以看到原理很简单,就是我们通过一个str去存储所有的字符,通过产生随机数和substring方法去去相应位置的数据最后生成一个自定义count的长度的随机字符串。
public class StrUtil {
public static String randomString(int count) {
String str = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz";
StringBuilder stringBuilder = new StringBuilder();
Random rnd = new Random();
for (int i = 0; i < count; i++) {
int pos = rnd.nextInt(str.length());
String ch = str.substring(pos, pos + 1);
stringBuilder.append(ch);
}
return stringBuilder.toString();
}
}
2、在原有基础上增加对验证码的判断
首先我们来到CaptcheController类中,在service函数中去生成这个随机字符串,并且生成一张带有随机字符串和干扰信息的图片,代码如下:
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/captche")
public class CaptcheController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletOutputStream sos = resp.getOutputStream();
String rndStr = StrUtil.randomString(4);
req.getSession().setAttribute("code",rndStr);
ImageIO.write(generatePic(100,80,rndStr),"JPEG",sos);
sos.flush();
sos.close();
}
private BufferedImage generatePic(int width,int height,String rndStr){
BufferedImage image = new BufferedImage(100,80,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);
g.setColor(Color.BLACK);
g.setFont(new Font("宋体",Font.BOLD,30));
StringBuilder builder = new StringBuilder();
g.setColor(new Color(rnd.nextInt(255),rnd.nextInt(255), rnd.nextInt(255)));
g.drawString(rndStr,10,20); //验证码内容
for(int j=0,n=rnd.nextInt(100);j<n;j++){ //设置随机点
g.setColor(Color.RED);
g.fillRect(rnd.nextInt(width),rnd.nextInt(height),1,1);
}
for (int i=0;i<5;i++){
g.setColor(new Color(rnd.nextInt(255),rnd.nextInt(255), rnd.nextInt(255)));
int x1=rnd.nextInt(90);
int y1=rnd.nextInt(30);
int x2=rnd.nextInt(90);
int y2=rnd.nextInt(30);
g.drawLine(x1,y1,x2,y2);
}
g.dispose();
return image;
}
}
接着,我们回到LoginController类中,我们在原有标签上加入一个图片标签img,并在src值内加入上下文的相对路径去访问我们的生成的验证码图片,并加入对验证码的判断,代码如下:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/Login")
public class LoginController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<form action='' method='post'>");
stringBuilder.append("登录名称:<input type='text' name='LoginName' value=''><br>");
stringBuilder.append("登录密码:<input type='password' name='LoginPwd' value=''><br>");
stringBuilder.append("验证码:<input type='text' name='validCode' value=''><br><img src='./captche' width='100' height='60'><br>");
stringBuilder.append("<input type='reset' name='reset' value='取消'>");
stringBuilder.append("<input type='submit' name='submit' value='登录'>");
stringBuilder.append("</form>");
showMsg(resp, stringBuilder.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String LoginName = req.getParameter("LoginName");
String LoginPwd = req.getParameter("LoginPwd");
String validCode = req.getParameter("validCode");
String code = (String) req.getSession().getAttribute("code");
String msg;
if ("35".equals(LoginName) && "1234".equals(LoginPwd) && code.equals(validCode))
{
msg = "你好" + LoginName;
} else {
msg="账号、密码或验证码错误";
}
showMsg(resp,msg);
}
private void showMsg(HttpServletResponse resp,String msg)throws IOException{
resp.setCharacterEncoding("UTF-8");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<html>");
stringBuilder.append("<header>");
stringBuilder.append("<title>text</title>");
stringBuilder.append("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
stringBuilder.append("<body>");
stringBuilder.append(msg);
stringBuilder.append("</body>");
stringBuilder.append("</html>");
PrintWriter out=resp.getWriter();
out.println(stringBuilder.toString());
out.close();
}
}
验证
现在我们进行验证成果,假设现在我们的patch=/Project13(上下文),端口为8081,映射为/Login,我们进行localhost(本机地址127.0.0.1)运行代码使用HTTP超文本传输协议访问页面,进入登录页面,进行验证如下图:
1.进入登录界面
2.只有输入正确账号密码和验证码才可以进入否则提示错误