- 浏览: 23540 次
- 性别:
- 来自: 深圳
最新评论
<h3>带有验证码的登录页面</h3>
< form action="servlet/LogonFormServlet" method="post">
用户名:<input type="text" name="name"><br>
密码:<input type="password" name="pass"><br>
验证码:<input type="text" name="check_code">
< img src="servlet/CheckCodeServlet"><br>
< input type="submit" value="登录">
< /form>
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("验证码通过,服务器正在校验用户名和密码!");
}
}
转载:http://blog.csdn.net/mr_walter/article/details/7878267
< form action="servlet/LogonFormServlet" method="post">
用户名:<input type="text" name="name"><br>
密码:<input type="password" name="pass"><br>
验证码:<input type="text" name="check_code">
< img src="servlet/CheckCodeServlet"><br>
< input type="submit" value="登录">
< /form>
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("验证码通过,服务器正在校验用户名和密码!");
}
}
转载:http://blog.csdn.net/mr_walter/article/details/7878267
发表评论
-
启动Tomcat启动不了,报以下错:Error listenerStart解决方法
2016-09-04 15:35 498启动Tomcat启动不了,报以下错: org.apach ... -
java自定义标签库的开发
2016-04-08 17:45 0java自定义标签库的开发 :http://www.360 ... -
sitemesh技术的应用
2016-03-23 13:55 490sitemesh技术的应用 ... -
java爬虫gecco监控来了,不再裸奔
2016-03-21 15:05 0java爬虫gecco监控来了,不再裸奔 爬虫为什么要监控 ... -
Eclipse快捷键 10个最有用的快捷键
2016-03-12 16:28 0Eclipse中10个最有用的快捷键组合 一个Eclip ... -
JAVA 注解的几大作用及使用方法详解
2016-01-13 15:26 0JAVA 注解的几大作用及使用方法详解(2013- ... -
java内存溢出分析
2016-01-12 18:03 412用jmap生产dump文件,win通过任务管理器查看to ... -
java垃圾回收
2016-01-12 13:42 469 -
java内存泄露
2016-01-12 10:19 0用Eclipse Memory Analyzer查找内存泄露: ... -
计算机网络
2016-01-11 17:12 0计算机网络体系结构:http://henu-zyy.iteye ... -
spring MVC
2016-01-11 15:59 0国际化、本地化及Spring MVC 的设计:http://c ... -
服务器缓存技术
2016-01-11 11:45 0缓存使用与设计系列文章--目录:http://carlosfu ... -
java JFrame关闭窗口最大化功能
2015-06-18 10:05 2083如是JFrame框架,直接设置: JFrame jf = ne ... -
一些JAVA代码功能的相关链接
2015-06-18 09:04 0spring集成quartz任务调度: http://aton ... -
jsp页面静态化例子
2015-06-17 11:20 728连接:http://konglx.iteye.com/blog ... -
JFrame实现窗体在屏幕边缘靠边隐藏
2015-06-16 14:30 1120用JAVA swing做一个项目,类似QQ实现靠边隐藏的代码记 ... -
如何在JAVA程序中注册热键
2015-06-08 17:37 634http://walsece.iteye.com/blog/1 ... -
DB2锁表信息
2015-06-01 18:24 493查看数据库锁表信息 ----查询数据库锁表信息 db2 &qu ... -
转:apache安装后no service install解决办法
2015-05-31 17:01 545以下是解决步骤: 1、找到 apache2 目录下的 ... -
在 WebSphere JDBC Adapter 中如何避免死锁和锁超时
2015-05-30 15:40 632在 WebSphere JDBC Adapter 中 ...
相关推荐
JavaWeb 使用Session实现一次性验证码功能是指在JavaWeb应用程序中使用Session机制来实现一次性验证码功能,这种方法可以有效地防止机器人和恶意用户对网站的攻击。下面是该功能的详细实现过程: 一、验证码的生成...
通过Session案例分析一次性验证码登录是指通过使用Session来实现一次性验证码登录的机制。该机制主要通过在Servlet中生成验证码,并将验证码的数据保存在Session中,用户提交验证码后,从Session中取出验证码,并...
本项目提供的“javaweb简单的一次性验证码”是一个基于Servlet实现的简单验证码系统,旨在帮助初学者理解验证码的工作原理及其在Web应用中的应用。 验证码的主要目的是防止恶意机器人或爬虫进行自动化注册、登录或...
在IT行业中,尤其是在网络安全和身份验证领域,手机验证码是一种常用的技术手段,用于确保用户的身份真实性。在本场景中,我们将探讨如何使用Java编程语言来实现手机验证码的发送,以及涉及的相关知识点。 首先,...
通过以上步骤,我们可以使用JSP技术实现一个基本的图形验证码系统。然而,随着技术的发展,验证码也在不断进化,例如滑动验证、点击验证等新型验证码方式,以平衡用户体验和安全性。因此,开发者应持续关注验证码...
生成的验证码字符串应该存储在一个临时或者session级别的变量中,以便后续的验证。 在用户输入验证码后,前端会将输入的值与服务器保存的验证码进行比较。如果匹配成功,验证通过;否则,提示用户重新输入。这通常...
### Java使用SSM框架实现登录页面的验证码功能 在现代Web开发中,为了增强网站的安全性,防止自动化脚本攻击,通常会在用户登录时加入验证码功能。本文将详细介绍如何使用SSM(Spring、SpringMVC、MyBatis)框架来...
本教程将详细解释如何使用Servlet技术来实现一个动态的验证码功能,包括点击验证码后更换新的验证码以及验证码的验证过程。 一、Servlet基础 Servlet是Java EE中用于处理HTTP请求的服务器端组件。它接收客户端...
验证码通常用于区分人类用户与计算机程序,通过完成一个简单的人工可解但机器难以自动完成的任务来验证用户身份。 验证码有多种类型,如图像验证码、滑动验证码、点击验证码、音频验证码等。在这个项目中,我们将...
5. **验证用户输入**:当用户输入验证码并提交时,Struts2会调用另一个Action来验证用户输入的验证码是否与session中的验证码匹配。如果匹配,允许用户继续操作;如果不匹配,则提示用户重新输入。 6. **处理重试和...
- **一次性使用**:每次验证后,应清除session中的旧验证码,生成新的验证码。 7. **优化** - **缓存控制**:通过设置HTTP响应头,避免浏览器缓存验证码图像,确保每次请求都得到新的验证码。 - **可访问性**:...
2. **验证码生成**: 验证码可以是随机生成的一串数字或字母组合,也可以通过复杂的算法生成,如基于时间的一次性密码(TOTP)或哈希函数。生成的验证码需要存储在一个安全的地方,以便后续校验。 3. **邮件模板**: ...
【JSP验证码实现详解】 验证码(CAPTCHA)是一种防止机器自动操作的安全机制,它通过让用户输入图片或音频中显示的随机字符来验证用户是否为真实的人。在JSP(JavaServer Pages)中实现验证码,我们可以利用Java的...
- **会话(Session)**:为了保持验证码的一次性,我们需要将其存储在用户的会话中。在Java中,`HttpSession`对象可以用来保存数据,并关联到特定的客户端会话。当用户提交表单时,服务器会检查会话中的验证码是否...
4. **防止重复提交**:为了增加安全性,可以设置验证码一次有效,即用户输入验证码后,无论是否正确,都会立即清除session中的验证码,防止恶意用户多次尝试。 5. **优化用户体验**:验证码的设计应考虑用户体验,...
为了安全起见,生成验证码后应存储在服务器的会话(Session)或者缓存中,以便后续验证。 5. **发送请求**:使用SDK封装好的方法,将手机号和验证码作为参数发送给短信服务提供商。发送过程中,可能需要处理网络...
验证码是一种常见的身份验证机制,广泛应用于手机应用和网站中,以确保用户操作的安全性。本文将深入探讨如何使用Java、C#和PHP编程语言来实现手机发送验证码的功能,并结合相关Demo进行详细解释。 首先,我们要...
例如,对于更高级的安全性,你可以考虑使用无状态验证码(如基于时间的一次性密码TOTP)或图像识别验证码(如谷歌的reCAPTCHA)。同时,记得对用户输入进行适当的验证和清理,防止SQL注入等安全问题。
- 验证码过期策略,比如用户多次输入错误后,强制更换验证码。 - 考虑可访问性,提供音频验证码供视觉障碍者使用。 - 使用更复杂的干扰元素,防止OCR工具自动识别。 通过以上步骤,我们可以成功地在JSP中实现中文...
3. **验证码实现**: - 在Python中,可以使用第三方库如`PIL`(Python Imaging Library)或`opencv-python`来绘制和扭曲字符。 - Java中,可使用`Java.awt`和`java.awt.image`包创建图形验证码,或利用第三方库如`...