| 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); | 
| // | 
| //    } | 
| } |