当前位置: 首页 > news >正文

做网站没有创意网络营销品牌案例

做网站没有创意,网络营销品牌案例,趣味创意产品设计,网站建设调查🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

🌟 前言

欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍

  • 🤖 洛可可白:个人主页

  • 🔥 个人专栏:✅前端技术 ✅后端技术

  • 🏠 个人博客:洛可可白博客

  • 🐱 代码获取:bestwishes0203

  • 📷 封面壁纸:洛可可白wallpaper

CDDN

文章目录

  • Spring Boot工程集成验证码生成与验证功能教程
    • 1. 创建验证码工具类
    • 2. 控制层实现
    • 3. 客户端展示验证码
    • 4. 验证验证码
    • 📌 联系方式
    • 🚀 获取源代码
    • 🎉 结语

Spring Boot工程集成验证码生成与验证功能教程

验证码是一种常见的安全机制,用于防止自动化工具(如爬虫)对网站进行恶意操作。在Web应用中,验证码通常以图像的形式出现,要求用户输入图像中显示的字符。本文将介绍如何在Spring Boot工程中实现一个随机生成验证码的功能。

1. 创建验证码工具类

首先,我们需要创建一个工具类VerifyCodeUtils,用于生成随机验证码并输出为图像。

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;public class VerifyCodeUtils {//使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";private static Random random = new Random();/*** 使用系统默认字符源生成验证码** @param verifySize 验证码长度* @return*/public static String generateVerifyCode(int verifySize) {return generateVerifyCode(verifySize, VERIFY_CODES);}/*** 使用指定源生成验证码** @param verifySize 验证码长度* @param sources    验证码字符源* @return*/public static String generateVerifyCode(int verifySize, String sources) {if (sources == null || sources.length() == 0) {sources = VERIFY_CODES;}int codesLen = sources.length();Random rand = new Random(System.currentTimeMillis());StringBuilder verifyCode = new StringBuilder(verifySize);for (int i = 0; i < verifySize; i++) {verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));}return verifyCode.toString();}/*** 生成随机验证码文件,并返回验证码值** @param w* @param h* @param outputFile* @param verifySize* @return* @throws IOException*/public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException {String verifyCode = generateVerifyCode(verifySize);outputImage(w, h, outputFile, verifyCode);return verifyCode;}/*** 输出随机验证码图片流,并返回验证码值** @param w* @param h* @param os* @param verifySize* @return* @throws IOException*/public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException {String verifyCode = generateVerifyCode(verifySize);outputImage(w, h, os, verifyCode);return verifyCode;}/*** 生成指定验证码图像文件** @param w* @param h* @param outputFile* @param code* @throws IOException*/public static void outputImage(int w, int h, File outputFile, String code) throws IOException {if (outputFile == null) {return;}File dir = outputFile.getParentFile();if (!dir.exists()) {dir.mkdirs();}try {outputFile.createNewFile();FileOutputStream fos = new FileOutputStream(outputFile);outputImage(w, h, fos, code);fos.close();} catch (IOException e) {throw e;}}/*** 输出指定验证码图片流** @param w* @param h* @param os* @param code* @throws IOException*/public static void outputImage(int w, int h, OutputStream os, String code) throws IOException {int verifySize = code.length();BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);Random rand = new Random();Graphics2D g2 = image.createGraphics();g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);Color[] colors = new Color[5];Color[] colorSpaces = new Color[]{Color.WHITE, Color.CYAN,Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,Color.PINK, Color.YELLOW};float[] fractions = new float[colors.length];for (int i = 0; i < colors.length; i++) {colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];fractions[i] = rand.nextFloat();}Arrays.sort(fractions);g2.setColor(Color.GRAY);// 设置边框色g2.fillRect(0, 0, w, h);Color c = getRandColor(200, 250);g2.setColor(c);// 设置背景色g2.fillRect(0, 2, w, h - 4);//绘制干扰线Random random = new Random();g2.setColor(getRandColor(160, 200));// 设置线条的颜色for (int i = 0; i < 20; i++) {int x = random.nextInt(w - 1);int y = random.nextInt(h - 1);int xl = random.nextInt(6) + 1;int yl = random.nextInt(12) + 1;g2.drawLine(x, y, x + xl + 40, y + yl + 20);}// 添加噪点float yawpRate = 0.05f;// 噪声率int area = (int) (yawpRate * w * h);for (int i = 0; i < area; i++) {int x = random.nextInt(w);int y = random.nextInt(h);int rgb = getRandomIntColor();image.setRGB(x, y, rgb);}shear(g2, w, h, c);// 使图片扭曲g2.setColor(getRandColor(100, 160));int fontSize = h - 4;Font font = new Font("Algerian", Font.ITALIC, fontSize);g2.setFont(font);char[] chars = code.toCharArray();for (int i = 0; i < verifySize; i++) {AffineTransform affine = new AffineTransform();affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize / 2, h / 2);g2.setTransform(affine);g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);}g2.dispose();ImageIO.write(image, "jpg", os);}private static Color getRandColor(int fc, int bc) {if (fc > 255)fc = 255;if (bc > 255)bc = 255;int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}private static int getRandomIntColor() {int[] rgb = getRandomRgb();int color = 0;for (int c : rgb) {color = color << 8;color = color | c;}return color;}private static int[] getRandomRgb() {int[] rgb = new int[3];for (int i = 0; i < 3; i++) {rgb[i] = random.nextInt(255);}return rgb;}private static void shear(Graphics g, int w1, int h1, Color color) {shearX(g, w1, h1, color);shearY(g, w1, h1, color);}private static void shearX(Graphics g, int w1, int h1, Color color) {int period = random.nextInt(2);boolean borderGap = true;int frames = 1;int phase = random.nextInt(2);for (int i = 0; i < h1; i++) {double d = (double) (period >> 1)* Math.sin((double) i / (double) period+ (6.2831853071795862D * (double) phase)/ (double) frames);g.copyArea(0, i, w1, 1, (int) d, 0);if (borderGap) {g.setColor(color);g.drawLine((int) d, i, 0, i);g.drawLine((int) d + w1, i, w1, i);}}}private static void shearY(Graphics g, int w1, int h1, Color color) {int period = random.nextInt(40) + 10; // 50;boolean borderGap = true;int frames = 20;int phase = 7;for (int i = 0; i < w1; i++) {double d = (double) (period >> 1)* Math.sin((double) i / (double) period+ (6.2831853071795862D * (double) phase)/ (double) frames);g.copyArea(i, 0, 1, h1, 0, (int) d);if (borderGap) {g.setColor(color);g.drawLine(i, (int) d, i, 0);g.drawLine(i, (int) d + h1, i, h1);}}}
}

