首先要有生成验证码图片和验证码文字的逻辑

package cn.bingou.util;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/*** 动态生成图片*/
public class VerifyCode {// {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}private static String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑",  "楷体_GB2312" };// 可选字符//"23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";private static String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";// 背景色private Color bgColor = new Color(255, 255, 255);// 基数(一个文字所占的空间大小)private int base = 30;// 图像宽度private int width = base * 4;// 图像高度private int height = base;// 文字个数private int len = 4;// 设置字体大小private int fontSize = 22;// 验证码上的文本private String text;private BufferedImage img = null;private Graphics2D g2 = null;/*** 生成验证码图片*/public void drawImage(OutputStream outputStream) {// 1.创建图片缓冲区对象, 并设置宽高和图像类型img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 2.得到绘制环境g2 = (Graphics2D) img.getGraphics();// 3.开始画图// 设置背景色
        g2.setColor(bgColor);g2.fillRect(0, 0, width, height);StringBuffer sb = new StringBuffer();// 用来装载验证码上的文本for (int i = 0; i < len; i++) {// 设置画笔颜色 -- 随机// g2.setColor(new Color(255, 0, 0));g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150)));// 设置字体g2.setFont(new Font(fontNames[getRandom(0, fontNames.length)], Font.BOLD, fontSize));// 旋转文字(-45~+45)int theta = getRandom(-45, 45);g2.rotate(theta * Math.PI / 180, 7 + i * base, height - 8);// 写字String code = codes.charAt(getRandom(0, codes.length())) + "";g2.drawString(code, 7 + i * base, height - 8);sb.append(code);g2.rotate(-theta * Math.PI / 180, 7 + i * base, height - 8);}this.text = sb.toString();// 画干扰线for (int i = 0; i < len + 2; i++) {// 设置画笔颜色 -- 随机// g2.setColor(new Color(255, 0, 0));g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150)));g2.drawLine(getRandom(0, 120), getRandom(0, 30), getRandom(0, 120),getRandom(0, 30));}/*** 绘制边框*/// 设置边框的颜色
        g2.setColor(Color.GRAY);// 绘制边框g2.drawRect(0, 0, width-1, height-1);// 4.保存图片到指定的输出流try {ImageIO.write(this.img, "JPEG", outputStream);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}finally{// 5.释放资源
            g2.dispose();}}/*** 获取验证码字符串* @return*/public String getCode() {return this.text;}/** 生成随机数的方法*/private static int getRandom(int start, int end) {Random random = new Random();return random.nextInt(end - start) + start;}public static void main(String[] args) throws Exception {VerifyCode vc = new VerifyCode();vc.drawImage(new FileOutputStream("d:/vc.jpg"));System.out.println("执行成功~!");}
}

VerifyCode

在前台添加一个验证码的点击事件,当用户点击验证码时自动切换验证码

    // 为img标签添加一个点击事件$("#valiImage").click(function(){// 每次点击修改src属性的值,在后面拼接一个不同的参数// 获取当前时间的毫秒值表示var timeStr=new Date().getTime();// 将毫秒之直接拼接在url后面,保证每次点击url的值不同var url="/ValiImageServlet?time="+timeStr;// 使用生成的url给img标签的src属性赋值$("#valiImage").attr("src",url);});    

此时会请求后台处理逻辑 ValiImageServlet

package cn.bingou.web;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import cn.bingou.util.VerifyCode;public class ValiImageServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 1.接收请求// 2.调用工具类,生成验证码图片VerifyCode vc=new VerifyCode();// 3.将生成的验证码图片存入response实体中
        vc.drawImage(resp.getOutputStream());// 4.控制浏览器不要缓存验证码// 获取验证码字符串String text=vc.getCode();// 将生成的验证码文本输出到控制台System.out.println("text="+text);// 获取用户的Session对象HttpSession session=req.getSession();// 将正确的验证码文本传入Session作用域session.setAttribute("text", text);// 不要缓存验证码resp.setHeader("Pragma", "no-cache");resp.setHeader("Cache-Control", "no-cache");}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}}

后台ValiImageServlet将从VerifyCode得到的验证码图片和文字传输到前台,通过session作用域传递

前台点击提交表单按钮,表单信息将会传输到RegistServlet进行验证

