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