RegisterServlet:检验server,client验证码是否一致

ImageServlet: 产生验证码

<!DOCTYPE html>
<html>
<head>
<title>Register.html</title> <script type="text/javascript">
function ChangeImage(img){
img.src=img.src+"?"+new Date().getTime(); }
</script>
</head> <body>
<form action="/NANA/servlet/RegisterServlet">
用户名:<input type="text" ><br />
密码:<input type="text"><br />
认证码:<input type="text" name="checkcode"><img alt="" src="/NANA/servlet/ImageServlet" onclick="ChangeImage(this)" alt="change" style="cursor:pointer"><br/>
<input type="submit" value="submit">
</form>
</body>
</html>

RegisterServlet:

public class RegisterServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String c_checkcode = request.getParameter("checkcode");
String s_checkcode = (String) request.getSession().getAttribute("checkcode"); if(c_checkcode!=null&&s_checkcode!=null&&c_checkcode.equals(s_checkcode)){
System.out.println("处理请求");
}else{ System.out.println("认证码错误");
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response);
} }

ImageServlet

public class ImageServlet extends HttpServlet {
private static final int WIDTH = 120;
private static final int HEIGHT = 25; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); setBackGround(g); setBorder(g); drawRandomLine(g); String random = drawRandmNumber((Graphics2D) g); // add into server checkcode
request.getSession().setAttribute("checkcode", random); response.setContentType("image/jpeg");
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
ImageIO.write(image, "jpg", response.getOutputStream());
} private String drawRandmNumber(Graphics2D g) {
// TODO Auto-generated method stub g.setColor(Color.RED);
g.setFont(new Font("宋体", Font.BOLD, 20)); StringBuffer sb = new StringBuffer();
int x = 5;
for (int i = 0; i < 4; i++) { int degree = new Random().nextInt() % 30; String num = (new Random().nextInt(10)) + "";
sb.append(num);
g.rotate(degree * Math.PI / 180, x, 20); g.drawString(num, x, 20); g.rotate(-degree * Math.PI / 180, x, 20); x += 30; }
return sb.toString(); } private void drawRandomLine(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.GREEN);
for (int i = 0; i < 5; i++) {
int x1 = new Random().nextInt(WIDTH);
int y1 = new Random().nextInt(HEIGHT); int x2 = new Random().nextInt(WIDTH);
int y2 = new Random().nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2);
}
} private void setBackGround(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
} private void setBorder(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.BLUE);
g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response);
} }

java_利用session校验图片认证码的更多相关文章

  1. 11-利用session校验图片认证码

    /****************************************************************产生随机验证码的servlet******************** ...

  2. 利用Session实现一次验证码

    Session可避免表单的重复提交:实现一次表单提交,可避免恶意提交: 1.首先建立一个Servlet类:ValidateColorServlet,里边有获取验证码的方法,并且验证码是大小写区分: p ...

  3. Android之利用正则表达式校验邮箱、手机号、密码、身份证号码等

    概述 现在Android应用在注册的时候基本会校验邮箱.手机号.密码.身份证号码其中一项或多项,特此收集了相关的正则表达式给大家分享.除了正则表达式,文章末尾提供Demo中有惊喜哦! 具体验证的图片效 ...

  4. 转: MAC认证码的说明

    转: http://blog.sina.com.cn/s/blog_4940e1fc01012vk3.html MAC(Message Authentication Code) 消息认证码(带密钥的H ...

  5. 发送邮箱验证码、session校验

    本篇主要描述“发送邮箱验证码.session校验”相关前(html\js)后(java)台代码,业务逻辑示例,闲话少诉,直接上代码. 1.引入的jar包是mail-1.4.jar 2.java底层发送 ...

  6. 29.密码学知识-消息认证码MAC-6——2019年12月19日

    1. 消息认证码 1.1 消息认证 消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC. 思考改进方案? 从哈希函数 ...

  7. 使用OCR来帮助LR实现认证码识别

    位字符或数字,如果不是继续刷新,从请求角度来说应该效率很理想了. Action() { int flen; //定义一个整型变量保存获得文件的大小 long filedes; //保存文件句柄 ]=& ...

  8. 基于Redis缓存的Session共享(附源码)

    基于Redis缓存的Session共享(附源码) 在上一篇文章中我们研究了Redis的安装及一些基本的缓存操作,今天我们就利用Redis缓存实现一个Session共享,基于.NET平台的Seesion ...

  9. 利用session防止表单重复提交

    转自:http://www.cnblogs.com/xdp-gacl/p/3859416.html 利用Session防止表单重复提交 对于[场景二]和[场景三]导致表单重复提交的问题,既然客户端无法 ...

随机推荐

  1. 基于VPN搭建混合云架构需要考虑的网络因素

     Joy Qiao from MSFT Wed, Jan 21 2015 8:44 AM 很多用户在搭建混合云架构时,会使用到微软Azure虚拟网络中的 VPN功能,来实现Azure中的虚拟网络与用户 ...

  2. apache开源项目--log4j

    Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等; ...

  3. NET下RabbitMQ实践[示例篇]

    在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容.         今天将会介绍如果使用rabbitmq进行简单的消息入队, ...

  4. HDU 5628 Clarke and math Dirichlet卷积+快速幂

    题意:bc round 72 中文题面 分析(官方题解): 如果学过Dirichlet卷积的话知道这玩意就是g(n)=(f*1^k)(n), 由于有结合律,所以我们快速幂一下1^k就行了. 当然,强行 ...

  5. qtp不识别树结构中的点击事件

    qtp不识别树结构中的点击事件,未生成该点击事件的脚本,解决办法: 1.未生成点击"auto分类c1"的脚本 2.点击1.对象库-2.添加对象库-3.选中对象-点击OK,即将该对象 ...

  6. 设计模式_Command_命令模式

    形象例子: 俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送 信息,她对我有什么指示,就写一张纸条让她弟弟带给我.这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了 ...

  7. LightOJ 1422 Halloween Costumes

    dp[i]][j]=min(dp[i+1][j]+1,dp[i+1][k-1]+dp[k][j]) 表示第i天到j的最小数量.如果第i天的衣服只自己穿的话,不考虑后面的就是dp[i][j]=dp[i+ ...

  8. HDU 3488--Tour(KM or 费用流)

    因为每个点只能经过一次 所以考虑拆点 这题有坑,有重边.. KM算法 把一个点拆成入点和出点 入点在X部,出点在Y步. 如果u,v之间有路径,就在X部的u点连接Y部的v点 求完美匹配. 当完美匹配的时 ...

  9. [Objective-c 基础 - 3.1] 内存管理

    A.内存存放.retain.release 1.栈内存:存放局部变量,运行超过变量作用域自后编译器自动回收 2.堆内存:存放对象(地址,对象实体) 3.对象的基本结构 (1)引用计数器(4字节):当计 ...

  10. UIKit: UIResponder(转自南峰子博客)

    有问题可以加本人QQ:564702640(验证:博客园) 我们的App与用户进行交互,基本上是依赖于各种各样的事件.例如,用户点击界面上的按钮,我们需要触发一个按钮点击事件,并进行相应的处理,以给用户 ...