文档章节

Struts实现验证码

lindaliving
 lindaliving
发布于 2014/06/01 20:26
字数 515
阅读 19
收藏 0
 import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

//定义一个工具人,用于产生验证码图片
public class SecurityCode {
 public static final int WIDTH = 100;
 public static final int HEIGHT = 25;
 public static String checkstring ;
 
 //得到验证码的BtyArrayInputStream流
 public static ByteArrayInputStream getImageAsInputStream() 
 {
  BufferedImage image = getRandomImage();
  return convertImageToStream(image);
 }
 
 //得到验证码图片
 public static BufferedImage getRandomImage() {
  BufferedImage randomImage = new BufferedImage(WIDTH, HEIGHT,
    BufferedImage.TYPE_INT_RGB);
  Graphics g = randomImage.getGraphics();
  setBackground(g);
  setBorder(g);
  paintLine(g);
  checkstring = setRandomString((Graphics2D) g);
  
  g.dispose();
  return randomImage;
 }
 //设置边框
 private static void setBorder(Graphics g) {
  g.setColor(Color.WHITE);
  g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
 }
 //随机数
 private static String setRandomString(Graphics2D g) {
  StringBuilder sb = new StringBuilder();
  g.setFont(new Font("宋体", Font.BOLD, 22));
  String randomString = "abcdefghijkmnpqrstuvwsyz23456789";
  for (int i = 0; i < 4; i++) {
   g.setColor(Color.red);
   int x = 20 * i + 10;
   String str = randomString.charAt(new Random().nextInt(randomString
     .length())) + "";
   sb.append(str);
   int roll = new Random().nextInt() % 30;
   g.rotate(roll * Math.PI / 180, x, 20);
   g.drawString(str, x, 20);
   g.rotate(-roll * Math.PI / 180, x, 20);
  }
  return sb.toString();
 }
 //画干扰线
 private static void paintLine(Graphics g) {
  g.setColor(Color.GREEN);
  for (int i = 0; i < 5; i++) {
   int x1 = new Random().nextInt(WIDTH);
   int y1 = new Random().nextInt(HEIGHT);
   int x2 = new Random().nextInt(WIDTH);
   int y2 = new Random().nextInt(HEIGHT);
   g.drawLine(x1, y1, x2, y2);
  }
 }
 //设置背景颜色
 private static void setBackground(Graphics g) {
  // TODO Auto-generated method stub
  g.setColor(Color.WHITE);
  g.fillRect(0, 0, WIDTH, HEIGHT);
 }
 
 //将image验证码转化成字节数组输入流
 private static ByteArrayInputStream convertImageToStream(BufferedImage image) {
  ByteArrayInputStream inputStream = null;
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(bos);
  try {
   jpeg.encode(image);
   byte[] bts = bos.toByteArray();
   inputStream = new ByteArrayInputStream(bts);
  } catch (ImageFormatException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return inputStream;
 }
}

//写一个Action类,用于接收请求,并且回送验证码图片
public class SecurityCodeImageAction extends ActionSupport implements
  SessionAware {
 private Map<String,Object> session;
 private ByteArrayInputStream imageStream;
 
 @Override
 public String execute() throws Exception{
  
  imageStream = SecurityCode.getImageAsInputStream();
  String securityCode = SecurityCode.checkstring;
  session.put("checkstring", securityCode);
  
  return SUCCESS;
 }
 
 public ByteArrayInputStream getImageStream() {
  return imageStream;
 }

 public void setImageStream(ByteArrayInputStream imageStream) {
  this.imageStream = imageStream;
 }

 public Map<String, Object> getSession() {
  return session;
 }

 @Override
 public void setSession(Map<String, Object> session) {
  // TODO Auto-generated method stub
  this.session = session;
 }

}

//最后配置Struts.xml文件即可
<!-- 验证码映射 -->
  <action name ="SecurityCodeImageAction" class= "com.web.service.SecurityCodeImageAction">
   <result name="success" type="stream">
    <param name="contentType">image/jpeg</param>
    <param name="inputName">imageStream</param>
    <param name="bufferSize">2048</param>
   </result>
  </action>

本文转载自:

共有 人打赏支持
lindaliving
粉丝 1
博文 10
码字总数 3043
作品 0
广州
程序员
私信 提问
Struts2+jquery 以ajax方式 实现jsp跟后台交互

功能:利用struts2+ajax从后台获取数据,并且数据以json格式传递 必备组建:struts2,juqery,struts2 json 插件 步骤: 1.ation应该继承 ActionSupport package com.thtf.lotterymanager.index....

lhsqjoe
2013/09/13
0
0
struts2跟struts1的区别

1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,...

长平狐
2013/01/06
43
0
ST2-045 For POC

转载请注明: 转载自Legend‘s BLog 本文链接地址: ST2-045 For POC 利用方法: 漏洞说明: Apache Struts 2被曝存在远程命令执行漏洞,漏洞编号S2-045,CVE编号CVE-2017-5638,在使用基于J...

apachecn_飞龙
2017/03/18
0
0
MVC 框架 - Apache Struts

Struts 是 Apache软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web...

匿名
2008/09/07
0
8
Struts 2再曝远程代码执行漏洞S2-037

导读 今年4月份,Apache Stuts 2之上发现的S2-033远程代码执行漏洞,以迅雷不及掩耳之势席卷而来。其利用代码很快就在短时间内迅速传播。而且官方针对这个高危漏洞的修复方案还是无效的。 悲...

linuxprobe
2016/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

hanlp在Python环境中的安装失败后的解决方法

Hanlp是由一系列模型与算法组成的javag工具包,目标是普及自然语言处理再生环境中的应用。有很多人在安装hanlp的时候会遇到安装失败的情况,下面就是某大神的分享的在python环境中安装失败的...

左手的倒影
15分钟前
0
0
【更新】Infragistics Ultimate UI for WPF v18.2(二):分类图

下载Infragistics Ultimate UI for WPF最新版本 Infragistics Ultimate UI for WPF是一款提供高速的网格和图表,轻松创建仿Office应用程序的WPF界面框架,从广度和深度两方面使得开发者在缩短...

电池盒
15分钟前
0
0
android沉浸式状态栏封装—教你玩出新花样

项目中我们有时候都要用的透明状态栏(这里也成沉浸式状态栏),今天介绍一个gyf-dev写的一个封装状态栏开源框架 效果图如下: 正文 从Android4.4开始,才可以实现状态栏着色,并且从5.0开始...

终端研发部
16分钟前
0
0
Java关键字之transient、native

transient Java中提供Serilizable接口,实现该接口的对象就可以被序列化。如果这个类的有些属性不需要被序列化,使用transient关键修饰字段即可。 native native关键字说明其修饰的方法是一个...

勇敢的飞石
18分钟前
0
0
canal 修改mysql数据后Java客户端无反应的问题解决方案

canal client例子: package com.study.canal;import java.net.InetSocketAddress;import java.util.List;import com.alibaba.otter.canal.client.CanalConnector;import com.al......

xtof
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部