带有验证码的登录页面

用户名:

密码:

验证码:

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.ImageIO;

public class CheckCodeServlet extends HttpServlet

{

private static int WIDTH=60;

private static int HEIGHT=20;

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException

{

HttpSession session = request.getSession();

response.setContentType("image/jpeg");

ServletOutputStream sos=response.getOutputStream();

//设置浏览器不要缓存此图片

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires",0);

//创建内容图片并获得其图形上下文

BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);

Graphics g=image.getGraphics();

//产生随机的验证码

char[] rands=generateCheckCode();

//产生图像

drawBackground(g);

drawRands(g,rands);

//结束图像的绘制过程,完成图像

g.dispose();

//将图像输出到客户端

ByteArrayOutputStream bos=new ByteArrayOutputStream();

ImageIO.write(image,"JPEG",bos);

byte[] buf=bos.toByteArray();

response.setContentLength(buf.length);

//下面的语句也可以写成:bos.writeTo(sos);

sos.write(buf);

bos.close();

sos.close();

//将当前验证码存入到session中

session.setAttribute("check_code",new String(rands));

}

private char[] generateCheckCode()

{

//定义验证码的字符表

String chars="0123456789abcdefghijklmnopqrstuvwxyz";

char[] rands=new char[4];

for(int i=0;i<4;i++)

{

int rand=(int)(Math.random()*36);

rands[i]=chars.charAt(rand);

}

return rands;

}

private void drawRands(Graphics g,char[] rands)

{

g.setColor(Color.BLACK);

g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

//在不同的高度上输出验证码的每个字符

g.drawString(""+rands[0],1,17);

g.drawString(""+rands[1],16,15);

g.drawString(""+rands[2],31,87);

g.drawString(""+rands[3],46,16);

System.out.println(rands);

}

private void drawBackground(Graphics g)

{

//画背景

g.setColor(new Color(0xDCDCDC));

g.fillRect(0,0,WIDTH,HEIGHT);

//随即产生120个干扰点

for(int i=0;i<120;i++)

{

int x=(int)(Math.random()*WIDTH);

int y=(int)(Math.random()*HEIGHT);

int red=(int)(Math.random()*255);

int green=(int)(Math.random()*255);

int blue=(int)(Math.random()*255);

g.setColor(new Color(red,green,blue));

g.drawOval(x,y,1,0);

}

}

}

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class LogonFormServlet extends HttpServlet

{

public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException

{

response.setContentType("text/html;charset=GB2312");

PrintWriter out=response.getWriter();

HttpSession session=request.getSession(false);

if(session==null)

{

out.println("验证码处理问题!");

return ;

}

String savedCode=(String)session.getAttribute("check_code");

if(savedCode==null)

{

out.println("验证码处理问题!");

return ;

}

String checkCode=request.getParameter("check_code");

if(!savedCode.equals(checkCode))

{

/*验证码未通过,不从session中清楚原来的验证码,

以便用户可以后退回登录页面继续使用原来的验证码进行登录*/

out.println("验证码无效!");

return ;

}

/*验证码检查通过后,从session中清楚原来的验证码,

以防用户后退回登录页面继续使用原来的验证码进行登录*/

session.removeAttribute("check_code");

out.println("验证码通过,服务器正在校验用户名和密码!");

}

}

分享到:

2009-01-07 15:14

浏览 1237

评论

1 楼

wenniuwuren

2012-04-01

不能显示图片..

java session验证码_利用session实现一次性验证码相关推荐

  1. java captcha 验证码_利用开源组件制作验证码 Captcha

    jsp验证码制作 介绍两个功能强大的开源制作验证码组件SimpleCaptcha,JCAPTCHA. 1.配置 将下载的jar文件放置工程的lib目录下,打开工程的web.xml文件加上相应的配置 C ...

  2. java invoke 泛型_利用Java反射机制和泛型,全自动解析json

    有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去 ...

  3. 验证码识别 java 深度学习_使用深度学习识别验证码注解

    前言 在抓取一些网站的时候难免会遇到一些验证码.想起去年接触过一段时间的验证码识别技术,所以把之前使用的开源的cnn识别再拿出来做个注解.加深理解,也方便以后的使用.希望能对大家有所帮助! 正文 网上 ...

  4. java 发送邮件昵称_利用JavaMail发送QQ邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  5. java post 注册_利用JAVA发送POST请求(垃圾注册就是这么产生的) | 学步园

    大伙都知道利用JAVA的net包的URL类和 URLConnection可以得到网页源代码(这个应该是蜘蛛程序的锥形吧),但是向网页发送数据怎么办呢,GET请求很好处理,直接在网址后面加参数就可以了, ...

  6. java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...

  7. java 实现网络通信_利用Java怎么样实现网络通信功能

    利用Java怎么样实现网络通信功能 发布时间:2020-11-20 15:19:04 来源:亿速云 阅读:72 作者:Leah 利用Java怎么样实现网络通信功能?相信很多没有经验的人对此束手无策,为 ...

  8. java jmap 分析_利用java虚拟机的工具jmap分析java内存情况

    有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...

  9. java jstack 死锁_利用jstack检测死锁DeadLock

    首先,制造一个死锁程序如下: public class testJstack { final static Object obj_1 = new Object(); final static Obje ...

最新文章

  1. React 虚拟Dom 转成 真实Dom 实现原理
  2. 2019以太坊开发者及应用峰会(北京)
  3. Windows Phone 7 cs页面添加样式
  4. MLPerf发布首个AI芯片推理测试排行榜:阿里平头哥含光800获得多项第一
  5. [android] 异步http框架与实现原理
  6. VTK:可视化之PointSize
  7. Oracle的package(包)
  8. c# 笔记 数据类型转换 数组 函数
  9. unity全栈开发是什么意思_unity游戏公司面试问题总结
  10. java 拷贝文件夹的实现
  11. 为iPhone 12上市做准备,台积电月底前投产A14 Bionic芯片
  12. 基于JAVA+SpringMVC+Mybatis+MYSQL的快递预取件查询系统
  13. 我心目中的支付宝架构
  14. 四种负载均衡技术大比拼
  15. CocosCreator编辑器界面
  16. 贝叶斯公式的直观理解(先验概率/后验概率)
  17. 在线解方程的计算机,解方程计算器在线使用 方程计算器如何在线使用
  18. 【教程】如何批量制作线刷包和卡刷包
  19. samba端口号修改_samba 端口号(samb端口号)
  20. 基于线性回归的员工离职率预测

热门文章

  1. ASP.NET mvc 自定义验证和Filter过滤器传参
  2. SharePoint 网站元素介绍
  3. [MySQL FAQ]系列 -- MySQL支持绑定到多个ip上吗
  4. Oracle真实世界数据链——将现实世界和区块链世界相互打通——让主流币爆涨十倍的项目
  5. JavaScript速记
  6. 在Oracle中IMP导入数据时,如何解决目标数据库字符不一致问题
  7. 普通程序员如何转向AI方向(转)
  8. linux基础命令学习
  9. windows 2008+Oracle 11g R2 故障转移群集配置
  10. 《Python编程从入门到实践》学习笔记3:列表