package cn.bingou.web;import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import cn.bingou.util.JDBCUtils;
import cn.bingou.util.WebUtils;public class RegistServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 1.请求乱码问题// 请求乱码-POST请求req.setCharacterEncoding("utf-8");// 应答乱码问题resp.setContentType("text/html;charset=utf-8");// 2.接收表单参数String username = req.getParameter("username");String password = req.getParameter("password");String password2 = req.getParameter("password2");String nickname = req.getParameter("nickname");String email = req.getParameter("email");String valistr = req.getParameter("valistr");// 3.验证表单// 1)非空验证if(WebUtils.isEmpty(username)){ // 用户名为空验证// 向request作用域中添加错误提示信息req.setAttribute("errMsg", "用户名不能为空!");// 将请求转发给regist.jsp,forward():请求转发req.getRequestDispatcher("/regist.jsp").forward(req, resp);// 如果用户输入为空,直接返回return;}if(WebUtils.isEmpty(password)){ // 密码为空验证req.setAttribute("errMsg", "密码不能为空!");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}if(WebUtils.isEmpty(nickname)){ // 昵称为空验证req.setAttribute("errMsg", "昵称不能为空!");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}if(WebUtils.isEmpty(email)){ // 邮箱为空验证req.setAttribute("errMsg", "邮箱不能为空!");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}// 2)密码一致验证if(!password.equals(password2)){// 如果密码与确认密码不一样,则输出错误req.setAttribute("errMsg", "密码不一致");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}// 3)邮箱格式验证// abc@123.163.comString reg="^\\w+@\\w+(\\.\\w+)+$"; if(!email.matches(reg)){req.setAttribute("errMsg", "邮箱格式不符");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}// 4)用户名是否存在String sql1="select * from user where username=?";Connection conn = null;PreparedStatement ps = null;ResultSet rs=null;try {conn=JDBCUtils.getConnection();ps=conn.prepareStatement(sql1);ps.setString(1, username);rs=ps.executeQuery();while(rs.next()){ // 寻找用户名,直到找到为止req.setAttribute("errMsg", "用户名已存在");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException("验证用户名时数据库出现异常:"+e.getMessage());} finally{JDBCUtils.close(conn, ps, rs);}// 5)验证码验证if(WebUtils.isEmpty(valistr)){ // 验证码为空验证req.setAttribute("errMsg", "验证码不能为空!");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;} else{// 验证码不为空,执行验证码内容验证// 获取保存在session中的正确验证码HttpSession session=req.getSession(false);// 如果当前Session没有就为nullboolean flag=true; // 默认验证码没有问题if(session==null && session.getAttribute("text")==null){// 没有session对象,或者session中没有正确的验证码文本flag=false;}else{String text=(String) session.getAttribute("text");if(!valistr.equalsIgnoreCase(text)){// 用户输入的文本和正确文本不一致flag=false;}}if(flag==false){// 向request作用域中添加错误提示信息req.setAttribute("errMsg", "验证码错误");// 将请求转发给regist.jspreq.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}}// 4.数据存入数据库// 验证信息没有问题,将用户提交的注册信息提交到数据库String sql2="insert into user values(null,?,?,?,?)";Connection conn2=null;PreparedStatement ps2=null;try {conn2=JDBCUtils.getConnection();ps2=conn2.prepareStatement(sql2);ps2.setString(1, username);ps2.setString(2, password);ps2.setString(3, nickname);ps2.setString(4, email);ps2.executeUpdate();int i=ps2.executeUpdate();if(i>0){// 保存成功-提示成功信息,定时刷新到首页resp.getWriter().write("<h1 style='text-align:center;color:red'>恭喜您,注册成功!3秒后自动跳转首页</h1>");// 实现定时刷新resp.setHeader("refresh", "3;url="+req.getContextPath()+"/index.jsp");}else{req.setAttribute("errMsg", "注册出现异常,请稍后重试...");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException("注册数据出现异常:"+e.getMessage());} finally{JDBCUtils.close(conn2, ps2, rs);}}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}}

转载于:https://www.cnblogs.com/chuijingjing/p/9744587.html

