Shiro 结合 kcaptcha实现登录验证

一款比较好用的php验证码类:kcaptcha 立即下载

验证码是为了区分人与电脑,防止电脑代替人冲击系统。在伟大的中国人民人工验证的海洋面前,验证码完全不是个事。
不过一般不是特别热门的系统是不会有人雇佣人民海洋来人工识别验证码的,所有我们的系统还是需要加入验证码机制。
在Java Web系统中验证码世界已经很多种的实现,有些很大很复杂,有些没有维护了,有些验证码人也认证不出来。。。比较合适用的就是Jcaptcha和Kcaptcha。

Captcha使用都是很简单的,通过专门的servlet生成图片,把图片的数据保存在session中,最后在处理请求的servlet中验证图片输入是否正常。当然一般都会有很多配置,因为Captcha生成图片需要时间,所有需要谨慎配置。

Kcaptcha与Shiro登录结合使用

1. Web.xml

<servlet>
        <servlet-name>Kaptcha</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>Kaptcha</servlet-name>
        <url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>

2. 登录Jsp

<%
            String error = (String) request.getAttribute(FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME);
            if(error != null){

                if(error.contains("IncorrectCaptchaException")){
                    out.print("用户输入验证码错误.");
                }
                else{
                    out.print("登录失败,请重试.");
                }
            }
        %>      
<form action="">
    Username: <input type="text" name="username"/> <br/>
   Password: <input type="password" name="password"/>
    <img src="kaptcha.jpg" /> <input type="text" name="kaptcha" value="" />
</form>

3. Shiro登录Filter

a. 扩展登录UsernamePasswordToken,加入kaptcha字段

public class CaptchaAuthenticationToken extends UsernamePasswordToken{  

    private String kaptcha;  

    public CaptchaAuthenticationToken (){}  

    public CaptchaAuthenticationToken (String username, String password,
            boolean rememberMe, String host, String captcha) {
        super(username, password, rememberMe, host);
        this.captcha = captcha;
    } 

    public void setKaptcha(String kaptcha){  
        this.kaptcha= kaptcha;  
    }  

    public String getKaptcha(){  
        return this.kaptcha;  
    }  
  }

b. 扩展formAuthenticationFilter,检验用户输入验证码

public class CaptchaFormAuthenticationFilter extends FormAuthenticationFilter {

    private String captchaParam = "kaptcha";

    public String getCaptchaParam() {
        return captchaParam;
    }

    protected String getCaptcha(ServletRequest request) {
        return WebUtils.getCleanParam(request, getCaptchaParam());
    }

    @Override
    protected AuthenticationToken createToken(ServletRequest request,
            ServletResponse response) {
        String username = getUsername(request);
        String password = getPassword(request);
        String captcha = getCaptcha(request);
        boolean rememberMe = isRememberMe(request);
        String host = getHost(request);
        return new CaptchaAuthenticationToken(username, password, rememberMe,
                host, captcha);
    }

   // 验证码校验
    protected void doCaptchaValidate(HttpServletRequest request, CaptchaAuthenticationToken token) {
        String captcha = (String) request.getSession().getAttribute(ShiroConstant.CAPTCHA_SESSION_KEY);

        if (StringUtil.isEmpty(token.getCaptcha()) || !token.getCaptcha().equalsIgnoreCase(captcha)) {
            /* 定义IncorrectCaptchaException,shiro显示Exception class name作为error信息 */
            throw new IncorrectCaptchaException("验证码错误!");
        }
    }

    /*
      protected void setFailureAttribute(ServletRequest request, AuthenticationException ae) {
        String className = ae.getClass().getName();
        request.setAttribute(getFailureKeyAttribute(), className);
    }
    */
    // 认证
    @Override
    protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
        CaptchaAuthenticationToken token = createToken(request, response);

        try {
            doCaptchaValidate((HttpServletRequest) request, token);

            Subject subject = getSubject(request, response);
            subject.login(token);

            return onLoginSuccess(token, subject, request, response);
        } catch (AuthenticationException e) {
            return onLoginFailure(token, e, request, response);
        }
    }
}

c. 增加 IncorrectCaptchaException

public class IncorrectCaptchaException extends AuthenticationException {

  public IncorrectCaptchaException() {
    super();
  }

