java后台做的验证码图片,算是比较方便的一种了,今天正好在新搭的框架里写了,使用的非常完美,哈哈,话不多说,开始上代码
1.登录界面进入controller层
//生成登录验证码
@RequestMapping("createCode")
public void createCode(HttpServletRequest request,HttpServletResponse response) throws IOException{
//通知浏览器不要缓存
response.setHeader("Expires","-1");//控制缓存的失效日期
response.setHeader("Cache-Control","no-cache");//必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求
response.setHeader("Pragma","-1");
CaptchaUtil util=CaptchaUtil.Instance();
// 将验证码输入到session中,用来验证
String code=util.getString();
request.getSession().setAttribute("code",code);
// 输出到web页面
ImageIO.write(util.getImage(), "jpg", response.getOutputStream());
}
2.进入生成验证码的处理类
package com.lq.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
* 验证码生成工具
* @author df
*
*/
public class CaptchaUtil {
private BufferedImage image;//图像
private String str;//验证码
private static char code[] ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789".toCharArray();
public static final String SESSION_CODE_NAME="code";
private CaptchaUtil(){
init();// 初始化属性
}
//取得RandomNumUtil实例
public static CaptchaUtil Instance(){
return new CaptchaUtil();
}
//取得验证码图片
public BufferedImage getImage(){
return this.image;
}
//取得图片的验证码
public String getString(){
return this.str;
}
private void init() {
// 在内存中创建图象
int width=85,height=20;
BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g =image.getGraphics();
// 生成随机类
Random random=new Random();
//设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for(int i=0;i<155;i++){
int x=random.nextInt(width);
int y=random.nextInt(height);
int x1=random.nextInt(12);
int y1=random.nextInt(12);
g.drawLine(x, y, x+x1, y+y1);
}
// 取随机产生的认证码(4位数字)
String sRand="";
for(int i=0;i<4;i++){
String rand=String.valueOf(code[random.nextInt(code.length)]);
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13*i+6, 16);
}
this.str=sRand;
// 图象生效
g.dispose();
this.image=image;/* 赋值图像 */
}
public Color getRandColor(int fc,int bc){
Random random=new Random();
if(fc>255)
fc=255;
if(bc>255)
bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
}
验证码:
//输入验证码的框,后期需要验证
//跳到Controller层createCode方法里获取随机数和图片
4点击加载出来的图片开始切换验证码
//点击改变验证码
function refresh(){
//$("#basePath").val()+
var url="/Spring-MVC-model/basextgl/createCode?number="+Math.random();//这里没有随机参数的话就只进两次后台就再也不进了,这个现在还不太明白为什么
$("#img").attr("src",url);
}
现在为止验证码加载出来了,就差登录的时候验证了
<%-- --%>
function LoginDate(){
var code=$("#code").val();
$.ajax({
url:"/Spring-MVC-model/login/cheklogin",
type:"post",
async:false,
data:{code":code},
success:function(data){
if(data=="1"){
alert("登录成功");
//window.location.href="/Spring-MVC-model/basextgl/topMain"
window.location.href="/Spring-MVC-model/basextgl/indexMethod"
}else if(data=="2"){
$("#error").text("验证码输入错误,请重新填写");
}
}
})
}
@RequestMapping("/cheklogin")
public void cheklogin(String username, String password,String code,
HttpServletRequest request, HttpServletResponse response)
throws IOException {
PrintWriter out = response.getWriter();
HttpSession session=request.getSession();
//取出存在session的随机数字
String codeSession=(String)session.getAttribute("code");
//StringUtils是JDK提供的String类型操作方法的补充,并且是null安全的(即如果输入参数String为null则不会抛出NullPointerException,而是做了相应处理
/*if (StringUtils.isEmpty(codeSession)) {
log.error("没有生成验证码信息");
throw new IllegalStateException("ERR-01000");
}
if (StringUtils.isEmpty(code)) {
log.error("未填写验证码信息");
throw new BussinessException("ERR-06018");
} */
//检查验证码
String strCode="";
if(codeSession.equalsIgnoreCase(code)){//忽略大小写
strCode="1";
}else{
strCode="2"
}
//验证通过才成功
if(strCode.equals("1")){
out.print("1");
}else{
out.print("2");
}
}
最后的样子就是这样的