Git Product home page Git Product logo

easycaptcha's People

Contributors

dependabot[bot] avatar dhb52 avatar ele-admin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easycaptcha's Issues

在华为云的鲲鹏机器上,生成的验证码会产生失真。更神奇的是,只有这一台机器会产生失真。别的机器都不会失真

image
image
image

系统信息:

Linux hadoop1 4.18.0-80.7.2.el7.aarch64 #1 SMP Thu Sep 12 16:13:20 UTC 2019 aarch64 aarch64 aarch64 GNU/Linux

Java 信息:

java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)

代码片段:

       SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 4);
        CaptchaDto captchaDto = new CaptchaDto();
        captchaDto.setImage(specCaptcha.toBase64());

支持的Java版本

作者你好,谢谢你贡献这个成果!在查看使用文档的时候,我发现没有提及该库支持的Java版本,我想知道它支持JDK 11吗?因为之前我使用过一个很老的验证码库,它在linux系统的JDK 11环境下会因为字体文件问题出错。

部分符号无法展示

之前我也写了一个类似的验证码工具,想参考下作者的漂亮字体,测试算术计算验证码发现有部分字体无法展示+、-、=符号

升级springboot3 验证码升级

作者你好,很喜欢你这个验证码,但是现在系统升级到了springboot3 ,里面没有javax这个包了,所以你可不可也升级一下,兼容springboot3版本呀

在docker中运行报错java.io.IOException: Problem reading font data.

java.io.IOException: Problem reading font data.
at java.awt.Font.createFont0(Font.java:1000) ~[?:1.8.0_111-internal]
at java.awt.Font.createFont(Font.java:877) ~[?:1.8.0_111-internal]
at com.wf.captcha.base.Captcha.setFont(Captcha.java:277) ~[easy-captcha-1.6.2.jar!/:?]
at com.wf.captcha.base.Captcha.setFont(Captcha.java:273) ~[easy-captcha-1.6.2.jar!/:?]
at com.wf.captcha.base.Captcha.setFont(Captcha.java:269) ~[easy-captcha-1.6.2.jar!/:?]

docker里没有字体?

算数验证码中生成结果部分为整形,部分为浮点型

对算数型验证码进行测试:
for (int i = 0; i < 100; i++) { Captcha captcha = new ArithmeticCaptcha(111, 36, 3); System.out.println(captcha.text()); }
测试的结果中,少部分结果是浮点型,这样前端输验证码是肯定匹配错误的
7.0
1
-10
2.0
24
16
7
-4.0

下次更新版本时,希望能保留一下旧的版本在maven**仓库中

我原本使用

            <dependency>
                <groupId>com.github.whvcse</groupId>
                <artifactId>easyCaptcha</artifactId>
                <version>1.5.0</version>
            </dependency>

现在**仓库已经没有这个包了。(https://repo1.maven.org/maven2/com/github/whvcse/)

每次一联网打包,就报错了

[ERROR] Failed to execute goal on project mvc: Could not resolve dependencies for project : Could not find artifact com.github.whvcse:EasyCaptcha:jar:1.5.0 in central (http://repo.maven.apache.org/maven2) -> [Help 1]

希望下次能注意一下,同时感谢您给我们带来如此方便好用的工具

javax.imageio.IIOException: I/O error writing PNG file!

报错 :javax.imageio.IIOException: I/O error writing PNG file!

/** * 创建图片 * * @param captchaId(图片) * @return */ @SneakyThrows public BufferedImage createImageCaptcha(String captchaId) { Assert.hasText(captchaId, "captchaId不能为空"); String key = generateImageCacheKey(captchaId); // 三个参数分别为宽、高、位数 Captcha captcha = new SpecCaptcha(130, 48, 5); // 设置字体 // captcha1.setFont(new Font("Verdana", Font.PLAIN, 32)); // 有默认字体,可以不用设置 redisTemplate.opsForValue().set(key, captcha.text()); redisTemplate.expire(key, IMAGE_EXPIRE_MINUTE, TimeUnit.MINUTES); ByteArrayOutputStream baos = new ByteArrayOutputStream(); captcha.out(baos); byte[] data = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(data); BufferedImage image = ImageIO.read(bais); baos.close(); bais.close(); return image; }

specCaptcha.setFont 报错 java.util.zip.ZipException: invalid code lengths set

java.util.zip.ZipException: invalid code lengths set at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) at org.springframework.boot.loader.jar.ZipInflaterInputStream.read(ZipInflaterInputStream.java:52) at java.io.FilterInputStream.read(FilterInputStream.java:107) at java.awt.Font.createFont0(Font.java:936) at java.awt.Font.createFont(Font.java:877) at com.wf.captcha.base.Captcha.setFont(Captcha.java:277) at com.wf.captcha.base.Captcha.setFont(Captcha.java:273) at net.hopemobi.put.manage.api.controller.CaptchaController.getCode(CaptchaController.java:44)

原代码为
SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 4); specCaptcha.setFont(Captcha.FONT_1, 38);

在docker里运行失败

描述

  1. 正常调试无问题

  2. 打包成 docker 后,报空指针

docker file

FROM frolvlad/alpine-oraclejdk8:slim
# 包与运行
RUN mkdir /data
ADD ./target/mini-admin-0.0.1-SNAPSHOT.jar /data/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-server", "-Xmx2048m", "-Xms2048m","-Dspring.profiles.active=prod", "/data/app.jar"]

Error

2020-04-12T15:56:43.381351900Z 2020-04-12 23:56:43.380 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
2020-04-12T15:56:43.381417400Z
2020-04-12T15:56:43.381439100Z java.lang.NullPointerException: null
2020-04-12T15:56:43.381459400Z 	at com.wf.captcha.base.ArithmeticCaptchaAbstract.alphas(ArithmeticCaptchaAbstract.java:42) ~[easy-captcha-1.6.2.jar!/:na]
2020-04-12T15:56:43.381479900Z 	at com.wf.captcha.base.Captcha.checkAlpha(Captcha.java:156) ~[easy-captcha-1.6.2.jar!/:na]
2020-04-12T15:56:43.381500000Z 	at com.wf.captcha.base.Captcha.text(Captcha.java:137) ~[easy-captcha-1.6.2.jar!/:na]

....

docker使用openjdk:8-jre-alpine环境的时候缺少字体

java.lang.NullPointerException
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
at sun.font.SunFontManager$2.run(SunFontManager.java:431)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.(SunFontManager.java:376)
at sun.awt.FcFontManager.(FcFontManager.java:35)
at sun.awt.X11FontManager.(X11FontManager.java:57)
at sun.reflect.GeneratedConstructorAccessor70.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at sun.font.SunFontManager.getInstance(SunFontManager.java:250)
at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:264)
at sun.java2d.SunGraphics2D.getFontMetrics(SunGraphics2D.java:856)
at com.wf.captcha.GifCaptcha.graphicsImage(GifCaptcha.java:116)
at com.wf.captcha.GifCaptcha.out(GifCaptcha.java:65)
at com.wf.captcha.base.Captcha.toBase64(Captcha.java:127)
at com.wf.captcha.GifCaptcha.toBase64(GifCaptcha.java:85)

