用Servlet完成一个验证码的用户登陆界面

servlet编写验证码程序:

package org.zhou.webhw2;

import org.apache.commons.lang3.RandomUtils;

import javax.imageio.ImageIO;
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 javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;


public class yanzhengmaServlet extends HttpServlet {
    private static final int WIDTH=100;
    private static final int HEIGHT=40;
    public static String ma;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //获取session
        HttpSession session =request.getSession();
        System.out.println(session.getId());
        //产生一张图片
        BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);

        Graphics g=image.getGraphics();//制图类
        //设置背景色
        g.setColor(Color.WHITE);
        //设置背景填充色
        g.fillRect(0,0,WIDTH,HEIGHT);
        //设置前景色(验证码颜色)
        g.setColor(Color.black);
        //获取一个字体类对象
        Font font=new Font("黑体",Font.BOLD,30);
        //设置图字体
        g.setFont(font);
        //调用随机获取字母的方法
        ma=genRandomString(4,g);

        session.setAttribute("str",ma);

        //画线
        for(int i=0;i<20;i++){
            //随机获取线条坐标值
            int x1=RandomUtils.nextInt(0,WIDTH);
            int x2=RandomUtils.nextInt(0,WIDTH);
            int y1=RandomUtils.nextInt(0,HEIGHT);
            int y2=RandomUtils.nextInt(0,HEIGHT);
            //随机获取线条颜色
            Color color=new Color(RandomUtils.nextInt(0,255),RandomUtils.nextInt(0,255),RandomUtils.nextInt(0,255));
            //设置图中线条颜色
            g.setColor(color);
            //画线
            g.drawLine(x1,x2,y1,y2);



        }
        //输出图片
        ImageIO.write(image,"jpg",response.getOutputStream());

    }

    private String genRandomString(int i,Graphics g) {
        String suiji="";

        int k=20;
        int l=0;
        for(int j=0;j<i;j++){
            char c1=(char) RandomUtils.nextInt(48,58);
            char c2=(char) RandomUtils.nextInt(65,91);
            char c3=(char) RandomUtils.nextInt(97,123);
            char ccc[]={c1,c2,c3};
            char cc=ccc[RandomUtils.nextInt(0,3)];
            String str=String.valueOf(cc);
            int x=RandomUtils.nextInt(l,l+k);
             int y=RandomUtils.nextInt(20,40);
            g.drawString(str,x,y);
            l=l+k+2;

            suiji+=cc;
        }
        return suiji;

    }
}

servlet编写服务器反馈界面:

package org.zhou.webhw2;

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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
//        response.getWriter().print("<!DOCTYPE html> <html lang=\"zh-CN\"> <head> <meta charset=\"utf-8\"> <meta http-equiv=\"X-UA-Compatible\" content=\"IE-edge\"> <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"> <title>vue01</title>  </head> <body>");
//        response.getWriter().print("<form name='form1' action='' method='post'>");
//        response.getWriter().print("<p><b>注册:</p>");
//        response.getWriter().print("<p>请输入用户名:<input type='text' name='usename'/></p>");
//        response.getWriter().print("<p>请输入密码:<input type='password' name='password'/></p>");
//        response.getWriter().print("<p>请输入验证码:<input type='text' name='yanzheng'/><img src='./web1'></p>");
//        response.getWriter().print("<button type='submit'>提交</button>");
//        response.getWriter().print("</form>");
        //获取用户输入的验证码值
        String str=request.getParameter("yanzheng");
//        String str2=yanzhengmaServlet.ma;
        HttpSession session2 =request.getSession();
        String str2=String.valueOf(session2.getAttribute("str"));
        if(request.getParameter("r1")!=null){
            if(equals2(str,str2)){
                response.getWriter().print("<p>登录成功!</p>");
                response.getWriter().print(request.getParameter("usename"));
                response.getWriter().print("密码是:"+request.getParameter("password"));
            }else{
                response.getWriter().print("<script>alert('验证码错误1')</script>");
            }
        }else{
            if(str.equals(str2)){
                response.getWriter().print("<p>登录成功!</p>");
                response.getWriter().print(request.getParameter("usename"));
                response.getWriter().print("密码是:"+request.getParameter("password"));
            }else{
                response.getWriter().print("<script>alert('验证码错误2')</script>");
            }



        }








//        response.getWriter().print("</body></html>");
    }


    public boolean equals2(String str1,String str2) {
        String s1=str1.toUpperCase();
        String s2=str2.toUpperCase();
       if(s1.equals(s2)){
           return true;
       }else {
           return false;
       }
    }
}

网页代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form name='form1' action='./web2' method='post'>
    <p><b>注册:</p>
    <p>请输入用户名:<input type='text' name='usename'/></p>
    <p>请输入密码:<input type='password' name='password'/></p>
    <p>请输入验证码:<input  type='text' name='yanzheng'/>
        <input type='checkbox' name="r1"/>不区分大小写



        <img src="./web1"></p>
    <button type='submit'>提交</button>
