ele-admin / easycaptcha Goto Github PK
View Code? Open in Web Editor NEWJava图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。
License: Apache License 2.0
Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。
License: Apache License 2.0
Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null……
系统信息:
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版本,我想知道它支持JDK 11吗?因为之前我使用过一个很老的验证码库,它在linux系统的JDK 11环境下会因为字体文件问题出错。
原来白色和网站风格不太搭
默认的生成格式是png,但是输出设置的头内容类型是gif,这在IE下会导致DOM7009异常
建议增加格式自定义设置
之前我也写了一个类似的验证码工具,想参考下作者的漂亮字体,测试算术计算验证码发现有部分字体无法展示+、-、=符号
作者你好,很喜欢你这个验证码,但是现在系统升级到了springboot3 ,里面没有javax这个包了,所以你可不可也升级一下,兼容springboot3版本呀
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
我原本使用
<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!
/** * 创建图片 * * @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; }
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 后,报空指针
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"]
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]
....
centos7为什么中文字体无法显示
我知道是因为fontconfig这个东西,我想说的是可否改成不依赖这个fontconfig,这样就无需对程序运行环境进行修改了
(google的captcha有同样的这个问题)
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)
算术类型验证码随机性不大,一位数结果较多,尤其是0验证码出现的概率异常高,安全性不高。
希望能优化算法,使产生的验证码结果更随机,比如使用两位数(0-99)的加减法
我有个不成熟的想法
其实可以使用注解的方式来注入到spring里面,比如说
@SendCaptcha
@GetMapping
public void captcha(@CaptchaValue String code) {
return Result.ok(code);
}
另外作者可以贴一个收款码,我略尽点微薄之力
还可以试着申请一下idea的开源项目认证,可以拿一个正版的许可证
如题,在无session的情况下有解决方案吗? 通常需要返回给客户端一个captchaId.
/**
* 验证验证码,用于分离的项目
*/
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);操作
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());
输入负号实在是太麻烦了,希望能输入纯数字。
在本地测试正常显示,但是放在服务器,验证码就乱了。不是字符乱码的问题,因为只有数字和字母,用的也是默认字体。感觉是在渲染干扰线的时候,就乱了。。。这个怎么解决呢?
同上
Warning: Nashorn engine is planned to be removed from a future JDK release
用的是阿里云
有可能换个实现,不依赖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
希望增加设置干扰线数量以及字体模糊的功能
SpecCaptcha captcha = new SpecCaptcha(130, 48, 4);
System.out.println(captcha.toBase64());
调用 captcha.toBase64() 方法 会导致系统内存持续上涨,求解决方案
远程攻击者可借助暴力破解的方法利用该漏洞绕过访问限制,之前用 kaptcha 时,GitHub一直提醒我这个问题。
做了一个简单的压测,普通字母png比中文png慢很多,数据如下:
https://github.com/power4j/java-perf/tree/master/easy-captcha
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.