6.后台验证码-session作用域相关推荐

  1. dede后台验证码错误或不显示的解决办法

    用v56之前版权include/vdimgck.php覆盖现在的文件,测试可行,不过验证码样式就回到以前版本的,喜欢新版的朋友可能会不舒服. 我们打开data/safe/inc_safe_config ...

  2. 前端调用后台验证码接口

    前端调用后台验证码接口 首先我们后台验证码用hutool包的工具类 引入依赖 <dependency><groupId>cn.hutool</groupId>< ...

  3. php session域,tp5 Session作用域问题

    做我的博客的时候,突然发现一个问题. 比如我登陆了后台,也登陆了前台,因为前后台存入session的时候,没有指定作用域.退出后台登录时使用session(null)对session清除的话,前后台的 ...

  4. vdimgck.php不显示,织梦后台验证码不显示解决方案

    织梦后台验证码不显示解决方案 1.找到include 下面的 vdimgck.php 找到 if(function_exists("imagejpeg")) 在前面加上ob_cle ...

  5. dedecms织梦系统后台验证码图片不显示的解决方法

    dedecms织梦系统后台验证码图片不显示的解决方法 参考文章: (1)dedecms织梦系统后台验证码图片不显示的解决方法 (2)https://www.cnblogs.com/afish/p/40 ...

  6. dede 验证码不显示 vdimgck.php,Dede后台验证码不显示解决方法详解(dedecms 5.7)

    本地与服务器上安装了dedecms5.7无法显示验证码,一般这种情况很少见,一般情况就是服务器设置问题,还有临时目录的权限问题. Dede后台验证码不显示或不正常分三种情况,下面来逐一分析 Dede后 ...

  7. ie浏览器框架不显示_thinkphp框架下后台验证码不显示

    刚刚在搭建网站遇到thinkphp框架下一个网站后台验证码无法显示,经过百度,谷歌研究,最后群求官方帮助文件发现是 输出之前是否有任何的输出(尤其是UTF8的BOM头信息输出):(打开验证码文件为乱码 ...

  8. setInterval定时连接后台防止session失效

    每隔一段时间用ajax连接一次后台激活session防止session时间过长而失效: Code: <script type="text/javascript"> // ...

  9. session作用域_看完这篇Bean的作用域与生命周期,问到面试官不敢问-乐字节java...

    Bean的作用域与生命周期 Bean的作用域 默认情况下,我们从Spring容器中拿到的对象均是单例的,对于bean的作用域类型如下: singleton 作用域 注意: lazy-init是懒加载, ...

  10. Dede后台验证码不显示解决方法详解

    1检查看看有没有开启gd,用<?php phpinfo();?>检查. 2在include/common.inc.php打开错误报告error_reporting(E_ALL); // 报 ...

最新文章

  1. 并行博弈树搜索算法-第6篇 百花齐放:各种并行Alpha-Beta算法
  2. Android中的数据存储方式
  3. lua之弱引用table
  4. 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)
  5. package javax.servlet.jsp.tagext does not exist的错误消息如何解决
  6. flume流程之SpoolDir-memory-hdfs
  7. 12. Laravel 4 迁移数据填充
  8. unity项目对音效的优化处理
  9. 五子棋java_Java五子棋小游戏完整源代码
  10. matlab中低通滤波器程序,MATLAB低通滤波器程序
  11. JsDroid2开发教程
  12. java 一对多、多对多关系示例
  13. 惊闻企业Web应用生成平台 活字格 V4.0 免费了,不单可视化设计器免费,服务器也免费!...
  14. 什么情况下PMP可自学?
  15. c语言实现数字华容道编程,【JIONEY】掌控版+遥传感器 实现数字华容道小游戏...
  16. 下雨天为何会让人安心
  17. 阿里云物联网平台产品架构与优势
  18. Linux nslookup命令
  19. js在html中加文字走马灯特效,JS实现文字的走马灯效果
  20. npm cnpm yarn 淘宝镜像

热门文章

  1. 用python做一个飞机大战(一)
  2. ORACLE执行计划学习总结
  3. 阿里员工爆出最好用的python库推荐!!--random随机数生成【原文附代码】
  4. linux创建sudo用户组,如何将用户添加到sudo组
  5. 同一服务器中,同一框架下的不同二级域名之间网站session如何互通
  6. AlphaGo设计师黄士杰:“最强的学习技能在人类的脑袋里”
  7. 身份证号码编码规则及校验位校验算法
  8. [leetcode]剑指offer(C++版题解)
  9. 解决微信端无法使用window.open打开文件的问题
  10. 3、RDA8910(4GCAT1)CSDK二次开发:GPIO输入详解