由于项目中用到了验证码,在网上找了一些示例,应用到了自己的项目中,还是只讲验证码忽略业务代码。
验证码本身和Ibtatis,Mybatis框架无关框架无关
1, 在struts2-Spring-Ibatis框架中使用验证码
-页面部分
<input value="" name="checkCode"/>
<!--若要点击图片刷新,重新得到一个验证码,要在后面加上个随机数,这样保证每次提交过去的都是不一样的path,防止因为缓存而使图片不刷新-->
<img src="<%=basePath%>publicUse/createImage.action" id="yzm" onclick="this.src='<%=basePath%>publicUse/createImage.action?'+ Math.random()" title="点击图片刷新验证码" style="width:90px;height:28px;vertical-align:middle;"/>
- struts配置文件部分
<!-- 验证码 -->
<action name="createImage" class="userLoginAction" method="createImage">
<result name="success" type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action>
-Action部分
private ByteArrayInputStream inputStream;
public String createImage() throws IOException{
HttpServletResponse response = this.getResponse();
// 设置浏览器不要缓存此图片
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
BufferedImage image = CreateImageUtil.drawImage();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpeg", outputStream);
ByteArrayInputStream input = new ByteArrayInputStream(outputStream
.toByteArray());
this.setInputStream(input);
input.close();
//强制刷新
outputStream.flush();
outputStream.close();
return SUCCESS;
}
- 工具类
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import org.apache.struts2.ServletActionContext;
public class CreateImageUtil {
private static int WIDTH = 90;
private static int HEIGHT = 28;
private static String createRandom(){
String str = "0123456789zxcvbnmasdfghjklqwertyuiop";
char[] rands = new char[4];
Random random = new Random();
for (int i = 0; i < 4; i++)
{
rands[i] = str.charAt(random.nextInt(36));
}
return new String(rands);
}
private static 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);
}
}
private static void drawRands(Graphics g, String rands)
{
g.setColor(Color.BLACK);
g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
// 在不同的高度上输出验证码的每个字符
g.drawString("" + rands.charAt(0), 1, 17);
g.drawString("" + rands.charAt(1), 16, 15);
g.drawString("" + rands.charAt(2), 31, 18);
g.drawString("" + rands.charAt(3), 46, 16);
System.out.println(rands);
}
public static BufferedImage drawImage(){
String rands = createRandom();
//将验证码放入Session
ServletActionContext.getRequest().getSession().setAttribute("checkCode", rands);
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 产生图像
drawBackground(g);
drawRands(g, rands);
// 结束图像 的绘制 过程, 完成图像
g.dispose();
return image;
}
}
- 效果
2, 在spring mvc-Mybatis框架中使用验证码
- 页面部分
<img src="<%=basePath%>tp/createImage.html" onclick="this.src='<%=basePath%>tp/createImage.html?'+ Math.random()" title="点击图片刷新验证码"
style="width:90px;height:28px;vertical-align:middle;"/>:
<input id="authcode" />
</tr>
- Controller部分
@RequestMapping("createImage")
public void createImage(HttpServletRequest request,
HttpServletResponse response,HttpSession session) throws IOException{
// 设置浏览器不要缓存此图片
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
BufferedImage image = CreateImageUtil.drawImage(session);
ImageIO.write(image, "jpeg", response.getOutputStream());
response.getOutputStream().flush();
}
- 工具类部分与上一个类似
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.servlet.http.HttpSession;
public class CreateImageUtil {
private static int WIDTH = 90;
private static int HEIGHT = 28;
private static String createRandom(){
String str = "0123456789asdfghjklzxcvbnmpoiuytrewq";
char[] rands = new char[5];
Random random = new Random();
for (int i = 0; i < 5; i++)
{
rands[i] = str.charAt(random.nextInt(36));
}
return new String(rands);
}
private static 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);
}
}
private static void drawRands(Graphics g, String rands)
{
g.setColor(Color.BLACK);
g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
// 在不同的高度上输出验证码的每个字符
g.drawString("" + rands.charAt(0), 1, 17);
g.drawString("" + rands.charAt(1), 16, 15);
g.drawString("" + rands.charAt(2), 31, 18);
g.drawString("" + rands.charAt(3), 46, 16);
g.drawString("" + rands.charAt(4), 56, 20);
System.out.println(rands);
}
public static BufferedImage drawImage(HttpSession session){
String rands = createRandom();
//将验证码放入Session
session.setAttribute("authcode", rands);
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 产生图像
drawBackground(g);
drawRands(g, rands);
// 结束图像 的绘制 过程, 完成图像
g.dispose();
return image;
}
}
- 效果
注:部分代码来自网络,另外这两种方式都是在项目中应用过的。不足之处请大家多多指教。