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

网站icp备案号怎么查询广州网络推广公司

网站icp备案号怎么查询,广州网络推广公司,客户资源网,网站制作周期登录添加图形验证码: 在 Java 中,我们可以使用一些图形处理库(如 java.awt 和 javax.imageio)生成图形验证码,并将验证码文本存储在会话(session)中以供验证。下面是一个完整的实现步骤&#x…

登录添加图形验证码:

Java 中,我们可以使用一些图形处理库(如 java.awtjavax.imageio)生成图形验证码,并将验证码文本存储在会话(session)中以供验证。下面是一个完整的实现步骤,包括 验证码图片生成验证码接口、以及 验证逻辑


1. Maven 依赖(可选)

如需引入依赖管理,可以使用 Maven 项目结构。示例中我们主要依赖 Java 自带的 javax 库,所以无需添加额外依赖。

如果你需要更多验证码功能,kaptcha 是一个常用的 Java 验证码生成库,可以通过 Maven 添加:

xml
<dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version>
</dependency>

2. 验证码生成与接口实现

下面是一个使用 javax.imageiojava.awt 库生成验证码图片的例子,并通过 Servlet 提供 HTTP 接口。

生成验证码的 Java Servlet

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {private static final int WIDTH = 160;private static final int HEIGHT = 40;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 创建验证码图片BufferedImage captchaImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);Graphics2D g = (Graphics2D) captchaImage.getGraphics();Random random = new Random();// 生成随机验证码文本String captchaText = generateCaptchaText(6);HttpSession session = request.getSession();session.setAttribute("captcha", captchaText); // 将验证码存储在 session 中// 设置图片背景颜色g.setColor(Color.LIGHT_GRAY);g.fillRect(0, 0, WIDTH, HEIGHT);// 设置字体与颜色g.setFont(new Font("Arial", Font.BOLD, 30));g.setColor(Color.BLACK);g.drawString(captchaText, 20, 30);// 画干扰线for (int i = 0; i < 5; i++) {g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));int x1 = random.nextInt(WIDTH);int y1 = random.nextInt(HEIGHT);int x2 = random.nextInt(WIDTH);int y2 = random.nextInt(HEIGHT);g.drawLine(x1, y1, x2, y2);}g.dispose(); // 释放资源// 设置响应类型为图片格式response.setContentType("image/png");ImageIO.write(captchaImage, "png", response.getOutputStream()); // 输出图片}// 生成随机验证码文本private String generateCaptchaText(int length) {String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";StringBuilder sb = new StringBuilder();Random random = new Random();for (int i = 0; i < length; i++) {sb.append(chars.charAt(random.nextInt(chars.length())));}return sb.toString();}
}

解释:

  1. CaptchaServlet
    • 使用 BufferedImage 创建验证码图片。
    • 使用 Graphics2D 在图片上绘制文字和干扰线。
    • 验证码文本存储在 session 中,以便后续验证。
  1. 会话存储session.setAttribute("captcha", captchaText); 将验证码保存到用户会话中。
  2. 图片响应ImageIO.write(captchaImage, "png", response.getOutputStream()); 将图片直接写入 HTTP 响应流中。

3. 验证码验证逻辑

在用户提交表单时,后端需要验证用户输入的验证码与 session 中存储的验证码是否一致。

登录接口示例

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String userAccount = request.getParameter("userAccount");String userPassword = request.getParameter("userPassword");String captchaInput = request.getParameter("captcha");HttpSession session = request.getSession();String captcha = (String) session.getAttribute("captcha");// 验证验证码是否正确if (captcha == null || !captcha.equalsIgnoreCase(captchaInput)) {response.getWriter().write("验证码错误");return;}// TODO: 验证账号和密码的逻辑if ("admin".equals(userAccount) && "password".equals(userPassword)) {response.getWriter().write("登录成功");} else {response.getWriter().write("账号或密码错误");}}
}

