首先需要了解什么是验证码,验证码是一种防止机器自动化操作的机制,通常用于表单提交、用户登录等场景中。Java可以通过生成随机数、加密算法等方式来制作验证码。
制作验证码的完整实例代码和步骤如下。
步骤一:引入依赖
我们使用Java的Spring框架,所以需要引入相应的依赖库,包括Spring MVC和Apache Commons Codec等。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
步骤二:创建验证码生成类
我们可以创建一个名为VerifyCodeUtils
的Java类,用于生成验证码。
public class VerifyCodeUtils {
// 数字验证码
private static final String VERIFY_CODES = "0123456789";
/**
* 生成验证码
* @param verifySize 验证码长度
* @return 返回生成的验证码字符串
*/
public static String generateVerifyCode(int verifySize) {
StringBuilder verifyCode = new StringBuilder();
int codesLength = VERIFY_CODES.length();
Random random = new Random();
for (int i = 0; i < verifySize; i++) {
verifyCode.append(VERIFY_CODES.charAt(random.nextInt(codesLength)));
}
return verifyCode.toString();
}
}
其中,generateVerifyCode
方法用于生成指定长度的数字验证码,其步骤如下:
- 首先定义一个StringBuilder对象
verifyCode
用于存储验证码; - 获取数字验证码的长度,并定义一个随机数生成器Random;
- 循环生成指定长度的验证码,获取集合中随机下标对应的数字加入到
verifyCode
中; - 最终将
verifyCode
转换为字符串类型的验证码返回。
步骤三:在Controller中使用验证码
我们可以将生成的验证码添加到ModelAndView中,在jsp页面中展示。
下面示例中我们使用Spring MVC的@ModelAttribute注解来实现。
@GetMapping("/index")
public ModelAndView index(@ModelAttribute("verifyCode")String verifyCode) {
ModelAndView modelAndView = new ModelAndView("index");
String code = VerifyCodeUtils.generateVerifyCode(6);
modelAndView.addObject("verifyCode", code);
return modelAndView;
}
在代码中,我们首先使用generateVerifyCode
方法生成一个长度为6的验证码。
然后使用addObject
方法将验证码添加到ModelAndView
中,以verifyCode
为键。
最后返回ModelAndView
对象,Spring会自动将ModelAndView中数据渲染到对应的jsp页面中。
在jsp页面中展示验证码的代码如下:
<label>验证码:</label>
<input type="text" name="verifyCode" />
<img src="/verifyCode"/>
其中,通过img
标签的src
访问到服务器生成的验证码图片。
示例1:验证码图片显示不出来
如果在jsp页面中无法显示验证码图片,可能是路径不正确,我们可以从Controller中实现验证码图片的生成。示例代码如下:
@GetMapping("/verifyCode")
public void verifyCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
String code = VerifyCodeUtils.generateVerifyCode(6);
BufferedImage image = VerifyCodeUtils.getImage(code, 140, 30);
request.getSession().setAttribute("verifyCode", code);
response.setContentType("image/png");
ImageIO.write(image, "png", response.getOutputStream());
}
其中的getImage
方法用于将字符串类型的验证码转换为图片。
public static BufferedImage getImage(String verifyCode, int width, int height) {
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
g.setFont(new Font("Arial", Font.BOLD, 20));
for (int i = 0; i < verifyCode.length(); i++) {
g.setColor(new Color(20 + (int)(Math.random() * 110), 20 + (int)(Math.random() * 110), 20 + (int)(Math.random() * 110)));
g.drawString(String.valueOf(verifyCode.charAt(i)), 20 * i + 10, 25);
}
g.dispose();
return image;
}
在verifyCode
方法中,我们首先使用generateVerifyCode
方法生成验证码字符串code。
将生成的验证码字符串存入Session中,并使用getImage
方法生成对应的图片,并写入到response的输出流中。
最后,在jsp页面中,将img
标签的src
指向/verifyCode
即可。
示例2: 验证码比对
如果我们需要在表单提交时对验证码进行比对,可以从Session中获取验证码,并将表单提交的验证码和Session中存储的验证码进行比对。
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(HttpServletRequest request, HttpServletResponse response,
@RequestParam("verifyCode")String verifyCode) throws Exception {
HttpSession session = request.getSession();
String code = (String)session.getAttribute("verifyCode");
if (StringUtils.isEmpty(verifyCode) || !verifyCode.equalsIgnoreCase(code)) {
// 生成的异常信息可以自定义
throw new Exception("验证码错误");
}
// TODO: 检查用户名和密码是否正确
return "success";
}
其中,使用了Java的字符串工具类Apache Commons Lang3中的StringUtils类,其可使用Maven依赖中:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
在验证码比对过程中,首先从Session中获取验证码code,然后将Session中存储的验证码和表单提交的验证码进行比对。
如果比对不通过,可以生成一个异常信息或者其他提示信息提示用户。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java制作验证码的完整实例代码 - Python技术站