web网站开发:我们登录网站时验证码的原理是什么?附源码 ...

摘要:  自定义验证码,只是在表单位置产生了验证码,并且点击的时候会换一张验证码,但并没有完成表单登陆的校验,下面一个程序是完成表单的效验,并且如果验证码输入错误,回显错误信息这个代码含生成验证码的servlet(Che ...

自定义验证码,只是在表单位置产生了验证码,并且点击的时候会换一张验证码,但并没有完成表单登陆的校验,下面一个程序是完成表单的效验,并且如果验证码输入错误,回显错误信息

这个代码含生成验证码的servlet(CheckImgServlet),这个代码只要完成验证码生成,并将生成的验证码放入session还有登陆页面(login.jsp)在它的表单中需要填写验证码,并且验证码填写错误还要显示验证码填写错误,<%=request.getAttribute("loginInfo")==null?"":request.getAttribute("loginInfo") %>>点击登陆会跳转到servlet(login),这个servlet会获取表单填写的验证码,还有在CheckImgServlet中存入session的验证码比较,如果一致,则程序向下走,如果不一致,表示验证码出了问题,所以需要request.setAttribute("loginInfo", "验证码错误");request.getRequestDispatcher("login.jsp").forward(request, response);放入request数据,用于login.jsp回显,还有一定是要转发,这样才能让request域中数据在login。jsp获取到

注意只要login.jsp运行CheckImgServlet就运行,验证码就放入了session中,所以验证码放入session是第一时间完成的,如果点击图片更换验证码CheckImgServlet就运行,session中的验证码就会更新。

代码

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>会员登录
会员登录USER LOGIN
<%=request.getAttribute("loginInfo")==null?"":request.getAttribute("loginInfo") %>>
web网站开发:我们登录网站时验证码的原理是什么?附源码

src链接到生成验证码图片的servlet

web网站开发:我们登录网站时验证码的原理是什么?附源码

应用于数据回显

CheckImgServlet

package com.huanfeng.cn;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/*** 验证码生成程序****/public class CheckImgServlet extends HttpServlet {// 集合中保存所有成语private List words = new ArrayList();@Overridepublic void init() throws ServletException {// 初始化阶段,读取new_words.txt// web工程中读取 文件,必须使用绝对磁盘路径String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");try {BufferedReader reader = new BufferedReader(new FileReader(path));String line;while ((line = reader.readLine()) != null) {words.add(line);}reader.close();} catch (IOException e) {e.printStackTrace();}}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 禁止缓存// response.setHeader("Cache-Control", "no-cache");// response.setHeader("Pragma", "no-cache");// response.setDateHeader("Expires", -1);int width = 120;int height = 30;// 步骤一 绘制一张内存中图片BufferedImage bufferedImage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);// 步骤二 图片绘制背景颜色 ---通过绘图对象Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔// 绘制任何图形之前 都必须指定一个颜色graphics.setColor(getRandColor(200, 250));graphics.fillRect(0, 0, width, height);// 步骤三 绘制边框graphics.setColor(Color.WHITE);graphics.drawRect(0, 0, width - 1, height - 1);// 步骤四 四个随机数字Graphics2D graphics2d = (Graphics2D) graphics;// 设置输出字体graphics2d.setFont(new Font("宋体", Font.BOLD, 18));Random random = new Random();// 生成随机数int index = random.nextInt(words.size());String word = words.get(index);// 获得成语// 定义x坐标int x = 10;for (int i = 0; i < word.length(); i++) {// 随机颜色graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));// 旋转 -30 --- 30度int jiaodu = random.nextInt(60) - 30;// 换算弧度double theta = jiaodu * Math.PI / 180;// 获得字母数字char c = word.charAt(i);// 将c 输出到图片graphics2d.rotate(theta, x, 20);graphics2d.drawString(String.valueOf(c), x, 20);graphics2d.rotate(-theta, x, 20);x += 30;}// 将验证码内容保存sessionrequest.getSession().setAttribute("checkcode_session", word);// 步骤五 绘制干扰线graphics.setColor(getRandColor(160, 200));int x1;int x2;int y1;int y2;for (int i = 0; i < 30; i++) {x1 = random.nextInt(width);x2 = random.nextInt(12);y1 = random.nextInt(height);y2 = random.nextInt(12);graphics.drawLine(x1, y1, x1 + x2, x2 + y2);}// 将上面图片输出到浏览器 ImageIOgraphics.dispose();// 释放资源//将图片写到response.getOutputStream()中ImageIO.write(bufferedImage, "jpg", response.getOutputStream());}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}/*** 取其某一范围的color** @param fc* int 范围参数1* @param bc* int 范围参数2* @return Color*/private Color getRandColor(int fc, int bc) {// 取其随机颜色Random random = new Random();if (fc > 255) {fc = 255;}if (bc > 255) {bc = 255;}int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}}
web网站开发:我们登录网站时验证码的原理是什么?附源码

保存验证码到session

login.java

package com.huanfeng.cn;import java.io.IOException;import java.sql.SQLException;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;public class login extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");String checkcode=request.getParameter("checkcode");HttpSession session = request.getSession();String checkcode_session=(String) session.getAttribute("checkcode_session");if(!checkcode_session.equals(checkcode)) {request.setAttribute("loginInfo", "验证码错误");request.getRequestDispatcher("login.jsp").forward(request, response);return;}String username = request.getParameter("username");String password =request.getParameter("password");User user=login(username,password);//login是去数据库查询数据,查询到返回Userif(user!=null) {//如果user存在则重定向到index.jspresponse.sendRedirect("/index.jsp");}else {//如果user没有,则表示没有查到request.setAttribute("loginInfo","密码错误");//向request域中写入数据,让login.jsp获取到request.getRequestDispatcher("/login.jsp").forward(request,response);//用转发,因为只有转发才能让jsp获取到login。info数据}}private User login(String username, String password) {QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());String sql="select * from user where username=? and password=?";try {User user=qr.query(sql, new BeanHandler(User.class),username,password);return user;} catch (SQLException e) {// TODO Auto-generated catch blockthrow new RuntimeException();}}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
web网站开发:我们登录网站时验证码的原理是什么?附源码

如果文章对你有帮助,欢迎点击上方按钮打赏作者

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

返回顶部