解释:

  1. 验证码验证:获取用户输入的验证码,并与会话中的验证码进行比对。
  2. 忽略大小写:使用 equalsIgnoreCase 忽略大小写进行比较。
  3. 验证逻辑:如果验证码正确且账号密码验证成功,则返回“登录成功”。

4. 前端代码:提交表单与验证码显示

前端代码需要请求验证码图片,并将验证码输入框的内容一并提交给后端。

HTML 示例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录页面</title>
</head>
<body><form action="/login" method="POST"><input type="text" name="userAccount" placeholder="请输入账号" required /><input type="password" name="userPassword" placeholder="请输入密码" required /><img src="/captcha" alt="验证码" onclick="this.src='/captcha?'+Math.random()" /><input type="text" name="captcha" placeholder="请输入验证码" required /><button type="submit">登录</button></form>
</body>
</html>

解释:

  1. 验证码刷新:点击验证码图片时,通过 this.src='/captcha?' + Math.random() 强制刷新验证码。
  2. 表单提交:在用户填写验证码后,将表单提交到 /login 接口。

使用行为验证码:

在开发中添加行为验证码是一种有效的防止自动化攻击和机器人行为的方式。以下是一些免费且公开可用的行为验证码解决方案:

1. hCaptcha

  • 概述:hCaptcha 是一个免费的验证码服务,提供用户交互验证,防止恶意自动化。
  • 特点
    • 简单易用,与 Google reCAPTCHA 类似。
    • 提供奖励系统,网站可以通过用户完成验证获取收益。
  • 使用
    • 访问 hCaptcha官网 注册并获取 API 密钥。
    • 根据文档进行集成。

2. Google reCAPTCHA

  • 概述:虽然 reCAPTCHA 主要是为识别机器人设计的,但其 "Checkbox" 和 "Invisible" 选项可以用作行为验证码。
  • 特点
    • 广泛使用,用户熟悉。
    • 提供多种验证方式,包括隐形验证。
  • 使用
    • 注册 Google reCAPTCHA 获取密钥。
    • 按照文档进行集成。

3. Friendly Captcha

  • 概述:Friendly Captcha 提供了一种不依赖于用户交互的验证码系统,适合于保护用户隐私。
  • 特点
    • 不需要用户填写验证码,用户体验更佳。
    • 通过计算资源验证用户行为。
  • 使用
    • 访问 FriendlyCaptcha官网 注册并获取 API 密钥。
    • 根据文档进行集成。

实战hCaptcha:

在vue项目中创建组件:

<template><div><!-- hCaptcha 容器 --><divref="hcaptchaContainer"class="h-captcha":data-sitekey="siteKey"></div></div>
</template><script setup lang="ts">
import { onMounted, ref, defineEmits } from "vue";
const token = ref<string | null>(null); // 存储验证 token// 定义事件,向父组件发送 token
const emit = defineEmits(["verify"]);
interface Props {siteKey: string;
}// const props = defineProps<Props>(); // 接收 siteKey 作为参数
const hcaptchaContainer = ref<HTMLDivElement | null>(null); // hCaptcha 容器的引用// 生命周期钩子,确保 hCaptcha 在组件挂载后初始化
onMounted(() => {if (window.hcaptcha) {console.log("hCaptcha 已加载");window.hcaptcha.render(hcaptchaContainer.value!, {sitekey: "10000000-ffff-ffff-ffff-000000000001",callback: onVerify,// sitekey: "fbc8723c-c356-49d6-a524-bf327f9ac81a",});} else {console.error("hCaptcha 脚本未加载");}
});const onVerify = (response: string) => {console.log("hCaptcha 验证成功,token:", response);emit("verify", response); // 通过事件发送 token 给父组件
};
</script><style>
.h-captcha {margin: 10px 0;
}
</style>

然后在登录页面中使用,并且进行拦截:

<template><div id="userLoginView"><h1 style="margin-bottom: 56px; color: #fff">用户登录</h1><a-formstyle="display: flex;flex-direction: column;justify-content: space-between;max-width: 520px;min-height: 350px;margin: 0 auto;background: rgba(255, 255, 255, 0.9);padding: 20px;border-radius: 10px;box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);"label-align="left"auto-label-width:model="form"@submit="handleSubmit"><a-form-item field="userAccount" label="账号" style="margin-top: 40px"><a-input v-model="form.userAccount" placeholder="请输入账号" /></a-form-item><a-form-item field="userPassword" tooltip="密码不少于 8 位" label="密码"><a-input-passwordv-model="form.userPassword"placeholder="请输入密码"/></a-form-item><HCaptcha @verify="onCaptchaVerify" /><a-form-item style="margin-bottom: 40px"><a-buttontype="primary"html-type="submit"style="width: 120px; height: 40px; margin-right: 20%">登录</a-button><a-buttontype="primary"@click="turnToRegister()"style="width: 120px; height: 40px; margin-left: 20%">新用户注册</a-button></a-form-item></a-form></div>
</template><script setup lang="ts">
import HCaptcha from "../../components/HCaptcha.vue";
import { reactive, ref } from "vue";
import { UserControllerService, UserLoginRequest } from "../../../generated";
import message from "@arco-design/web-vue/es/message";
import { useRouter } from "vue-router";
import { useStore } from "vuex";/*** 表单信息*/
const form = reactive({userAccount: "",userPassword: "",
} as UserLoginRequest);const router = useRouter();
const store = useStore();const captchaToken = ref<string | null>(null); // 存储 hCaptcha 的 token
const onCaptchaVerify = (token: string) => {captchaToken.value = token; // 接收 hCaptcha 的 token
};/*** 提交表单* @param data*/
const handleSubmit = async () => {if (!captchaToken.value) {message.error("请先通过验证码验证");return; // 阻止提交}const res = await UserControllerService.userLoginUsingPost(form);// 登录成功,跳转到主页if (res.code === 0) {await store.dispatch("user/getLoginUser");router.push({path: "/",replace: true,});} else {message.error("登陆失败," + res.message);}
};/*** 跳转到注册页面*/
const turnToRegister = () => {router.push({path: "/user/register",replace: true,});
};
</script>
<style>
#userLoginView {margin-top: 20vh;/*margin-left: 40vh;*/
}
</style>
http://www.wooajung.com/news/28173.html

相关文章:

  • 网站开发达成口头协议算不算诈骗今日深圳新闻最新消息
  • 古城做网站的公司seo优化神器
  • 石家庄市网站建设培训班太原百度快速优化排名
  • dreamwave 做网站外贸获客软件
  • 免费空间设立网站网络营销模式
  • 南昌公司做网站需要多少钱bt搜索引擎
  • .net网站制作综合实训报告百度怎么推广自己的视频
  • 免费大气网站模板app接入广告变现
  • 做网站怎么赚钱知乎百度seo怎么操作
  • 简单做网站需要学什么电商网站开发平台有哪些
  • 微信小程序的开发步骤流程优化站点
  • 独立创建网站网站排名top排行榜
  • 做商城网站要什么手续费网络营销策略分析论文
  • 网站建设每天需要做什么企业宣传方式有哪些
  • 昆山公司网站建设电话百度地图客服人工电话
  • 襄阳做网站公司免费的推广软件下载
  • 烟台做网站谁家好如何找推广平台
  • 档案网站建设愿景微博营销策略
  • 哪些网站做的好处长沙排名优化公司
  • 成都网站建设维护一起来看在线观看免费
  • 找出网站所有死链接app软件推广平台
  • 网站seo诊断分析如何创建网站?
  • 建设协会网站的公司企业网页设计与推广
  • 河南5G网站基站建设信息yy直播
  • 自己做背景的网站购物网站如何推广
  • 最新军事新闻视频北京网站seo优化推广
  • 网站开发研究综述石家庄高级seo经理
  • 网站规划建设与管理维护的论文社群营销策略有哪些
  • 微信商城小程序定制seo网站快速排名
  • 做网站优化如何遍文章怎么在百度制作自己的网站