  public IncorrectCaptchaException(String message, Throwable cause) {
    super(message, cause);
  }

  public IncorrectCaptchaException(String message) {
    super(message);
  }

  public IncorrectCaptchaException(Throwable cause) {
    super(cause);
  }
}

d.修改Shiro配置文件,让/kaptcha.jpg的访问变成匿名

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/login.jsp" />
        <property name="successUrl" value="/" />
        <property name="filters">
            <map>
                <!-- 启用验证码检验 -->
                <entry key="authc" value-ref="captchaFormAuthenticationFilter"/>
            </map>
        </property>
        <property name="filterChainDefinitions">
            <value>
                /kaptcha.jpg = anon
                /styles/** = anon
                /login = authc
                /logout = logout
                /** = user
            </value>
        </property>
    </bean>
KCAPTCHA验证码 2.0.zip KCAPTCHA是一个免费开源的PHP验证码图片解决方案,使用GD库生成。 立即下载

相关推荐

保姆级教程:断网环境下用Flexnet服务器搞定SolidWorks 2021安装与破解(附错误5解决方案)

本文提供SolidWorks 2021在断网环境下的企业级部署指南,详细解析Flexnet服务器本地化工作原理,并给出安装与破解的实战方案,特别针对常见的'错误5'问题提供多维度解决方案。适用于需要内网隔离或移动办公的工业设计场景,确保数据安全与授权合规。

weixin_28683391的博客 296

springboot整合kcaptcha

1.pom文件加入依赖 <!-- kaptcha验证码 --> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>

AC_XI的博客 495

保姆级教程:用SSC Tool 5.13为先楫HPM6E00EVK生成8轴EtherCAT从站代码(含XML配置详解)

本文详细介绍了如何使用SSC Tool 5.13为先楫HPM6E00EVK开发板配置8轴EtherCAT从站,包括XML文件深度配置、代码生成与工程整合、烧录与调试技巧。教程涵盖从环境准备到性能优化的全流程,帮助开发者快速实现符合CIA402标准的8轴控制。

weixin_30352645的博客 254

spring内置验证码kaptcha,baomidou使用详解

如果生成验证码的时间,超过了你传入的时间,那么会直接抛出异常KaptchaTimeoutException,看源码可以看到,这里没有返回true或者false,如果超时或者其他都是直接抛出异常,我们用的时候,可以自定义异常类,进行捕获异常进行处理。参数有两个,一个是校验码,一个是超时时间,主要为了方便扩展,超时时间可以有客户端来传入。source:验证码区间 如:abcd1234,只会在这个区间产生。background-colo : 颜色渐变设置。boder :验证码框设置。width :验证码框宽。

持续学习,持续更新 1081

PLC与变频器联动控制:从开关量、模拟量到通讯的接线与编程实战

在工业自动化系统中,电机调速控制是核心需求之一,其关键在于实现可编程逻辑控制器(PLC)与变频器之间的可靠联动。其基本原理是通过PLC输出控制信号,由变频器接收并驱动电机按设定速度运行。这项技术的核心价值在于实现电机的软启停、精确调速与节能控制,广泛应用于风机、水泵、传送带及精密张力控制等场景。其中,开关量控制以其接线简单、抗干扰能力强的特点,成为基础且可靠的方案;而模拟量控制则能实现无级平滑调速,满足更高精度的工艺要求。本文以西门子、三菱等主流品牌为例,深入解析了这两种主流控制方式的硬件接线、参数设置与梯

1268

STM32 RT-Thread 系统分析(1)- 启动文件

RT-Thread STM32 系统分析(1)- 启动文件前言基本信息前言说明三级目录 前言 基本信息 名称 描述说明 RT-Thread Studio 软件版本 版本: 1.1.3 RT-Thread 系统版本 4.0.2 STM32CubeIDE 软件版本 1.4.0 STM32芯片型号 STM32F013VG 前言说明 使用了STM32CubeIDE 和 RT-Thread Studio 建立了相同型号芯片的工程,对比其中启动文件内容差异如下: 左侧是RT-Threa

鸳鸯冰笔的博客 4096

Java实现验证码的制作

验证码概述 为什么使用验证码?   验证码(CAPTCHA)是一种全自动程序。主要是为了区分“进行操作的是不是人”。如果没有验证码机制,将会导致以下的问题: 对特定网站不断进行登录,破解密码; 对某个网站创建账户; 对某个网站提交垃圾数据(灌水贴); 对某个网站进行刷票。 使用Servlet实现验证码   一个验证码包含两个部分:图片和输入框。 1 <s...

weixin_30580943的博客 194

直流无刷减速电机选型指南:从KV值到霍尔传感器,新手必看的5个关键参数

本文详细解析直流无刷减速电机选型的5个关键参数,包括KV值、转矩、电流与功率、减速比选择以及霍尔传感器配置。通过实战案例和避坑策略,帮助工程师精准匹配电机性能与负载需求,提升工业自动化设备的可靠性和效率。特别强调霍尔传感器在精准控制中的关键作用。

alice7model的博客 620

闲逛验证码江湖

文章目录验证码介绍一、手写图形验证码验证码的挑战:验证码的安全升级:二、手写表达式验证码三、体验开源验证码四、介绍商业验证码五、验证码的其他实现方式六、验证码的未来发展 验证码介绍 ​ 图形验证码(CAPTCHA),是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的图灵测试)的简称。其本质是一种区分用户是计算机还是人的公共全自动程序。可以有效的防止某些特定程序以暴力方式不断进行登录

roykingw的专栏 757

产品必备技能(十):如何绘制原型图?先要绘制页面流程图+页面原型图!附实操原型图、流程图实例(抖音)

文章目录目标题目实操步骤模板实操【抖音】APP的视频发布功能页面流程绘制页面流程图合格标准绘制页面原型图合格标准 目标 新入行的产品经理都对原型抱有向往的心境,但是有经验的产品经理不会一上来就画原型,而是先画页面流程再来画原型。通过学习,你将学会如何用页面流程图规划用户行为路径、如何借助原型识别问题、减少风险、有效沟通。 题目 任意选择一款你喜欢的产品,体验某个功能,下载并梳理此功能至少5个以上的页面流程跳转点(后面会解释),还原2 - 3个主要界面的低保真原型图。 实操步骤 可使用手绘以及Process

汪雯琦的博客 4841

Genesis物理引擎实战指南:轻量级确定性刚体仿真核心

刚体物理仿真作为机器人控制、嵌入式运动学验证和确定性游戏开发的基础技术,其核心在于数值稳定性、跨平台可复现性与约束求解精度。本文围绕线性互补问题(LCP)求解、半隐式欧拉积分和零依赖C++实现三大关键技术展开,解析如何在无GUI、低算力环境下构建可单步调试、帧级可控的确定性仿真系统。重点覆盖碰撞检测数学建模、关节局部坐标系绑定、质量-惯性张量一致性校验等工程落地关键点,适用于STM32、树莓派及教育实验场景。内容深度结合Genesis Physics Engine的源码实践,直击‘穿模’‘NaN’‘关节发软

ciya3282的博客 1589

登录认证学习

单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。 单系统登录过程: HTTP是无状态的协议,这意味着服务器无法确认用户的信息。于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。 如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”

Significance的博客 322

Go游戏服务器开发的一些思考(一):语言层面

Go是比C++更好用的高级语言使用Go作为服务器开发的主语言前,首先需要对Go语言做下定性。在接触Go前,可能给人的印象(至少是我),Go是一门脚本语言。看了 官方文档 ,才知道Go是一门高级语言。与C++相比,它有以下优势: 面向接口的编程没有C++复杂的面向对象语法,如类、继承、多态、虚函数等等。Go中只有结构与接口,从语言层面上,直接指导功能与功能间的解耦。直接且语法简单 提供语言反射机制提供

范安崇的博客 9559

kcaptcha php验证码,在后台执行短信验证码倒计时

前言我们一般做的短信验证码功能,应用在前台运行的时候,肯定是没有问题的,但是点击一下Home键进入后台挂起的状态,我们的定时器就停止了。网上很多说记录什么进入后台的时间,我觉的那太费事了,我们完全可以通过申请应用在后台执行来执行我们的倒计时。1、先放我们倒计时的代码,这段代码在模拟器运行是没有问题的,但是在真机进入挂起状态会停止(void)sentPhoneCodeTimeMethod {//倒计...

weixin_39777019的博客 198

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Django Rest framework(drf)serializer中进行验证的几种方式

验证顺序由上至下 1、to_internal_value 通过重写to_internal_value方法来验证,也可以在这里对数据做一些处理: class FormSerializer(ModelSerializer): def to_internal_value(self, data): # 验证 logo_name = data.get('logo', None) if not logo_name: # to_interna

快下锅的粽子的博客 3848

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

shiro 多字段作登录名登录

Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userInfo.getUserName(), userInfo.getPassword(), false); try { subject.login(usernameP...

卑微的码农 202

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

KgCaptcha 行为验证码自定义类型设置

现在大部分的网站和手机软件都会使用到验证码的登录、注册、操作提醒功能。但是,你知道验证码到底有多少类型吗?今天小编就利用KgCaptcha中的设置给你详细介绍一下。

weixin_40794177的博客 356

Spring Security 自定义身份认证处理器

概述 我们可以通过继承AuthenticationProvider或者其实现来完成自定义身份认证处理器 通常身份验证处理器主要是完成对用户名密码的验证和判断用户时候可用等 实现案例 以下是实现方法 1. 继承于AuthenticationProvider new AuthenticationProvider() { @Override public Authentication authenticate(Authentication authentication) throws Authenticati

u011618818的博客 604

若依框架-Shiro验证码校验过滤器源码分析

在将公司一个管理平台项目迁移到若依框架时,发现了其登录接口只接收 username 和 password 两个参数,并无验证码。查看源码发现 shiro 单独用了个过滤器处理验证码。

qq_31856061的博客 2681

在 Web 项目中应用 Apache Shiro 开源权限框架

Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证、授权、加密、会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证明你是谁? Web 应用程序一般做法通过表单提交用户名及密码达到认证目的。“授权”即是否允许已认证用户访问受保护资源。关于 Shiro 的一系列特征及优点,很多文章已有列举,这里不再逐一赘述,本文重点介绍 Shiro 在 Web Appli...

百威 388

Cakephp中使用Captcha实现更加安全的验证码

  Captcha官方 http://www.captcha.ru/en/ Captcha下载 http://www.captcha.ru/en/kcaptcha/ 本地下载1.2.6版本   首先可以使用如下程序得到验证码图片,注意在程序在生成图片时就调设置了会话变量。 getImage.php   &lt;?php  include('kcaptcha.php'); ...

dcj3sjt126com的专栏 206

Java怎样实现验证码?

我们总是在登录微信,QQ或者其他一些网页的时候,都会出现一个验证码框,他们有的是数字的,有的是文字的,有的是混合的,各种各样的。 很好奇是怎么实现的。带着这样的疑问。 1.随机数字字母组合的验证码 首先创建一个javaWeb的工程 然后在之前创建的随机数方法里,进行循环答应,输出4个随机数 ...

Slovenia_groot的博客 8179

springboot和shiro集成

加入依赖 <!--Shiro核心框架 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${shiro.version}</version> </...

weixin_41490593的博客 1078

shiro中通过返回更多用户信息

    shiro中通过返回更多用户信息     在重写的AuthorizingRealm中方法doGetAuthenticationInfo中传入封装的用户实体即可。   UserDetails userDetails=null;                   try {                     userDetails = this.userDetai...

yuhui666666的博客 481

JavaWeb - 验证码

为什么要学习验证码? 1、可以防止恶意破解密码、刷票、论坛灌水。 2、有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。 3、实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。 验证码实现的方式 1、字母数字混合验证码 import javax.imageio.ImageIO; import javax.servlet.http...

2308

一文搞定验证码(上部分)

tianai-captcha 验证码整体分为 生成器(ImageCaptchaGenerator)、校验器(ImageCaptchaValidator)、资源管理器(ImageCaptchaResourceManager) 其中生成器、校验器、资源管理器等都是基于接口模式实现 可插拔的,可以替换为自定义实现,灵活度高。这个方法是初始化资源的地方.初始化一些 系统的图片模板,系统的资源文件等。这就是验证码的重点方法之一.此方法里面有详细生成验证码的过程

longtime的博客 3451
上一篇: Shiro 自己实现登录后重新生成sessionid
下一篇: Java与XML的故事序:Jaxb和Jaxp
开心的D哥
博客等级 码龄22年 63粉丝 110原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值