JAVA用户登录图形验证码

时间:2021-08-05
本文章向大家介绍JAVA用户登录图形验证码,主要包括JAVA用户登录图形验证码使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

摘要: 由于公司需要做一个监控系统,然后需要一个简单的登录页面,所以就需要一个简单的登录并需要验证,所以就在网上查了一下简单的验证码制作,废话不多说,代码如下:

1.pom引用

<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>

2.配置参数代码

@Component
public class KaptchaConfig {
@Bean(name="captchaProducer")
public DefaultKaptcha getDefaultKaptcha(){
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
properties.setProperty("kaptcha.border", "no");
properties.setProperty("kaptcha.border.color", "105,179,90");
properties.setProperty("kaptcha.textproducer.font.color", "black");
properties.setProperty("kaptcha.image.width", "125");
properties.setProperty("kaptcha.image.height", "45");
properties.setProperty("kaptcha.textproducer.font.size", "35");
properties.setProperty("kaptcha.textproducer.char.length", "4");
properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}

3.获取验证图片代码和登录代码,以及存储session和清除session退出代码

@Controller
@RequestMapping("/user")
public class GmpLoginController {
private static final Logger logger = LoggerFactory.getLogger(GmpLoginController.class);

private Producer captchaProducer = null;

@Autowired
public void setCaptchaProducer(Producer captchaProducer) {
this.captchaProducer = captchaProducer;
}

@Autowired
private GmpLoginService gmpUserService;

/**
* 获取验证码图片
* Gets captcha code.
*
* @param request the request
* @param response the response
* @return the captcha code
* @throws IOException the io exception
*/
@RequestMapping("/captchaCode")
public ModelAndView getCaptchaCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");

//生成验证码文本
String capText = captchaProducer.createText();
session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);

//利用生成的字符串构建图片
BufferedImage bi = captchaProducer.createImage(capText);
ServletOutputStream out = response.getOutputStream();
ImageIO.write(bi, "jpg", out);
try {
out.flush();
} finally {
out.close();
}
return null;
}

/**
* 登录接口
*/
@RequestMapping(value = "/login")
@ResponseBody
public ResponseVo login(UserInfo userInfo, HttpServletRequest request) throws IOException {
String accountName = userInfo.getAccountName();
String password = userInfo.getPassword();
String captcha = userInfo.getCaptcha();
System.out.println("登录 |信息打印| 账号:"+accountName +"| 密码 :"+password);
// 从session中获取之前保存的验证码跟前台传来的验证码进行匹配
HttpSession session = request.getSession();
String kaptcha = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
//System.out.println("##########################验证码打印 ::"+kaptcha);
if (kaptcha == null) {
return ResultUtil.error("验证码已失效");
}
if (!captcha.equals(kaptcha)) {
return ResultUtil.error("验证码不正确");
}
// 用户信息
UserInfo user = gmpUserService.findUserByAccountName(userInfo);
// 账号不存在、密码错误
if (user == null) {
return ResultUtil.error("账号不存在");
}
if (!user.getPassword().equals(password)) {
return ResultUtil.error("密码不正确");
}
//将用户信息存入session
request.getSession().setAttribute("trustpointsUserInfo", user);
return ResultUtil.success("查询成功", user);
}

/**
* @param user
* @param request
* @param response
* @desc: 修改密码
*/
@RequestMapping(value = "/updateUserInfo")
@ResponseBody
public ResponseVo updateUserInfo(UserInfo user, HttpServletRequest request, HttpServletResponse response) {
try {
logger.info("密码修改 | 开始 | 接收到用户修改请求 ");
if (verifyAdmin(request)) {
//1. 判断完正在登录中以后即开始修改密码
//2. 调用修改密码接口
//3. 判断是否修改成功
long updateFlag = gmpUserService.updateUserInfo(user);
if (updateFlag == 1) {
logger.info("密码修改 | 成功 | 请重新登录! ");
return ResultUtil.success("修改成功", "请重新登录");
} else {
return ResultUtil.error("修改失败");
}
// HttpSession session = request.getSession();
} else {
logger.warn("密码修改 | 失败 | 用户未登录或登录已超时! ");
return ResultUtil.error("当前未登录");
}
} catch (Exception e) {
logger.warn("密码修改 | 失败 | 用户未登录或登录已超时! " + e);
return ResultUtil.error("修改失败");
}

}

/**
* @param user
* @param request
* @param response
* @return 退出登录, 返回到登录页面
*/
@RequestMapping(value = "/logout")
@ResponseBody
public ResponseVo logout(UserInfo user, HttpServletRequest request, HttpServletResponse response) {
try {
logger.info("退出登录 | 开始 | 接收到用户退出请求 ");
if (verifyAdmin(request)) {
HttpSession session = request.getSession();
session.setAttribute("trustpointsUserInfo", null);
}
} catch (Exception e) {
logger.info("退出登录 | 错误 | 请重试! "+e);
}
logger.info("退出登录 | 成功 | 成功退出用户 ");
return ResultUtil.success("退出成功", "成功退出用户!");
}

/**
* @desc: 判断session是否过期
* @version: @1.0
*/
private boolean verifyAdmin(HttpServletRequest request) {
HttpSession session = request.getSession();
UserInfo user = (UserInfo) session.getAttribute("trustpointsUserInfo");
if (user == null) {
String msg = "*当前未登录";
request.setAttribute("msg", msg);

return false;
}
String accountName = user.getAccountName();
if (accountName == null || accountName.equals("")) {
String msg = "*用户状态异常";
request.setAttribute("msg", msg);
return false;
}
return true;
}

4. 上面的代码已经完整的(不带权限)将一个简单的登录实现出来,供大家参考! 
注意:配置文件和controller是分开的!

原文地址:https://www.cnblogs.com/wekong/p/15104228.html