package cc.mrbird.febs.common.service;
|
|
import cc.mrbird.febs.common.entity.FebsConstant;
|
import cc.mrbird.febs.common.entity.ImageType;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.properties.FebsProperties;
|
import cc.mrbird.febs.common.properties.ValidateCodeProperties;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.wf.captcha.GifCaptcha;
|
import com.wf.captcha.SpecCaptcha;
|
import com.wf.captcha.base.Captcha;
|
import lombok.RequiredArgsConstructor;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.MediaType;
|
import org.springframework.stereotype.Service;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpSession;
|
import java.io.IOException;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* 验证码服务
|
*
|
* @author MrBird
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class ValidateCodeService {
|
|
private final RedisService redisService;
|
private final FebsProperties properties;
|
|
public void create(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
HttpSession session = request.getSession();
|
String key = session.getId();
|
ValidateCodeProperties code = properties.getCode();
|
setHeader(response, code.getType());
|
|
Captcha captcha = createCaptcha(code);
|
redisService.set(FebsConstant.CODE_PREFIX + key, StringUtils.lowerCase(captcha.text()), code.getTime());
|
captcha.out(response.getOutputStream());
|
}
|
|
|
public void check(String key, String value) throws FebsException {
|
Object codeInRedis = redisService.get(FebsConstant.CODE_PREFIX + key);
|
if (StringUtils.isBlank(value)) {
|
throw new FebsException("请输入验证码");
|
}
|
if (codeInRedis == null) {
|
throw new FebsException("验证码已过期");
|
}
|
if (!StringUtils.equalsIgnoreCase(value, String.valueOf(codeInRedis))) {
|
throw new FebsException("验证码不正确");
|
}
|
}
|
|
private Captcha createCaptcha(ValidateCodeProperties code) {
|
Captcha captcha;
|
if (StringUtils.equalsIgnoreCase(code.getType(), ImageType.GIF)) {
|
captcha = new GifCaptcha(code.getWidth(), code.getHeight(), code.getLength());
|
} else {
|
captcha = new SpecCaptcha(code.getWidth(), code.getHeight(), code.getLength());
|
}
|
captcha.setCharType(code.getCharType());
|
return captcha;
|
}
|
|
private void setHeader(HttpServletResponse response, String type) {
|
if (StringUtils.equalsIgnoreCase(type, ImageType.GIF)) {
|
response.setContentType(MediaType.IMAGE_GIF_VALUE);
|
} else {
|
response.setContentType(MediaType.IMAGE_PNG_VALUE);
|
}
|
response.setHeader(HttpHeaders.PRAGMA, "No-cache");
|
response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache");
|
response.setDateHeader(HttpHeaders.EXPIRES, 0L);
|
}
|
|
|
// public static void main(String[] args) {
|
// List<Integer> lists = new ArrayList<>();
|
//// lists.add(1);
|
//// lists.add(2);
|
//// lists.add(3);
|
//// lists.add(4);
|
// System.out.println(lists);
|
// List<Integer> collect = lists
|
// .stream()
|
// .filter(list -> 1 == list)
|
// .collect(Collectors.toList());
|
//
|
// System.out.println(collect);
|
//
|
// List<Integer> collect1 = lists.stream().filter(
|
// list -> {
|
// if (1 != list) {
|
// return true;
|
// }
|
// return false;
|
// }
|
// ).collect(Collectors.toList());
|
//
|
// System.out.println(collect1);
|
//
|
//
|
// List<Integer> list2 = new ArrayList<>();
|
// Random rd = new Random();
|
// for (int i = 0; i < 100; i++) {
|
// list2.add(rd.nextInt(101));// 随机产生一个[0,100]的数字
|
// }
|
// System.out.println(list2);
|
// // 流处理, 进行数据处理
|
// DoubleSummaryStatistics ds = list2.stream().collect(Collectors.summarizingDouble(e -> e));
|
// Map<Boolean, List<Integer>> collect2 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 60));
|
// Map<Boolean, List<Integer>> collect3 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 80));
|
// Map<Boolean, List<Integer>> collect4 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 200));
|
// System.out.println("平均分"+ds.getAverage());
|
// System.out.println("最高分"+ds.getMax());
|
// System.out.println("最低分"+ds.getMin());
|
// System.out.println("总分"+ds.getSum());
|
// System.out.println("人数"+ds.getCount());
|
// System.out.println("大于60分"+collect2.toString());
|
// System.out.println("大于80分"+collect3.get(true).toString());
|
// System.out.println("大于90分"+collect4.get(true).toString());
|
// JSONObject jsonObject = JSONUtil.parseObj(collect2);
|
// System.out.println(jsonObject);
|
//
|
// }
|
}
|