在我们做web相关的项目时,用户登录的页面是必不可少的,在用户进行页面登录时,除了用户名和密码外,我们一般情况下都会去生成一个验证码来,让用户输入用户名和密码的同时输入验证码来进行用户的登录,在这里我们为什么一般要使用验证码呢?其实道理很简单,就是防止黑客的“暴力”登录,在用户没有使用验证码的时候,黑客可以通过不断的试探用户名和密码来进行系统的登录,使用验证码过后,由于验证码是随机生成的,所以黑客使用暴力的方式进行登录是基本不会成功的,下面就来说说怎么使用SSH的时候来生成随机验证码。
首先是书写一个生成随机验证码的类,其实这个类的实现是比较简单的,当然对于初学者或没有书写过验证码的人来说还是有那么点难度的。这个类的名字是AuthImg.java,由于使用的是Structs2进行页面与逻辑之间的转换,所以继承了Struct2的ActionSupport类。具体代码如下:
package com.ebuy.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 验证码类
* @author kjgj
*
*/
public class AuthImg extends ActionSupport{
//设置图片验证码的字符串的字体和大小
private Font mfont = new Font("Arial Black", Font.PLAIN, 16);
//生成随机颜色
Color getRandColor(int fc,int bc){
Random rand = new Random();
if(fc > 255){
fc = 255;
}
if(bc > 255){
bc = 255;
}
int r = fc + rand.nextInt(bc - fc);
int g = fc + rand.nextInt(bc - fc);
int b = fc + rand.nextInt(bc - fc);
return new Color(r, g, b);
}
public String execute() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
//防止页面缓存,保证生成的随机码都是新的
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//指定验证码图片大小
int width = 100,height = 18;
//生成一张新图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//在图片中绘制内容
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200, 250));
g.fillRect(1, 1, width-1, height-1);
g.setColor(new Color(102, 102, 102));
g.drawRect(0, 0, width-1, height-1);
g.setFont(mfont);
//随机生成线条,使图片看起来更加杂乱
g.setColor(getRandColor(160, 200));
for(int i = 0; i < 155;i++){
int x = random.nextInt(width - 1);
int y = random.nextInt(height -1);
int x1 = random.nextInt(6) + 1;
int y1 = random.nextInt(12) + 1;
g.drawLine(x, y, x+x1, y+y1);
}
for(int j = 0;j < 70;j++){
int x = random.nextInt(width - 1);
int y = random.nextInt(height -1);
int x1 = random.nextInt(12) + 1;
int y1 = random.nextInt(6) + 1;
g.drawLine(x, y, x-x1, y-y1);
}
//用于保存生成的随机字符串
String sRand = "";
for(int k = 0;k < 6;k++){
//取得一个随机字符
String tmp = getRandomChar();
sRand += tmp;
//将生成的随机字符串添加到验证码图片上
g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110)));
g.drawString(tmp, 15*k+10, 15);
}
//取得用户session
HttpSession session = request.getSession(true);
//将生成的随机码放到session中
session.setAttribute("rand", sRand);
g.dispose();
//输出验证码图片
ImageIO.write(image, "JPEG", response.getOutputStream());
return null;
}
//生成随机字符串的方法
private String getRandomChar(){
int rand = (int)Math.round(Math.random()*2);
long ltmp = 0;
char ctmp = '\u0000';
//根据rand的值来生成一个大\小写字母,数字
switch(rand){
//生成大写字母
case 1:
ltmp = Math.round(Math.random() * 25 + 65);
ctmp = (char)ltmp;
return String.valueOf(ctmp);
//生成小写字母
case 2:
ltmp = Math.round(Math.random() * 25 + 97);
ctmp = (char)ltmp;
return String.valueOf(ctmp);
//生成数字
default:
ltmp = Math.round(Math.random() * 9);
return String.valueOf(ltmp);
}
}
}
Structs2的配置文件structs.xml的配置如下:
<constant name="struts.objectFactory" value="spring"></constant>
<package name="demo" extends="struts-default">
<action name="authImg" class="authImg">
<result>/welcome.jsp</result>
</action>
</package>
spring的配置文件applicationContext.xml的配置如下:
<bean id="authImg" class="com.ebuy.util.AuthImg" />
进行展示的welcome.jsp页面的实现如下:
验证码如图:<img alt="" src="authImg.action" id="authImg">看不清楚?<a href="#" onclick="refersh()">单击此处刷新</a>
<script type="text/javascript">
//刷新验证码
function refersh(){
alert("av");
document.getElementById("authImg").src='authImg.action?now=' +(new Date()).getTime();
}
</script>
以上就是实现一个验证码的主要过程
Structs2实现随机验证码的过程
猜你喜欢
转载自357029540.iteye.com/blog/2203536
今日推荐
周排行