SpringBoot 结合 Vue3 实现验证码功能

比眉伴天荒 2023-01-17 06:28 248阅读 0赞

效果

在这里插入图片描述

SpringBoot后台代码

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Resource
  5. private UserService userService;
  6. @RequestMapping("/getVerifyCode")
  7. public void getVerifyCode(HttpSession session, HttpServletResponse response) throws IOException {
  8. //生成验证码,6位
  9. String verifyCode = VerifyCodeUtils.generateVerifyCode(4);
  10. //验证码放入session
  11. session.setAttribute("verifyCode", verifyCode);
  12. //验证码存入图片
  13. response.setContentType("image/png");
  14. ServletOutputStream outputStream = response.getOutputStream();
  15. VerifyCodeUtils.outputImage(100, 39, outputStream, verifyCode);
  16. }
  17. @GetMapping("/checkVerifyCode")
  18. public Result checkVerifyCode(String code, HttpSession session) {
  19. String tmp = (String) session.getAttribute("verifyCode");
  20. if (tmp == null || tmp.length() == 0) {
  21. return ResultUtil.fail(ResultEnum.INTERNAL_SERVER_ERROR);
  22. }
  23. if (tmp.equalsIgnoreCase(code)) {
  24. return ResultUtil.success(ResultEnum.CHECK_CODE_SUCCESS);
  25. } else {
  26. return ResultUtil.fail(ResultEnum.CHECK_CODE_ERROR);
  27. }
  28. }
  29. }

上面代码中的工具类VerifyCodeUtils的源代码请参考博客:好用的验证码工具类VerifyCodeUtils

axios工具类

  1. // 二次封装axios
  2. import axios from 'axios'
  3. import qs from 'qs'
  4. import { ElLoading, ElNotification} from 'element-plus'
  5. // 根据环境变量区分接口默认地址(前缀)
  6. axios.defaults.baseURL = 'http://127.0.0.1/blog'
  7. // 请求超时时间
  8. axios.defaults.timeout = 10000
  9. // CROS跨域是否允许凭证
  10. axios.defaults.withCredentials = true
  11. /** * Get请求 * @param url 请求地址 * @param params 参数 * @returns {Promise<unknown>} */
  12. export function get(url: string, params: any = { }) {
  13. return new Promise((resolve, reject) => {
  14. axios.get(url, {
  15. params: params
  16. }).then(res => {
  17. resolve(res.data)
  18. }).catch(error => {
  19. reject(error.data)
  20. })
  21. })
  22. }
  23. // 获取验证码
  24. export const checkVerifyCode = (url: string, params: Record<string, string>) => {
  25. return new Promise((resolve, reject) => {
  26. axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8' // 默认
  27. axios.get(url, qs.stringify(params))
  28. .then(res => {
  29. resolve(res.data)
  30. })
  31. .catch(err => {
  32. reject(err.data)
  33. })
  34. })
  35. }

vue页面

  1. <template>
  2. <h3>个人博客后台管理:用户登录</h3>
  3. <el-form label-width="80px" :model="user" :rules="ruleLoginForm">
  4. <el-form-item>
  5. <el-input v-model="user.verifyCode" placeholder="请输入验证码" minlength="4" maxlength="4" @blur="checkVerifyCode"></el-input>
  6. <img id="img" alt="验证码" style="margin-left: 8px;" onclick="this.src='http://127.0.0.1/blog/user/getVerifyCode?t='+Math.random()" :src="'http://127.0.0.1/blog/user/getVerifyCode'"/>
  7. </el-form-item>
  8. </el-form>
  9. </template>
  10. <script lang="ts"> import { reactive} from 'vue' import { ElMessage} from 'element-plus' import axios from 'axios' export default { setup() { let user = reactive<any>({ verifyCode: '' }) let checkVerifyCode = () => { axios.checkVerifyCode({ code: user.verifyCode }).then((res: any) => { console.info(res) if (res.code !== 200) { ElMessage.error(res.msg) } else { ElMessage.success(res.msg) } }) } return { user, checkVerifyCode, ruleLoginForm: { verifyCode: [ { required: true, message: '请输入验证码', trigger: 'blur'}, { min: 4, max: 4, message: '长度4个字符', trigger: 'blur'} ] } } } } </script>

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue实现验证

    在Web应用程序中,为了避免机器自动化或恶意攻击,很常见的做法是要求用户在表单提交之前输入验证码。验证码最常见的形式是图片验证码,因为图片验证码最大程度地防止了自动化机器调用A