</form>
</body>
</html>

web.xml文件的配置:

<?xml version='1.0' encoding='UTF-8'?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0"
         metadata-complete="true">

<display-name>java web01</display-name>
<description>
    java web01
</description>
<servlet>
    <servlet-name>Servletid</servlet-name>
    <servlet-class>org.zhou.webhw2.yanzhengmaServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Servletid</servlet-name>
    <url-pattern>/web1</url-pattern>
</servlet-mapping>
    <servlet>
        <servlet-name>Servletid2</servlet-name>
        <servlet-class>org.zhou.webhw2.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servletid2</servlet-name>
        <url-pattern>/web2</url-pattern>
    </servlet-mapping>

</web-app>

 运行程序需要的包:

效果图:

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,我们需要创建一个用于访问数据库的 JavaBean,假设我们叫它 UserBean。UserBean 需要有以下方法: 1. 用于验证用户登录信息的方法:boolean validate(String username, String password),返回一个 boolean 值表示验证结果是否成功。 2. 用于获取用户信息的方法:User getUser(String username),返回一个 User 对象表示该用户的信息。 其中,User 是一个 JavaBean,存储用户的信息,比如用户名、密码、性别等。 接下来,我们可以编写一个 index.jsp 页面,包含一个表单,用于用户输入用户名、密码和验证码: ```html <html> <head> <title>用户登录</title> </head> <body> <h1>用户登录</h1> <form action="login" method="post"> 用户名:<input type="text" name="username"/><br/><br/> 密码:<input type="password" name="password"/><br/><br/> 验证码:<input type="text" name="verify"/><img src="verifyCode"/><br/><br/> <input type="submit" value="登录"/> </form> </body> </html> ``` 其中,验证码的图片是通过一个 servlet 生成的,我们需要在 web.xml 中配置该 servlet: ```xml <servlet> <servlet-name>VerifyCodeServlet</servlet-name> <servlet-class>com.example.VerifyCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>VerifyCodeServlet</servlet-name> <url-pattern>/verifyCode</url-pattern> </servlet-mapping> ``` 接下来,我们编写一个 LoginServlet 来处理用户登录请求。该 Servlet 首先验证验证码是否正确,然后调用 UserBean 的 validate 方法来验证用户名和密码是否正确,最后根据验证结果进行相应的处理。 ```java @WebServlet("/login") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); String verifyCode = request.getParameter("verify"); String sessionVerifyCode = (String) request.getSession().getAttribute("verifyCode"); if (!verifyCode.equalsIgnoreCase(sessionVerifyCode)) { request.setAttribute("error", "验证码错误"); request.getRequestDispatcher("/index.jsp").forward(request, response); return; } UserBean userBean = new UserBean(); if (userBean.validate(username, password)) { User user = userBean.getUser(username); request.getSession().setAttribute("user", user); response.sendRedirect("welcome.jsp"); } else { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("/index.jsp").forward(request, response); } } } ``` 在 LoginServlet 中,我们使用了 request.getSession() 方法来获取 HttpSession 对象,用于保存用户信息。当用户信息验证通过后,我们将用户信息保存在 session 中,并重定向到 welcome.jsp 页面。如果验证失败,则将错误信息保存在 request 中,并转发回 index.jsp 页面。 最后,我们还需要编写一个 VerifyCodeServlet 来生成验证码图片。这里我们使用了第三方库 Kaptcha 来生成验证码图片。在 doGet 方法中,我们将生成的验证码字符串保存在 HttpSession 中,以便后续验证使用。 ```java public class VerifyCodeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); // 创建验证码图片 Producer producer = new DefaultKaptcha(); String text = producer.createText(); BufferedImage image = producer.createImage(text); // 保存验证码字符串到 session 中 session.setAttribute("verifyCode", text); // 输出验证码图片 response.setContentType("image/png"); ServletOutputStream outputStream = response.getOutputStream(); ImageIO.write(image, "png", outputStream); outputStream.flush(); outputStream.close(); } } ``` 最后,我们需要在 web.xml 中配置 Kaptcha 的 servlet 和 filter: ```xml <servlet> <servlet-name>KaptchaServlet</servlet-name> <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>KaptchaServlet</servlet-name> <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping> <filter> <filter-name>KaptchaFilter</filter-name> <filter-class>com.google.code.kaptcha.servlet.KaptchaFilter</filter-class> <init-param> <param-name>kaptcha.border</param-name> <param-value>no</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.char.length</param-name> <param-value>4</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.font.size</param-name> <param-value>30</param-value> </init-param> <init-param> <param-name>kaptcha.image.width</param-name> <param-value>120</param-value> </init-param> <init-param> <param-name>kaptcha.image.height</param-name> <param-value>45</param-value> </init-param> </filter> <filter-mapping> <filter-name>KaptchaFilter</filter-name> <url-pattern>/login</url-pattern> </filter-mapping> ``` 这样,我们就完成一个简单的用户登录界面,并且实现了验证码功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值