Ⅰ java如何实现验证码验证功能
Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢?
Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线。
首先,写一个验证码生成帮助类,用来绘制随机字母:
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.Random;
importjavax.imageio.ImageIO;
publicfinalclassGraphicHelper{
/**
*以字符串形式返回生成的验证码,同时输出一个图片
*
*@paramwidth
*图片的宽度
*@paramheight
*图片的高度
*@paramimgType
*图片的类型
*@paramoutput
*图片的输出流(图片将输出到这个流中)
*@return返回所生成的验证码(字符串)
*/
publicstaticStringcreate(finalintwidth,finalintheight,finalStringimgType,OutputStreamoutput){
StringBuffersb=newStringBuffer();
Randomrandom=newRandom();
BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphicsgraphic=image.getGraphics();
graphic.setColor(Color.getColor("F8F8F8"));
graphic.fillRect(0,0,width,height);
Color[]colors=newColor[]{Color.BLUE,Color.GRAY,Color.GREEN,Color.RED,Color.BLACK,Color.ORANGE,
Color.CYAN};
//在"画板"上生成干扰线条(50是线条个数)
for(inti=0;i<50;i++){
graphic.setColor(colors[random.nextInt(colors.length)]);
finalintx=random.nextInt(width);
finalinty=random.nextInt(height);
finalintw=random.nextInt(20);
finalinth=random.nextInt(20);
finalintsignA=random.nextBoolean()?1:-1;
finalintsignB=random.nextBoolean()?1:-1;
graphic.drawLine(x,y,x+w*signA,y+h*signB);
}
//在"画板"上绘制字母
graphic.setFont(newFont("ComicSansMS",Font.BOLD,30));
for(inti=0;i<6;i++){
finalinttemp=random.nextInt(26)+97;
Strings=String.valueOf((char)temp);
sb.append(s);
graphic.setColor(colors[random.nextInt(colors.length)]);
graphic.drawString(s,i*(width/6),height-(height/3));
}
graphic.dispose();
try{
ImageIO.write(image,imgType,output);
}catch(IOExceptione){
e.printStackTrace();
}
returnsb.toString();
}
}
接着,创建一个servlet,用来固定图片大小,以及处理验证码的使用场景,以及捕获页面生成的验证码(捕获到的二维码与用户输入的验证码一致才能通过)。
importjava.io.OutputStream;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
@WebServlet(urlPatterns="/verify/regist.do")
{
=3398560501558431737L;
@Override
protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获得当前请求对应的会话对象
HttpSessionsession=request.getSession();
//从请求中获得URI(统一资源标识符)
Stringuri=request.getRequestURI();
System.out.println("hello:"+uri);
finalintwidth=180;//图片宽度
finalintheight=40;//图片高度
finalStringimgType="jpeg";//指定图片格式(不是指MIME类型)
finalOutputStreamoutput=response.getOutputStream();//获得可以向客户端返回图片的输出流
//(字节流)
//创建验证码图片并返回图片上的字符串
Stringcode=GraphicHelper.create(width,height,imgType,output);
System.out.println("验证码内容:"+code);
//建立uri和相应的验证码的关联(存储到当前会话对象的属性中)
session.setAttribute(uri,code);
System.out.println(session.getAttribute(uri));
}
}
接着写一个HTML注册页面用来检验一下:
<html>
<head>
<metacharset="UTF-8">
<title>注册</title>
<linkrel="stylesheet"href="styles/general.css">
<linkrel="stylesheet"href="styles/cell.css">
<linkrel="stylesheet"href="styles/form.css">
<scripttype="text/javascript"src="js/ref.js"></script>
<styletype="text/css">
.logo-container{
margin-top:50px;
}
.logo-containerimg{
width:100px;
}
.message-container{
height:80px;
}
.link-container{
height:40px;
line-height:40px;
}
.link-containera{
text-decoration:none;
}
</style>
</head>
<body>
<divclass="containerform-container">
<formaction="/wen/regist.do"method="post">
<divclass="form"><!--注册表单开始-->
<divclass="form-row">
<spanclass="cell-1">
<iclass="fafa-user"></i>
</span>
<spanclass="cell-11"style="text-align:left;">
<inputtype="text"name="username"placeholder="请输入用户名">
</span>
</div>
<divclass="form-row">
<spanclass="cell-1">
<iclass="fafa-key"></i>
</span>
<spanclass="cell-11"style="text-align:left;">
</span>
</div>
<divclass="form-row">
<spanclass="cell-1">
<iclass="fafa-keyboard-o"></i>
</span>
<spanclass="cell-11"style="text-align:left;">
<inputtype="password"name="confirm"placeholder="请确认密码">
</span>
</div>
<divclass="form-row">
<spanclass="cell-7">
<inputtype="text"name="verifyCode"placeholder="请输入验证码">
</span>
<spanclass="cell-5"style="text-align:center;">
<imgsrc="/demo/verify/regist.do"onclick="myRefersh(this)">
</span>
</div>
<divclass="form-row"style="border:none;">
<spanclass="cell-6"style="text-align:left">
<inputtype="reset"value="重置">
</span>
<spanclass="cell-6"style="text-align:right;">
<inputtype="submit"value="注册">
</span>
</div>
</div><!--注册表单结束-->
</form>
</div>
</body>
</html>
效果如下图:
当点击刷新页面的时候,验证码也会随着变化,但我们看不清验证码时,只要点击验证码就会刷新,这样局部的刷新可以用JavaScript来实现。
在<img
src="/demo/verify/regist.do">中,添加一个问号和一串后缀数字,当刷新时让后缀数字不断改变,那么形成的验证码也会不断变化,我们可以采用的一种办法是后缀数字用date代替,date获取本机时间,时间是随时变的,这样就保证了刷新验证码可以随时变化。
代码如下:
functionmyRefersh(e){
constsource=e.src;//获得原来的src中的内容
//console.log("source:"+source);
varindex=source.indexOf("?");//从source中寻找?第一次出现的位置(如果不存在则返回-1)
//console.log("index:"+index);
if(index>-1){//如果找到了?就进入内部
vars=source.substring(0,index);//从source中截取index之前的内容(index以及index之后的内容都被舍弃)
//console.log("s:"+s);
vardate=newDate();//创建一个Date对象的一个实例
vartime=date.getTime();//从新创建的Date对象的实例中获得该时间对应毫秒值
e.src=s+"?time="+time;//将加了尾巴的地址重新放入到src上
//console.log(e.src);
}else{
vardate=newDate();
e.src=source+"?time="+date.getTime();
}
}
如回答不详细可追问
Ⅱ java怎么开通短信验证码登录功能
实现jiava短信验证码可以按下面的步奏进行:
1、首先,找到一个支持Java语言的接口短信平台。
2、接着下载接口文档,和自己的开发平台进行对接。
3、注意在对接之前测试一下短信的速度,一旦对接好想换就比较麻烦,之前就吃过这个亏,最后有个朋友介绍我去短信网。
4、如果要购买的话,一定要多测试几家。
如果在碰到有疑问的地方一定要和技术或者客服多多沟通。
Ⅲ java里怎么发验证码到邮箱,然后登陆邮箱获取验证码请高手指点,尽量具体些。。。
邮箱验证分几种,
最简单的是直接发送验证码:验证码随机产生,可以放到cookie里,限制有效时版间就是cookie的存活时权间。产生之后和发送邮件一样直接发送到邮箱。当用户验证的时候直接从cookie里拿到验证码进行比较。
还有一种是验证链接。在链接里要放一个验证参数,这个参数包括用户名或用户id,创建时间,验证码。当然都要用某种方法去加密,当用户点击这个链接的时候,根据相应的方法解密获得参数。这个可以放到一张动态表里,表中有验证码和对应的用户名或id。当用户要求验证的时候从数据库中拿到验证码,根据链接中的时间判断是否过期。验证成功后删除本条数据即可。如果链接只能使用一次,那么在根据用户名拿到数据之后不管验证是否成功都要删除数据
Ⅳ 用java编写登陆界面要求有用户名,密码和验证码的输出,下面是登录和取消
importjava.util.Scanner;
publicclassLogon{
='青';
privatestaticfinalintpassword=123;
privatestaticfinalScannersan=newScanner(System.in);
publicstaticvoidmain(String[]args){
chariname;
intipass;
System.out.print("请输入用户名:");
iname=san.next().charAt(0);
System.out.print("请输入密码:");
ipass=san.nextInt();
if(Logon.username==iname&&Logon.password==ipass){
System.out.println("欢迎你,"+Logon.username);
}else{
System.out.println("对不起,你不是"+Logon.username);
}
}
}
Ⅳ java登录模块验证出现问题求解答
前期准备
首先要先明确有个大体的思路,要实现什么样的功能,了解完成整个模块要运用到哪些方面的知识,以及从做的过程中去发现自己的不足。技术方面的进步大都都需要从实践中出来的。
功能:用户注册功能+系统登录功能+生成验证码
知识:窗体设计、数据库设计、JavaBean封装属性、JDBC实现对数据库的连接、验证码(包括彩色验证码)生成技术,还有就些比如像使用正则表达式校验用户注册信息、随机获得字符串、对文本可用字符数的控制等
设计的模块预览图:
使用BoxLayout布局,将控件排列方式设置从上至下:
复制代码代码如下:
contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.PAGE_AXIS));
窗体使用了标签、文本域、密码域和按钮等控件
实现代码:
public class login extends JFrame{
private static final long serialVersionUID = -4655235896173916415L;
private JPanel contentPane;
private JTextField usernameTextField;
private JPasswordField passwordField;
private JTextField validateTextField;
private String randomText;
public static void main(String args[]){
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable(){
public void run(){
try{
login frame=new login();
frame.setVisible(true);
}catch(Exception e){
e.printStackTrace();
}
}
});
}
public login(){
setTitle("系统登录");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane=new JPanel();
setContentPane(contentPane);
contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.PAGE_AXIS));
JPanel usernamePanel=new JPanel();
contentPane.add(usernamePanel);
JLabel usernameLable=new JLabel("u7528u6237u540DuFF1A");
usernameLable.setFont(new Font("微软雅黑", Font.PLAIN, 15));
usernamePanel.add(usernameLable);
usernameTextField=new JTextField();
usernameTextField.setFont(new Font("微软雅黑", Font.PLAIN, 15));
usernamePanel.add(usernameTextField);
usernameTextField.setColumns(10);
JPanel passwordPanel = new JPanel();
contentPane.add(passwordPanel);
JLabel passwordLabel = new JLabel("u5BC6 u7801uFF1A");
passwordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 15));
passwordPanel.add(passwordLabel);
passwordField = new JPasswordField();
passwordField.setColumns(10);
passwordField.setFont(new Font("微软雅黑", Font.PLAIN, 15));
passwordPanel.add(passwordField);
JPanel validatePanel = new JPanel();
contentPane.add(validatePanel);
JLabel validateLabel = new JLabel("u9A8Cu8BC1u7801uFF1A");
validateLabel.setFont(new Font("微软雅黑", Font.PLAIN, 15));
validatePanel.add(validateLabel);
validateTextField = new JTextField();
validateTextField.setFont(new Font("微软雅黑", Font.PLAIN, 15));
validatePanel.add(validateTextField);
validateTextField.setColumns(5);
randomText = RandomStringUtils.randomAlphanumeric(4);
CAPTCHALabel label = new CAPTCHALabel(randomText);//随机验证码
label.setFont(new Font("微软雅黑", Font.PLAIN, 15));
validatePanel.add(label);
JPanel buttonPanel=new JPanel();
contentPane.add(buttonPanel);
JButton submitButton=new JButton("登录");
submitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
do_submitButton_actionPerformed(e);
}
});
submitButton.setFont(new Font("微软雅黑", Font.PLAIN, 15));
buttonPanel.add(submitButton);
JButton cancelButton=new JButton("退出");
cancelButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
do_cancelButton_actionPerformed(e);
}
});
cancelButton.setFont(new Font("微软雅黑",Font.PLAIN,15));
buttonPanel.add(cancelButton);
pack();// 自动调整窗体大小
setLocation(com.lixiyu.util.SwingUtil.centreContainer(getSize()));// 让窗体居中显示
}
窗体居中显示:
public class SwingUtil {
/*
* 根据容器的大小,计算居中显示时左上角坐标
*
* @return 容器左上角坐标
*/
public static Point centreContainer(Dimension size) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();// 获得屏幕大小
int x = (screenSize.width - size.width) / 2;// 计算左上角的x坐标
int y = (screenSize.height - size.height) / 2;// 计算左上角的y坐标
return new Point(x, y);// 返回左上角坐标
}
}
1.2获取及绘制验证码
public class CAPTCHALabel extends JLabel {
private static final long serialVersionUID = -963570191302793615L;
private String text;// 用于保存生成验证图片的字符串
public CAPTCHALabel(String text) {
this.text = text;
setPreferredSize(new Dimension(60, 36));// 设置标签的大小
}
@Override
public void paint(Graphics g) {
super.paint(g);// 调用父类的构造方法
g.setFont(new Font("微软雅黑", Font.PLAIN, 16));// 设置字体
g.drawString(text, 5, 25);// 绘制字符串
}
}
*彩色验证码:
public class ColorfulCAPTCHALabel extends JLabel {
private static final long serialVersionUID = -963570191302793615L;
private String text;// 用于保存生成验证图片的字符串
private Color[] colors = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
Color.PINK, Color.RED, Color.WHITE, Color.YELLOW };// 定义画笔颜色数组
public ColorfulCAPTCHALabel(String text) {
this.text = text;
setPreferredSize(new Dimension(60, 36));// 设置标签的大小
}
@Override
public void paint(Graphics g) {
super.paint(g);// 调用父类的构造方法
g.setFont(new Font("微软雅黑", Font.PLAIN, 16));// 设置字体
for (int i = 0; i < text.length(); i++) {
g.setColor(colors[RandomUtils.nextInt(colors.length)]);
g.drawString("" + text.charAt(i), 5 + i * 13, 25);// 绘制字符串
}
}
}
1
Ⅵ 用java怎么制作验证码
验证方法很多
蠢一点的后台写代码,或者前台页面加js
当然你用框架自带的也行,例如struts的
Ⅶ java短信验证码如何验证
先创建一个验证码,通过短信代理发送到用户指定的手机,待用户提交后做对比,看验证码是否一致。
整体流程:
用户输入手机号码,点击获取验证码
服务器创建验证码,并通过短信代理商发送到用户手机
用户查看验证码,输入提交
服务器进行确认,反馈成功或者失败。
Ⅷ java模拟登陆(突破了验证码)怎么拿验证码跟用户名、密码一起post登陆网站
没有通用方法抄,网站稍微做袭点手脚你原来的方法就失效了。
===========================补充=======================
不是说安全设置问题,只要它把登录网站页面中的表单元素名字一改,你所有工作就白费了啊。对方很容易做的。你又得重头来。
你非要试一下,有2种方法,一是直接在提交url后附加表单各元素,不过服务器可能要检查,不一定行。
第二你自己做个假页面,与提交表单内容一致,你用js自己填元素值,自动提交。