java登录验证码(框架版)

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);
   }
   
}

3.生成的图像和随机字母传到登录的页面上

验证码:
				     //输入验证码的框,后期需要验证
				      //跳到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("验证码输入错误,请重新填写");
	    		}
	    	}
	    })
  }

4.最后一步进入后台验证我们输入的验证码是否正确
@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");
			
		}
	}

最后的样子就是这样的

java登录验证码(框架版)_第1张图片



你可能感兴趣的:(jquery,java后台)