在idea中使用servlet实现随机生成验证码的窗口

初学者,只是记录下学习过程,难免出错,希望大佬们多多包涵!

1.创建一个LoginController.java文件,这个文件主要是为了设计登录的界面。并在该文件后写上继承HttpServlet类。如下图所示。
在这里插入图片描述
2.设置一个doGet方法,权限设置为受保护的,用来存储用户登录界面的html代码,并获取用户请求和返回响应的功能的代码。

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        System.out.println("doGet");
        resp.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<form action='' name='submit' method='post'>" );
        stringBuilder.append("登录名称:<input type='text' name='loginName' /><br>");
        stringBuilder.append("登录密码:<input type='password' name='loginPwd' /><br>");
        stringBuilder.append("验证码:<img src='../captche' width=100 height=80 /><br>");
        stringBuilder.append("<input type='submit' name='btnLogin' value='登录' /><br>");
        stringBuilder.append("</form>");
        showMsg(resp, stringBuilder.toString());
    }

3.我们再写入一个doPost方法判断用户传来的参数是否与登录账号和密码一致。

 @Override
    protected  void doPost(HttpServletRequest req,HttpServletResponse resp ) throws ServletException, IOException{
        String loginName = req.getParameter("loginName");
        String loginPwd = req.getParameter("loginPwd");
        String str = null;
        if ("5197101120".equals(loginName) && "1234".equals(loginPwd)){
             str = "你好," + loginName;
        }else{
             String str1 = "账号或密码错误";
        }
        showMsg(resp, str);
    }

4.然后我们写一个showMsg方法用来提示错误信息。

 private void showMsg(HttpServletResponse resp,String msg) throws IOException {
        resp.setCharacterEncoding("UTF-8");
        try{


        PrintWriter out=resp.getWriter();
        out.print("<html>\n" +
                "<head>\n" +
                "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" +
                "</head>\n" +
                "<body>\n" +
                msg+
                "</body>\n" +
                "</html>\n"
        );
        out.close();
        }catch (Exception ex){
            System.out.println(ex.getMessage());
        }
    }

该文件写完后的代码如下:

package cn.edu.mju.project1.controller;



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("/admin/login")
public class LoginController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        System.out.println("doGet");
        resp.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<form action='' name='submit' method='post'>" );
        stringBuilder.append("登录名称:<input type='text' name='loginName' /><br>");
        stringBuilder.append("登录密码:<input type='password' name='loginPwd' /><br>");
        stringBuilder.append("验证码:<img src='../captche' width=100 height=80 /><br>");
        stringBuilder.append("<input type='submit' name='btnLogin' value='登录' /><br>");
        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 str = null;
        if ("5197101120".equals(loginName) && "1234".equals(loginPwd)){
             str = "你好," + loginName;
        }else{
             String str1 = "账号或密码错误";
        }
        showMsg(resp, str);
    }
    private void showMsg(HttpServletResponse resp,String msg) throws IOException {
        resp.setCharacterEncoding("UTF-8");
        try{


        PrintWriter out=resp.getWriter();
        out.print("<html>\n" +
                "<head>\n" +
                "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" +
                "</head>\n" +
                "<body>\n" +
                msg+
                "</body>\n" +
                "</html>\n"
        );
        out.close();
        }catch (Exception ex){
            System.out.println(ex.getMessage());
        }
    }
}

5.再来创建一个CaptcheController.java用来实现验证码窗口的随机生成。

在这里插入图片描述
具体代码如下:

package cn.edu.mju.project1.controller;

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 java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/captche")
public class CaptcheController extends HttpServlet {
    private final int WIDTH = 100;//设置验证码框格的默认宽度
    private final int HEIGHT = 80;//设置验证码框格的默认高度
    private final int LINE_NUM = 30;//设置干扰线的默认条数
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedImage img = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);//创建字节缓冲流来存放验证码框格的图片
        Graphics g = img.getGraphics();//获取图片的画笔
        g.setColor(Color.white);//设置验证框格的背景颜色为白色
        g.fillRect(0,0,WIDTH,HEIGHT);//设置验证码框格在整个网页的坐标位置
        g.setColor(Color.RED);//设置验证码的字体颜色
        String code = randString(4);//把随机生成的验证码放入一个字符串内
        g.drawString(code,5,10);//设置生成的随机验证码在验证码框格的坐标位置
        Random random1 = new Random();//设置一个随机变量来存放验证码框格内的干扰点的坐标位置
        Random random2 = new Random();//设置一个随机变量来存放验证码框格内的干扰线的坐标位置
        for (int i = 0; i < 20; i++) {
                         int x1 = random1.nextInt(WIDTH);
                         int y1 = random1.nextInt(HEIGHT);
                         g.drawOval(x1, y1, 2, 2);
                     }//用一个循环实现多个干扰点的随机生成
        for (int j = 1; j <= LINE_NUM; j++) {
            int x = random2.nextInt(WIDTH);
            int y = random2.nextInt(HEIGHT);
            int xl = random2.nextInt(13);
            int yl = random2.nextInt(15);
            g.drawLine(x, y, x + xl, y + yl);
        }//用一个循环实现多条干扰线的随机生成
        g.dispose();//关闭画笔功能
        ServletOutputStream out = resp.getOutputStream();//获取内存的缓冲
        ImageIO.write(img,"jpg",out);//把验证码图片以“jpg”格式写入
        try{
            out.flush();//清除内存内的缓冲
        }finally{
            out.close();//关闭内存
        }


    }
    public String randString(int count){//设置随机生成的验证码
        StringBuilder builder = new StringBuilder();
        String str = "abcdefghijklmnopqrstuvwxyz0123456789";//设置随机验证码的每个字符的取值范围
        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);//把获取的一个随机字符的位置存入一个缓冲区的尾部
        }
        return builder.toString();//返回缓冲区的数据并转化为具体的值
    }
    public Color getRandomColor(int backgroundcolor,int fontcolor){//设置随机的验证码框格的背景和验证码的字体颜色
        Random random3 = new Random();
        Random random4 = new Random();
        Random random5 = new Random();
        if (backgroundcolor>255){
            backgroundcolor=255;
        }else if (backgroundcolor<0){
            backgroundcolor=0;
        }
        if(fontcolor>255){
            fontcolor=255;
        }else if (fontcolor<0){
            fontcolor=0;
        }
        int red = fontcolor + random3.nextInt();
        int green = fontcolor + random4.nextInt();
        int blue = fontcolor + random5.nextInt();
        return new Color(red,green,blue);
    }
}

6.最后写一个测试类来测试代码的可行性。

import cn.edu.mju.project1.controller.CaptcheController;
import org.junit.Test;

public class TestCaptche {
    @Test
    public void testRandomString(){
        CaptcheController c = new CaptcheController();
        System.out.println(c.randString(4));
    }
}

点击右上角的运行按钮在这里插入图片描述
打开浏览器,输入本机的本进程的端口号,再跟上自己设置的路径。
这里我们设置的是http://localhost:8081//admin/login

显示结果如下:

在这里插入图片描述
初学者,只是记录下学习过程,难免出错,希望大佬们多多包涵!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值