解决springboot2.X到3.X验证码存储Redis时遇到的问题

版本:Springboot3.2.3        maven3.6.3          JDK17
问题:2024-02-01T13:03:01.574+08:00 ERROR 8276 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalStateException: No primary or single unique constructor found for interface javax.servlet.http.HttpServletRequest] with root cause
这个问题的意思就是javax.servlet.http.HttpServletRequest这个接口找不到。

因为我所用的版本和我学习的版本不一致,学习的是springboot2.X版本,而我用的是3.X。Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE,所以我们需要进行相应的修改:

首先,在pom.xml中加入依赖:

<dependency>
	<groupId>jakarta.servlet</groupId>
	<artifactId>jakarta.servlet-api</artifactId>
</dependency>

加入依赖后,将javax.*全部改成jakarta.*即可

下面给出接口开发的代码,改成jakarta.*。

package net.xdclass.xdclassredis.controller;

import com.google.code.kaptcha.Producer;
import jakarta.annotation.Resource;
import net.xdclass.xdclassredis.util.CommonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api/v1/captcha")
public class CaptchaController {
    
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private Producer captchaProducer;

    @GetMapping("/get_captcha")
    public void getCaptcha(HttpServletRequest request, HttpServletResponse response){

        String captchaText = captchaProducer.createText();

        String key = getCaptchaKey(request);

        //10分钟过期
        redisTemplate.opsForValue().set(key,captchaText,10,TimeUnit.MINUTES);

        BufferedImage bufferedImage = captchaProducer.createImage(captchaText);

        ServletOutputStream outputStream = null;

        try {
            outputStream = response.getOutputStream();
            ImageIO.write(bufferedImage,"jpg",outputStream);
            outputStream.flush();
            outputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        
    }
    
    private String getCaptchaKey(HttpServletRequest request){
        String ip = CommonUtil.getIpAddr(request);
        String userAgent = request.getHeader("User-Agent");
        String key = "user-service:captcha:"+CommonUtil.MD5(ip+userAgent);
        return key;
    }


}

OK!现在直接去测试还会出现问题,因为在工具类里面也要进行修改,这里我就不放代码了。然后就是测试我们验证码是否可以生成并存储在Redis。

不知道什么原因,就显示8080端口被占用,这里我们使用cmd命令查看端口号占用情况。

netstat -ano | findstr 端口号

可以看到PID:2612进程已经存在,我们将这个进程结束即可,可以在设别管理器找到该进程然后结束掉,或者使用命令:

taskkill -PID 进程号 -F

OK。这样就不会显示8080端口被占用了。

接下来,我们debug下,然后断点调试,再浏览器输入localhost:8080/api/v1/captcha/get_captcha

显示验证码:

然后看一下debug结果:

 显然,通过MD5进行了加密。最后看一下Redis数据库里是否有相应验证码。

结果一致,搞定! 

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
大学期间做的各样项目:Java-Python-JavaScript-Vert.X-SpringBoot.zip amazing-e-commerce 这是一个基于 Spring MVC + Vue 的simple前后端分离web项目,电子商务,做到实现商品的展示、购买等功能。 后期会继续更新,使得项目功能更丰富。[2019/12] videos-recommender 一个简单的基于 Mahout库 的电影推荐系统,使用了 Redis 作为缓存,Vert.X 构建 web 服务以提供 RESTful 服务。[2019/12] simple-datamining-online 用 Spring Boot + Vue 实现的一个简单的在线数据挖掘,可上传查看数据、选择模型、查看性能度量结果。[2020/04] covid-19-realtime-info-visualization 一个展示 COVID-19 全球实趋势的 web 应用,基于 Vue/Bulma/Echarts 和 Flask 构建。[2020/06] simple-shorturl-service 一个简单的短网址服务系统,可通过 RESTful API 来生成新短网址,短网址与原网址的映射存储Redis 数据库中,用户请求短网址会被重定向到原网址。后台使用 Vert.X-Web 和异步编程,web服务和redis服务之间通过 EventBus 通信。短网址生成使用原网址到62进制映射的方案。[2020/05] 新添加了管理界面。[2020/07] simple-info-sharing 这是一个简单的信息共享平台,信息具体地指其实是 html、pdf 这些能直接被浏览器解析的文件,信息上传到平台后,其他人可以直接查看/浏览。[2020/07] one-paste 一个效仿 Ubuntu pastebin 的粘贴信息分享平台,开发基于 vert.x、mongodb、hightlight.js。[2020/11] verification-code-app 验证码应用 Example。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值