java web中验证码生成的demo
首先创建一个CaptailCode类
package com.xiaoqiang.code; import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse; /**
* 验证码工具类
*/
public class CaptailCode {
/**
* 验证码生成
* @param response
* @return
*/
public static String drawImage(HttpServletResponse response)
{ //定义以字符串拼接的StringBuilder
StringBuilder stringBuilder=new StringBuilder();
//准备产生4个字符串的随机数
for (int i = 0; i <4; i++) {
stringBuilder.append(randomChar());
}
String code=stringBuilder.toString(); //2:定义图片的宽度和高度
int width = 70;
int height = 25;
//简历bufferedImage对象,制定图片的长度和宽度以及色彩
BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
//3:获取到 Graphics2D 绘制对象,开始绘制验证码
Graphics2D g = bi.createGraphics();
//4:设置文字的字体和大小
Font font = new Font("微软雅黑",Font.PLAIN,20);
//设置字体的颜色
Color color = new Color(0,0,0);
//设置字体
g.setFont(font);
//设置颜色
g.setColor(color);
//设置背景
g.setBackground(new Color(226,226,240));
//开始绘制对象
g.clearRect(0,0,width,height);
//绘制形状,获取矩形对象
FontRenderContext context = g.getFontRenderContext();
Rectangle2D bounds = font.getStringBounds(code,context);
//计算文件的坐标和间距
double x = (width - bounds.getWidth())/2;
double y = (height - bounds.getHeight())/2;
double ascent = bounds.getY();
double baseY = y - ascent;
g.drawString(code,(int)x,(int)baseY);
//结束绘制
g.dispose();
try {
ImageIO.write(bi,"jpg",response.getOutputStream());
//刷新响应流
response.flushBuffer();
}catch(Exception ex){
ex.printStackTrace();
} return code;
}
private static char randomChar()
{ //定义验证码需要的字母和数字
String string="QWERTYUIOPASDFGHJKLZXCVBNM123456";
//定义随机对象
Random random=new Random();
return string.charAt(random.nextInt(string.length()));
} public static void main(String[] args) {
System.out.println(drawImage(null));
}
}
再创建一个code.jsp文件
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018\7\31 0031
Time: 20:29
To change this template use File | Settings | File Templates.
--%>
<%@ page import="com.xiaoqiang.code.CaptailCode" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//清空浏览器缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setHeader("expires", "0");
String code=CaptailCode.drawImage(response);
session.setAttribute("code", code);
//解决outputStream()问题
out.clear();
out = pageContext.pushBody();
%>
在index.jsp中显示验证码
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018\7\31 0031
Time: 18:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>java验证码</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"> </head>
<body>
<a href="javascript:void(0);" onclick="changeCode()"><img src="code.jsp" alt="" id="code"></a>
<script>
function changeCode()
{
document.getElementById("code").src="code.jsp?d="+new Date();
}
</script> </body>
</html>
一个完整的验证码实例demo已经搞定了。
href="#"与href="javascript:void(0)"的区别
# 包含了一个位置信息,默认的锚是#top 也就是网页的上端。
而javascript:void(0), 仅仅表示一个死链接。
在页面很长的时候会使用 # 来定位页面的具体位置,格式为:# + id。
如果你要定义一个死链接请使用 javascript:void(0) 。
pushBody()的作用是保存当前的out对象,并更新PageContext中Page范围内Out对象。至于为什么要加上这句话,是因为JSP容器在处理完成请求后会调用releasePageConter方法释放所有的PageContestObject,并且同时调用getWriter方法。由于getWriter方法与在JSP页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,解决方法就是楼上给的一样,只需要在JSP页面的最后加上这两条语句。
out.clear();
out = pageContext.pushBody();
java web中验证码生成的demo的更多相关文章
- web页面 验证码 生成
web页面 验证码 生成 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kapt ...
- JAVA WEB 中的编码分析
JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...
- Java Web 中使用ffmpeg实现视频转码、视频截图
Java Web 中使用ffmpeg实现视频转码.视频截图 转载自:[ http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html ...
- 【中文乱码】深入分析 Java Web 中的中文编码问题
深入分析 Java Web 中的中文编码问题 1.几种常见的编码格式 1.1 为什么要编码 在计算机中存储信息的最小单元是 1 个字节,即 8 个 bit, 所以能表示的字符范围是 0 ~ 255 个 ...
- Java Web 中 过滤器与拦截器的区别
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...
- Java web中常见编码乱码问题(一)
最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...
- Java web中常见编码乱码问题(二)
根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析: 2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...
- 深入分析Java Web中的编码问题
编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...
- 解决java web中safari浏览器下载后文件中文乱码问题
解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...
随机推荐
- win10优化
1. 关闭磁盘碎片整理.自动维护计划任务 磁盘C-属性–工具–对驱动器进行优化和碎片整理–优化–更改设置–取消选择按计划运行 2. 关闭Windows Defender 控制面板–Wind ...
- kali-通过获取路由器pin码套取无线网络密码shell脚本
直接上脚本吧, 我做个笔记. #************************************************************************* # > Fil ...
- ASP.NET Core开发总结
1.关于浏览器缓存,修改CSS文件和Javascript文件后调试,浏览器不更新问题,解决办法是在link标签和script标签引用的文件名后面添加版本信息如下: <link rel=" ...
- python第一天2.28
2019年2月28日 今日内容大纲: 01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. 运行速度:飞机 内存:临时存储数据. 8g,16g, 运行速度:高铁 1,成 ...
- 三.SQL语句
一.mysqladmin客户端命令 1.查看MySQL存活状态 [root@db01 ~]# mysqladmin -uroot -p123 ping 2.查看MySQL状态信息 [root@db01 ...
- 彻底清除 Windows 服务
如果服务已经停止, 或从注册表中删除, 但是在任务管理器中仍能看到服务躺在列表里面. 只需要找到服务的PID, 然后运行命令: taskkill /PID 服务的PID /f 即可.
- Latex 经常见到的问题和解决方法
Latex 经常见到的问题和解决方法 2017-04-10 22:05:48 [资源下载]Texlive 2018 下载地址:http://mirror.lzu.edu.cn/CTAN/system ...
- Docker介绍及使用
什么是容器? 容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁.隔离的环境拥有自己的系统文件,ip地址,主机名等,kvm虚拟机,linux,系统文件 程序:代码,命令 进程:正在运行的程 ...
- PageRank算法实现
基本原理 在互联网上,如果一个网页被很多其他网页所链接,说明它受到普遍的承认和信赖,那么它的排名就高.这就是PageRank的核心思想. 引用来自<数学之美>的简单例子: 网页Y的排名应该 ...
- git commit -m 提交的内容换行
网上说只需要通过单引号来换行,一直没理解,后面终于试出来了.总结一句话就是. . 先输入第一个引号,按Enter即可换行,完成后再补齐后面的引号 // 步骤一: 输入第一行 git commit -m ...