一点建议

我有个不成熟的想法
其实可以使用注解的方式来注入到spring里面,比如说

@SendCaptcha
@GetMapping
public void captcha(@CaptchaValue String code) {
    return Result.ok(code);
}

另外作者可以贴一个收款码,我略尽点微薄之力
还可以试着申请一下idea的开源项目认证,可以拿一个正版的许可证

验证验证码时,是不是需要将验证码失效?

	/**
	 * 验证验证码,用于分离的项目
	 */
	public boolean ver(String key, String code, HttpServletRequest rq) {
		ServletContext sc = rq.getServletContext();
		String keyName = codeName + "-" + key;
		String captcha = (String) sc.getAttribute(keyName);
		return code.equals(captcha);
	}

是不是应该有sc.removeAttribute(keyName);操作

生成数字图片验证报ArrayIndexOutOfBoundsException (版本: 1.5.0)

jdk版本:openjdk 1.8.0_102
easyCaptcha版本: 1.5.0

生成数字图片验证报ArrayIndexOutOfBoundsException (版本: 1.5.0)

具体代码如下:
SpecCaptcha specCaptcha = new SpecCaptcha(120, 60, 4); specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER); String code = specCaptcha.text(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); specCaptcha.out(outputStream); String png = Algorithm.base64Encode(outputStream.toByteArray());

堆栈信息如下,请问这个是什么问题?
错误堆栈

放在服务器验证码是乱码

在本地测试正常显示,但是放在服务器,验证码就乱了。不是字符乱码的问题,因为只有数字和字母,用的也是默认字体。感觉是在渲染干扰线的时候,就乱了。。。这个怎么解决呢?

尝试GraalVM编译native image的时候不支持。

有可能换个实现,不依赖java.awt.image吗?我们程序用的quarkus.io,他可以使用GraalVM编译成本地镜像,降低memory的footprint,提高启动速度等。但是,尝试整合的时候,发现没有java.awt.image的支持。

Caused by: java.lang.UnsupportedOperationException: Not implemented yet for GraalVM native images
        at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:15)
        at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1181)
        at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1170)
        at com.wf.captcha.SpecCaptcha.graphicsImage(SpecCaptcha.java:63)
        at com.wf.captcha.SpecCaptcha.out(SpecCaptcha.java:45)
        at net.kaiba.blueeyes.captcha.CaptchaResource.generate(CaptchaResource.java:35)
        at java.lang.reflect.Method.invoke(Method.java:566)
        at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:167)
        at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
        at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:621)
        at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:487)
        at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:437)
        at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:362)
        at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:439)
        at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:400)
        at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:374)
        at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:67)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:488)
        ... 19 more

修改长度后不能验证

修改验证码长度为4位时,这里的顺序好像会导致返回前端的是4位,但服务端存储的还是5位
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.