Java登录生成验证码

**

Java登录时加减法验证码

Java登录生成验证码

**

jsp页面

<div class="input-wap last-child-wrap m-b-10">
<input type="text" class="form-control" name="validCode" style="width:68%;display:inline;"  
id="validCode" placeholder="请输入左侧的计算结果" maxlength="6"
 name="validCode"  onkeydown="nextFocus(1)">
		<label class="error"></label>
		<img id="img" alt="验证码" style="height:30px;float:right;width:30%;" 
		src="${ctx}/console/getCode?id='+Math.random();
		return false;"
		 class="code-img" onclick="getcode()">
</div>
        function getcode(){
     document.getElementById('img').src='${ctx}/console/getCode?id='+Math.random();
        return false;
        }

后台代码

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.common.exception.ServiceException;
import com.vanke.contants.GlobalConstant;
import com.vanke.mhj.console.common.vo.Json;
import com.vanke.mhj.console.common.vo.SessionInfo;
import com.vanke.mhj.console.monitor.service.LogService;
import com.vanke.mhj.console.monitor.thread.LogThread;
import com.vanke.mhj.console.monitor.vo.OperationLog;
import com.vanke.mhj.console.sys.service.ResourceService;
import com.vanke.mhj.console.sys.service.UserService;
import com.vanke.mhj.console.sys.vo.User;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

  @RequestMapping("/getCode")
    public void getCode(HttpServletRequest request, HttpServletResponse response) {
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        // 在内存中创建图象
        int width = 60, 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));
        // 画边框
        // g.setColor(new Color());
        // g.drawRect(0,0,width-1,height-1);
        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 155; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }
        // 定义数组存放加减乘四个运算符
        char[] arr = { '+', '-', '×' };
        // 生成10以内的随机整数num1
        int num1 = random.nextInt(10);
        // 生成一个0-4之间的随机整数operate
        int operate = random.nextInt(3);
        // 生成10以内的随机整数num2
        int num2 = random.nextInt(10);
        // 避免出现除数为0的情况
        if (operate == 3) {
            // 如果是除法,那除数必须不能为0,如果为0,再次生成num2
            while (num2 == 0) {
                num2 = random.nextInt(10);
            }
        }
        // 运算结果
        int result = 0;
        // 假定position值0/1/2/3分别代表”+”,”-“,”*”,”/”,计算前面操作数的运算结果
        switch (operate) {
            case 0:
                result = num1 + num2;
                break;
            case 1:
                result = num1 - num2;
                break;
            case 2:
                result = num1 * num2;
                break;
        }
        g.setColor(new Color(20 + random.nextInt(110),
                20 + random.nextInt(110), 20 + random.nextInt(110)));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
//		g.drawString("=", 48, 16);这是第1个字符的图片位置
//		g.drawString(num1 + "", 6, 16);这是第2个字符的图片位置
//		g.drawString(arr[operate] + "", 20, 16);这是第3个字符的图片位置
//		g.drawString(num2 + "", 38, 16);这是第4个字符的图片位置
//      下面参考上面的图片位置
        g.drawString(num1 + "", 6, 16);
        g.drawString(arr[operate] + "", 20, 16);
        g.drawString(num2 + "", 38, 16);
        g.drawString("=", 48, 16);

        // 将认证码存入SESSION
        String s = String.valueOf(result);
        HttpSession session = request.getSession();
        session.setAttribute("vCode", s);
        logger.info("验证码:" + s);
        // 图象生效
        g.dispose();
        ServletOutputStream sos = null;
        try {
            sos = response.getOutputStream();
            // 输出图象到页面
            ImageIO.write(image, "jpeg", sos);
        } catch (IOException e) {
            logger.error("创建***失败,msg:{}", e);
        } finally {
            try {
                if (sos != null) {
                    sos.close();
                }
            } catch (IOException e) {
                logger.error("创建***失败,msg:{}", e);
            }
        }

    }
// 给定范围获得随机颜色
 private 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);
    }

登录方法

@ResponseBody
    @RequestMapping("/login")
    public Json login(User user, HttpServletRequest request, HttpServletResponse response) {
        Json j = new Json();
        User sysuser;
        HttpSession session = request.getSession();
        SessionInfo sessionInfo = new SessionInfo();
        String loginname = request.getParameter("loginname");
        String vCode = (String) session.getAttribute("vCode");
        String password = request.getParameter("password");
        String validCode = request.getParameter("validCode");

        if ( StringUtils.isBlank(loginname) || StringUtils.isBlank(password)|| StringUtils.isBlank(validCode)
                ) {
            j.setMsg("用户名、密码、验证码不能为空!");
            //this.index( request);
            //this.getCode( request,  response);
            //session.invalidate();
            request.setAttribute(validCode,"");
            session.setAttribute(vCode,"");

        }
        else  if (vCode == null || validCode == null || !vCode.equals(validCode)) {

            j.setMsg("登录验证码不正确");
            //this.getCode( request,  response);
            //this.index( request);
            //session.invalidate();
            request.setAttribute(validCode,"");
            session.setAttribute(vCode,"");

        }
        else {
            try {

                sysuser = userService.login(user);
                j.setSuccess(true);
                sessionInfo.setId(sysuser.getId());
                sessionInfo.setLoginname(sysuser.getLoginname());
                sessionInfo.setPassword(password);
                sessionInfo.setUsername(sysuser.getUserName());
                sessionInfo.setOrgNo(sysuser.getOrgNo());
                sessionInfo.setOrgId(sysuser.getOrgId());
                sessionInfo.setAreaId(sysuser.getAreaId());
                sessionInfo.setRoleId(sysuser.getRoleId());
                sessionInfo.setRoleType(sysuser.getRoleType());
                sessionInfo.setResourceList(userService.listResource(sysuser.getId()));
                sessionInfo.setResourceAllList(resourceService.listAllResource());
                session.setAttribute(GlobalConstant.SESSION_INFO, sessionInfo);

                // 记录登录操作日志
                this.setOperationLog(request);
                j.setMsg("登录成功!");
            } catch (Exception e) {
                if (e instanceof ServiceException) {
                    j.setMsg(e.getMessage());
                } else {
                    j.setMsg("登录失败,请联系管理员!");
                }
                e.printStackTrace();
            }

        }
        return j;
    }

返回Json对象

public class Json implements java.io.Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 8722126593920041253L;

    private boolean success = false;

    private String msg = ConstantUtil.ERROR;

    private Object obj = null;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }
}