2. 控制层实现

在Spring Boot的控制器中,我们需要提供一个接口来生成验证码并将其发送给客户端。

// VerifyController.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class VerifyController {@GetMapping("/generateImageCode")public void generateImageCode(HttpSession session, HttpServletResponse response) throws IOException {//随机生成四位随机数String code = VerifyCodeUtils.generateVerifyCode(4);//保存到session域中session.setAttribute("code", code);//根据随机数生成图片,reqponse响应图片response.setContentType("image/png");ServletOutputStream os = response.getOutputStream();VerifyCodeUtils.outputImage(130, 60, os, code);}
}

3. 客户端展示验证码

在Web页面中,我们需要添加一个图像标签来展示验证码。

<!-- 在HTML中添加验证码图像 -->
<img src="/generateImageCode" alt="验证码" onclick="this.src='/generateImageCode?'+Math.random();" />

4. 验证验证码

在用户提交表单时,我们需要验证用户输入的验证码是否正确。这通常在后端进行,通过比较用户输入的验证码与Session中保存的验证码。

// 在登录方法中验证验证码
@PostMapping("/login")
public ResponseEntity<?> login(@RequestParam String username, @RequestParam String password, HttpSession session) {// 获取用户输入的验证码String userInputCode = request.getParameter("code");// 获取Session中保存的验证码String sessionCode = (String) session.getAttribute("code");// 验证验证码if (!sessionCode.equals(inputCode)) {// 验证码错误return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("验证码错误");}// 验证码正确,继续登录逻辑// ...
}

📌 联系方式

如果您对我们的项目感兴趣,或者有任何技术问题想要探讨,欢迎通过以下方式与我联系。我非常期待与您交流,共同学习,共同进步!🌊💡🤖

  • 邮箱:2109664977@qq.com 📧
  • Gitee:https://gitee.com/bestwishes0203 🐱
  • GitHub:https://github.com/bestwishes0203 🐙
  • CSDN主页:https://blog.csdn.net/interest_ing_/ 📖
  • 个人博客:访问我的博客 🏠

🚀 获取源代码

  • 后端案例:https://gitee.com/bestwishes0203/Front-end-example
  • 前端案例:https://gitee.com/bestwishes0203/Back-end-example

🎉 结语

感谢你的访问,如果你对我的技术文章或项目感兴趣,欢迎通过以上方式与我联系。让我们一起在技术的道路上不断前行!🚀

http://www.khdw.cn/news/54476.html

相关文章:

  • 文化传播做网站推广吗自媒体引流推广
  • 百度网站收入电商运营模式
  • 网站建设趋势2017产品推广方案怎么写
  • java初学者用什么软件seo外链软件
  • 织梦搭建企业网站免费的大数据分析平台
  • 建设网站的报告做网络推广
  • 安卓软件定制开发南京seo代理
  • 洛阳做网站找哪家近期舆情热点事件
  • 网站开发用苹果电脑青岛网
  • 做汽车配件招聘网站seo服务工程
  • 河北seo优化sem推广和seo的区别
  • 博物馆设计百色seo关键词优化公司
  • wordpress cropping 图片 出错cpu优化软件
  • 汕头网站制作多少钱友链提交入口
  • 网上建网站有没有免费的seo网站
  • 微信24小时网站建设北京百度公司地址在哪里
  • 怎么用dw第一次做网站广州百度seo
  • 汕头 网站建设seo相关ppt
  • 免费版多用户商城源码青岛seo排名扣费
  • 高明做网站广州抖音seo公司
  • 深圳建筑工程公司排名百度seo培训要多少钱
  • 徐州提供网站建设报价表pc网站建设和推广
  • 银川做网站最好的公司如何开一个自己的网站
  • 杭州做网站需要多少钱张雪峰谈广告学专业
  • 海航科技网站建设关键词优化怎么弄
  • 中英版网站系统国家高新技术企业
  • 专做外贸的网站有哪些资料上海专业seo排名优化
  • 站长工具查询入口百度seo关键词优化公司
  • 如何取消网站备案网络营销案例分析题及答案
  • 网络建站网网络推广百度业务推广