jsp引用servlet生成的验证码..

验证码在网站中是一个非常常用的,主要用于有效防止对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。

此演示代码主要包括以下三部分:

1.checkCode.java :用于生成验证码

2.checkCodeServler

3.check.jsp 验证

下面是checkCode.java的内容:

//用于获取四位随机数 private char mapTable[] = {'0','1','2','3','4','5','6','7','8','9'}; //生成验证码,并返回随机生成的数字 public String getEnsure(int width, int height, OutputStream os){ if (width <= 0) width = 60; if (height <= 0) height = 20; BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); // 设定背景色 g.setColor(new Color(0xDCCCCC)); g.fillRect(0, 0, width, height); // 画边框 g.setColor(Color.black); g.drawRect(0, 0, width - 1, height - 1); // 取随机产生的认证码 String strEnsure = ""; // 4代表4位验证码 for (int i = 0; i < 4; ++i){ strEnsure += mapTable[(int) (mapTable.length * Math.random())]; } // 将认证码显示到图象中 g.setColor(Color.red); g.setFont(new Font("Atlantic Inline", Font.PLAIN, 14)); // 画的具体坐标 String str = strEnsure.substring(0, 1); g.drawString(str, 8, 14); str = strEnsure.substring(1, 2); g.drawString(str, 20, 15); str = strEnsure.substring(2, 3); g.drawString(str, 35, 18); str = strEnsure.substring(3, 4); g.drawString(str, 45, 15); // 释放图形上下文 g.dispose(); try{ // 输出图象到页面 ImageIO.write(image, "JPEG", os); } catch (IOException e){ return ""; } return strEnsure; //返回生成的随机数 }


再是checkCodeServlet的内容

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //禁用缓存,每次访问此页面,都重新生成 response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); //生成验证码的实例对象 CheckCode ie = new CheckCode(); //调用里面的方法,返回的是生成的验证码中的字符串 String str = ie.getEnsure(0,0,response.getOutputStream()); //获得session,并把字符串保存在session中,为后面的对比做基础 HttpSession session = request.getSession(); session.setAttribute("strEnsure", str); }

然后是web.xml对servlet的配置

<servlet> <servlet-name>CheckServlet</servlet-name> <servlet-class>com.blog.servlet.CheckServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CheckServlet</servlet-name> <url-pattern>/check</url-pattern> </servlet-mapping>

最后是jsp页面的引用

<html> <head> <title>验证码</title> <script type="text/javascript" language="javascript"> //重新获取验证字符 function changeImage() { //单击触发图片重载事件,完成图片验证码的更换 document.getElementById("imgRandom").src = document.getElementById("imgRandom").src + '?'; } </script> </head> <body> <img alt= "看不清楚?点击更换验证码 " src= "check" width= "100" height= "50" id="imgRandom" οnclick="changeImage()"/> <a href="javascript:changeImage();">看不清?</a> </body> </html>

在jsp页面中,只需要将img的src的属性指向生成验证码的servlet就可以了,指向servle在web.xmlt映射的url(这里我纠结了好久...)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要创建一个用于访问数据库的 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> ``` 这样,我们就完成了一个简单的用户登录界面,并且实现了验证码功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值