Java后端产生验证码后台验证功能是Web开发过程中常见的安全性验证功能。下面将详细介绍Java后端产生验证码后台验证功能的实现代码完整攻略。
Java后端产生验证码后台验证功能是Web开发过程中常见的安全性验证功能。下面将详细介绍Java后端产生验证码后台验证功能的实现代码完整攻略。
1. 生成验证码
Java后端生成验证码可以使用第三方库,比如Google的kaptcha,关于这部分的实现方式扩展到本篇文章以外,这里不做详述,主要讲解验证码的验证。
2. 后台验证码验证功能
2.1 后台实现验证码生成并保存到session中
在生成验证码的同时,我们生成一个随机字符串,并且将验证码字符串和这个随机字符串一起存入Session中,代码如下:
@RequestMapping("/vcode")
public void vcode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String code = null;
BufferedImage image = null;
// 用Kaptcha生成验证码
HttpSession session = request.getSession();
//生成验证码字符串并保存到会话中
code = new DefaultKaptcha().createText();
session.setAttribute("verificationCode", code);
//生成图片
image = new DefaultKaptcha().createImage(code);
//将图片输出给客户端
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
}
2.2 校验验证码
在进行验证码校验时,我们将用户在表单中填写的验证码和我们保存在Session中的验证码进行比对,如果不一致则表示校验失败。代码如下:
@RequestMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response)
{
//从页面获取验证码
String code = request.getParameter("verificationCode");
HttpSession session = request.getSession();
//从会话中获取正确的验证码
String verificationCode = (String) session.getAttribute("verificationCode");
if (code.equals(verificationCode)) //验证码正确
{
//登陆成功
return "success";
}
else
{
//验证码错误
request.setAttribute("msg", "验证码错误");
return "login";
}
}
3. 示例说明
下面提供两个示例。
示例1:在controller中加入生成验证码和校验验证码的方法,然后在前端页面展示一个验证码输入框和一个图片验证码,用户在输入框中输入验证码,然后提交表单,我们在后台进行验证码校验,对应的代码如下:
//生成验证码并将验证码写入response中
@RequestMapping("/vcode")
public void vcode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String code = null;
BufferedImage image = null;
// 用Kaptcha生成验证码
HttpSession session = request.getSession();
//生成验证码字符串并保存到会话中
code = new DefaultKaptcha().createText();
session.setAttribute("verificationCode", code);
//生成图片
image = new DefaultKaptcha().createImage(code);
//将图片输出给客户端
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
}
//处理用户登录请求
@RequestMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response)
{
String username = request.getParameter("username");
String password = request.getParameter("password");
String code = request.getParameter("code");
HttpSession session = request.getSession();
String verificationCode = (String) session.getAttribute("verificationCode");
String errMsg = "";
if(verificationCode==null) {
errMsg = "验证码不存在";
}
else if(username==null || password==null) {
errMsg = "请填写用户名和密码";
}
else if(username.equals("admin") && password.equals("123456")) {
if(code!=null && code.equals(verificationCode)) {
session.removeAttribute("verificationCode");
return "redirect:/home";
}
else {
errMsg = "验证码错误";
}
}
else {
errMsg = "用户名或密码错误";
}
request.setAttribute("errMsg", errMsg);
return "login";
}
示例2:在controller中加入生成验证码和校验验证码的方法,在前端使用AJAX提交表单,我们在ValidateCodeController中处理表单校验请求,对应的代码如下:
//生成验证码并将验证码写入response中
@RequestMapping("/vcode")
public void vcode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String code = null;
BufferedImage image = null;
// 用Kaptcha生成验证码
HttpSession session = request.getSession();
//生成验证码字符串并保存到会话中
code = new DefaultKaptcha().createText();
session.setAttribute("verificationCode", code);
//生成图片
image = new DefaultKaptcha().createImage(code);
//将图片输出给客户端
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
}
//处理用户登录请求
@RequestMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response)
{
return "login";
}
//校验验证码
@RequestMapping("/validateCode")
@ResponseBody
public Map<String, Object> validateCode(HttpServletRequest request, HttpServletResponse response)
{
Map<String, Object> map = new HashMap<String, Object>();
String code = request.getParameter("code").trim().toUpperCase();
String valCodeFromSession = (String)request.getSession().getAttribute("ValidateCode");
if(StringUtils.isBlank(valCodeFromSession)
|| StringUtils.isBlank(code)
|| !valCodeFromSession.equalsIgnoreCase(code)) {
map.put("code","ok");
map.put("msg","验证码错误");
}else{
map.put("code","fail");
map.put("msg","验证码正确");
}
return map;
}
在前端页面中,我们使用jQuery实现验证码的异步校验,对应的代码如下:
<form id="loginForm" name="loginForm">
<div>
<label>用户名:</label>
<input type="text" name="username"/>
</div>
<div>
<label>密码:</label>
<input type="password" name="password" />
</div>
<div>
<label>验证码:</label>
<input type="text" name="code" />
<img src="/vcode" id="vcodeImg" /><a href="#" onclick="changeCode()">看不清?换一张</a>
<span id="msg"></span>
</div>
<div>
<button type="button" id="submitBtn">登录</button>
</div>
</form>
<script type="text/javascript">
function changeCode() {
$("#vcodeImg").attr("src","/vcode?t=" + new Date().getTime());
}
$(function() {
$("#submitBtn").click(function() {
$.ajax({
type: "GET",
url: "/validateCode",
data: { code: $("input[name='code']").val() },
success: function(data){
if(data.code == "ok") {
$("#msg").text(data.msg);
return false;
}else {
$("#msg").text("");
$("#loginForm").submit();
}
},
dataType: "json"
});
});
});
</script>
以上就是Java后端产生验证码后台验证功能的实现代码完整攻略,希望对你有帮助。
本文标题为:Java后端产生验证码后台验证功能的实现代码
基础教程推荐
- Spring Boot中@Conditional注解介绍 2023-05-18
- 使用SpringBoot配置https(SSL证书) 2023-08-08
- springboot返回值转成JSONString的处理方式 2023-01-13
- 关于swagger配置及踩坑@Api参数postion无效解决接口排序问题 2023-01-02
- Java的IO流实现文件和文件夹的复制 2023-01-29
- java程序员进阶:Redis分布式技术问题集锦 2023-11-09
- SpringMVC如何用Post方式重定向 2023-06-23
- JSP页面的静态包含和动态包含使用方法 2023-07-30
- MybatisPlus保存、读取MySQL中的json字段失败问题及解决 2023-02-19
- Java基于对象流实现银行系统 2023-05-19