文档章节

Struts实现验证码

lindaliving
 lindaliving
发布于 2014/06/01 20:26
字数 515
阅读 18
收藏 0
点赞 0
评论 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
广州
程序员
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

MyEclipse 2017 整合SSH三大框架 到登录功能的实现(附源码)

本来以为学完Java EE之后用个三大框架没什么难度,结果昨天搭环境就搞了一晚上,还是靠室友找了半天才找出错误在哪,为了避免重复踩坑,而且目前网上用myeclipse2017做环境的教程还是蛮少的,...

xp731574722 ⋅ 03/02 ⋅ 0

企业未修复Apache Struts 2漏洞致Web服务器被批量入侵

  0×1 概述   腾讯御见威胁情报中心监控发现,近期有大批企业网站的Web服务器遭到入侵并被植入挖矿木马。   安全人员分析发现被攻击网站服务器多存在Apache Struts 2 Jakarta Multipa...

FreeBuf ⋅ 04/29 ⋅ 0

[Struts]Token 使用及原理

Struts Token 使用 1,先在一个Action中,调用saveToken(HttpServletRequest request)方法。然后转向带有表单的JSP页面。 2,在JSP页面提交表单给一个Action,再这个Action中进行是否为重复提...

thinkyoung ⋅ 2014/12/17 ⋅ 0

Java 模板引擎 Beetl 2.8.0 发布,增加根对象支持

Java 模板引擎 Beetl 2.8.0 发布了,改进内容包括: #348 beetl 默认配置DefaultTemplateEngine #347 增加根对象支持 #346 允许设置全局 ClassLoader #345 支持struts2.5, 由于struts升级不...

闲大赋 ⋅ 04/23 ⋅ 0

SSH (Struts2+Spring3.0+Hibernate3)框架(一) 理论

  典型的J2EE三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层...

thinkyoung ⋅ 2014/12/17 ⋅ 0

开源产业不断发展,软件安全问题亟需得到关注

近日 Sonatype 发布了“2018年开源安全与风险分析”报告,该报告显示开源应用有大幅增长,在检测的应用中有96%包含开源组件,同时包含漏洞的软件数量也在不断增加。随着开源产业不断发展,目...

雨田桑 ⋅ 05/18 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

闲谈“如何优化SSH框架的项目”

使用struts框架的好处之一就是所有action类继承一个基类,将访问控制在基类中处理.2.所有的action类都继承自baseaction,一个资源对应一个action类. 1.实现一个继承自struts的action的baseact...

thinkyoung ⋅ 2014/12/30 ⋅ 0

spring+springMvc+struts的SSH框架整合

小疯之前工作用的框架是o3w,SSH框架只是学习的时候用过,然后今天就回头来重新回顾SSH,就在网上找了一篇比较全而且比较简单的文章来帮助自己快速的理解SSH。 1.建立一个web项目 2.导入SSH...

野小疯 ⋅ 05/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 56分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 今天 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 12

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部