java实现算式验证码_JAVA验证码生成包括(包括算数计算值和纯char验证)

package com.jiliang;

import com.google.code.kaptcha.Constants;

import com.google.code.kaptcha.Producer;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

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 java.awt.image.BufferedImage;

import java.io.IOException;

/**

* 图片验证码(支持算术形式)

*

* @author admin

*/

@Controller

@RequestMapping("/validate")

public class SysCaptchaController{

@Resource(name = "captchaProducer")

private Producer captchaProducer;

@Resource(name = "captchaProducerMath")

private Producer captchaProducerMath;

/**

* 验证码生成

*/

@GetMapping(value = "/image")

public void getKaptchaImage(HttpServletRequest request, HttpServletResponse response) {

ServletOutputStream out = null;

try {

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 type = request.getParameter("type");

String capStr = null;

String code = null;

BufferedImage bi = null;

if ("math".equals(type)) {

String capText = captchaProducerMath.createText();

capStr = capText.substring(0, capText.lastIndexOf("@"));

code = capText.substring(capText.lastIndexOf("@") + 1);

bi = captchaProducerMath.createImage(capStr);

} else if ("char".equals(type)) {

capStr = code = captchaProducer.createText();

bi = captchaProducer.createImage(capStr);

}

//将生成的code存放到session中,待登陆后从session获取比较

//键值为:KAPTCHA_SESSION_KEY

session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);

out = response.getOutputStream();

ImageIO.write(bi, "jpg" , out);

out.flush();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (out != null) {

out.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

注:需要到一个jar包

com.github.penggle

kaptcha

2.3.2

您好,生成不重复的数学算式是一个比较有意思的问题,可以使用Java编写一个算式生成器来实现。以下是一个简单的实现: ```java import java.util.ArrayList; public class ExercisesGenerator { private static final int MAX_OPERAND = 100; // 操作数的最大 private static final int MAX_RESULT = 1000; // 算式结果的最大 private static final int MAX_OPERATORS = 3; // 最大操作符数量 private static final int MAX_EXERCISES = 100; // 最大题目数量 private ArrayList<String> exercises; // 存储算式的列表 public ExercisesGenerator() { exercises = new ArrayList<String>(); } public void generateExercises() { for (int i = 0; i < MAX_EXERCISES; i++) { String exercise = generateExercise(); if (!exercises.contains(exercise)) { exercises.add(exercise); } } } public void printExercises() { for (String exercise : exercises) { System.out.println(exercise); } } private String generateExercise() { int operand1 = (int) (Math.random() * MAX_OPERAND) + 1; int operand2 = (int) (Math.random() * MAX_OPERAND) + 1; char operator1 = generateOperator(); char operator2 = generateOperator(); int result = calculateResult(operand1, operand2, operator1, operator2); return operand1 + " " + operator1 + " " + operand2 + " " + operator2 + " " + "= " + result; } private char generateOperator() { int operatorIndex = (int) (Math.random() * 4); char[] operators = { '+', '-', '*', '/' }; return operators[operatorIndex]; } private int calculateResult(int operand1, int operand2, char operator1, char operator2) { int result = 0; switch (operator2) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; } switch (operator1) { case '+': result += (int) (Math.random() * MAX_RESULT) + 1; break; case '-': result -= (int) (Math.random() * MAX_RESULT) + 1; break; case '*': result *= (int) (Math.random() * MAX_OPERAND) + 1; break; case '/': result /= (int) (Math.random() * MAX_OPERAND) + 1; break; } return result; } public static void main(String[] args) { ExercisesGenerator generator = new ExercisesGenerator(); generator.generateExercises(); generator.printExercises(); } } ``` 这个算式生成器可以生成100道不重复的算式,每个算式包含两个操作数和两个操作符,以及一个结果。其中,操作数和结果的范围为1到100,操作符为加、减、乘、除中的一个,且每个算式最多有两个操作符。生成算式时,首先从1到100中随机生成两个操作数,然后随机生成两个操作符,并根据操作符计算出结果。最后将算式转换为字符串,存储在一个列表中。如果生成算式已经存在于列表中,则不存储这个算式,直到生成100道不重复的算式为止。 您可以根据需要调整参数,例如调整最大操作数和最大结果的,以及算式数量。同时,您也可以根据需要修改算式生成的逻辑,例如增加或减少操作符数量,或者增加其他的数学运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值