Struts2中验证码的生成技术

1.首先创建ImageCodeAction类

 package com.szy.bean.action;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Random;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * 验证码生成类
 * @author soft1
 *
 */
public class ImageCodeAction extends BaseAction{
    /**
     * 使用struts2的type=stream输出
     */
private InputStream inputStream;

public String execute(){
//step1:生成长60宽20的图片
BufferedImage image=new BufferedImage(60,20,BufferedImage.TYPE_INT_RGB);
//得到画笔
   Graphics g=image.getGraphics();
   //随机设置画笔颜色
   Random random=new Random();
   g.setColor(new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256)));
   //填充背景
   g.fillRect(0, 0, 60, 20);
   //设置画图颜色
   g.setColor(new Color(0,0,0));
   //随机生成六位数字
   String s=random.nextInt(999999)+"";
   //将生成的数字放入session中
   session.put("imageCode", s);
   //将数字画到图片上
   g.drawString(s, 5, 15);
   //画干扰线
   g.drawLine(random.nextInt(50), random.nextInt(45), 0, random.nextInt(74));
   g.drawLine(random.nextInt(50), random.nextInt(64), random.nextInt(64), 0);
   g.drawLine(random.nextInt(50), 0, random.nextInt(34),random.nextInt(34));
   g.drawLine(0, random.nextInt(50), random.nextInt(64), random.nextInt(69));
   // step2.将图片赋值给imageStream属性
ByteArrayOutputStream bos = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
try {
//将图片压缩成jpeg格式
encoder.encode(image);
//将图片从bos中取出赋值给inputStream
byte[] bytes=bos.toByteArray();//图片信息
inputStream =new ByteArrayInputStream(bytes);
return "success";
} catch (Exception e) {
e.printStackTrace();

return "success";
}


public InputStream getInputStream() {
return inputStream;
}


public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}


}
===========================================================================================================

2.配置struts.xml配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
         <package name="user"  extends="dang-default"  namespace="/User">
                 <!-- 验证码 -->
                 <action name="imageCode"   class="com.szy.bean.action.ImageCodeAction">
                       <result  name="success" type="stream">
                             <!-- 输出的参数 -->
                             <param name="inputStream"></param>
                       </result>
                 </action>
         </package>
</struts>

===========================================================================================================

3.在test.jsp页面中进行测试

==========================================================================================================
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  
  <body>
    <img  src="/DangNet/User/imageCode"  id="num">
    <a href="javascript:;" οnclick="document.getElementById('num').src = '/DangNet/User/imageCode?'+(new Date()).getTime()">换一张</a>
  </body>
</html>

================================================================================================================
注意: 其中DangNet为工程名
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值