1.生成验证码图片(Servlet)

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; 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; /**
* Servlet implementation class VerifyCode
*/
@WebServlet("/VerifyCode")
public class VerifyCode extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public VerifyCode() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 首先设置浏览器不缓存
response.setHeader("cache-control", "no-cache");
response.setHeader("Expire", "-1"); // >0为缓存
response.setHeader("pragma", "no-cache");
// 存储正确的验证码
String vali_code = "";
String Vali_str = "abcdefghijklmnopqrstuvwsyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Color[] colors =
{ Color.BLACK, Color.RED, Color.BLUE };
// 1.创建图像
int width = 110, height = 40;
int x_offset = 5, y_offset = 28;
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
// 2.创建画布
Graphics2D g = img.createGraphics();
// 3.为画布添加背景颜色为亮灰色
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, width, height);//fillRect是包括矩形框内部
// 4.为画布添加边框
g.setColor(Color.BLUE);
g.drawRect(0, 0, width - 1, height - 1);//drawRect是绘制矩形边框
// 5.绘制干扰线
for (int i = 0; i < 10; i++)
{
g.setColor(new Color(randNum(0, 255), randNum(0, 255), randNum(0, 255)));
g.drawLine(randNum(0, width), randNum(0, height), randNum(0, width), randNum(0, height));
}
g.setFont(new Font("黑体", Font.BOLD, 20));
for (int i = 0; i < 4; i++)
{
int r = randNum(-180, 180);
String code = Vali_str.charAt(randNum(0, Vali_str.length() - 1)) + "";
g.rotate(r / 180 * Math.PI);
g.setColor(colors[randNum(0, colors.length)]);
g.drawString(code, x_offset + i * 30, y_offset);
g.rotate(-r / 180 * Math.PI);
vali_code += code;
} //将验证码的内容存储在HttpSession中
HttpSession session = request.getSession();
session.setAttribute("Valicode", vali_code); // 通过response的输出流打给浏览器
ImageIO.write(img, "jpg", response.getOutputStream());
}
private Random random = new Random();
//随机生成begin和end之间的一个int值
private int randNum(int begin, int end)
{
return random.nextInt(end - begin) + begin;
}
}

2.JSP显示验证码

 <input type="text" placeholder="输入验证码" name="ValiImage" id="ValiImage" /><!-- 输入验证码文本 -->
<img src="VerifyCode" onclick="changeValiImage(this)"><!-- 验证码图片 --> <script type="text/javascript"> function changeValiImage(img){
img.src = "VerifyCode?time=" + new Date().getTime();//刷新
} </script>

3.进行用户输入和正确验证码的比对

我在LoginServlet中

//1 获得用户输入的验证码
String verifyCode = request.getParameter("ValiImage");
//2 获得服务器session 存放数据 ,如果没有返回null
String sessionCacheData = (String) request.getSession().getAttribute("Valicode");
// *将服务器缓存session数据移除
request.getSession().removeAttribute("Valicode");
// ** 判断服务器是否存在
if(sessionCacheData == null){
request.setAttribute("message", "请不要重复提交");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
//3 比较
if(! sessionCacheData.equalsIgnoreCase(verifyCode)){
//用户输入错误
// * 存放request作用域
request.setAttribute("message", "验证码输入错误");
// * 请求转发
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
//接登录方法...

最新文章

  1. 【20161203-20161208】清华集训2016滚粗记&amp;&amp;酱油记&amp;&amp;游记
  2. .Net组件程序设计之远程调用(二)
  3. C#设计模式系列:备忘录模式(Memento)
  4. ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &#39;type=InnoDB&#39; at line 7
  5. Ajax 的缺点
  6. 提高开发效率的 Eclipse 实用操作
  7. 根据引用jar包路径查找原JAR包
  8. Oracle游标使用详解
  9. Swift中的异常处理
  10. PTA_输入符号及符号个数打印沙漏(C++)
  11. 为Owin项目增加WebApi
  12. Git 将本地库添加到远程仓库
  13. requests库(爬虫)
  14. M2postmortem
  15. 使用 LaTeX 画图系列
  16. 【论文笔记】使用SPSS 进行 T Test (T检验)
  17. HDU1272小希的迷宫–并查集
  18. jdk 11特性
  19. Oracle中文乱码解决办法总结
  20. Servlet / Tomcat / Spring 之间的关系

热门文章

  1. MySQL-16-主从复制进阶
  2. Java ArrayList【笔记】
  3. DHCP服务-自动管理IP地址和分配固定IP
  4. 007 GMII、SGMII和SerDes的区别和联系
  5. 并发编程 Process 互斥锁
  6. NOIP 模拟 $24\; \rm graph$
  7. 离线安装VS Code Server
  8. Linux centos 安装 mysql 5.6
  9. Python - 面向对象编程 - 实例方法、静态方法、类方法
  10. vue 中this.$on 为什么要放在created中?