From 7144a469ee917d86edd3f610ee0fd975ff7f5c58 Mon Sep 17 00:00:00 2001 From: liushaofeng Date: Thu, 22 Oct 2020 14:24:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E9=99=A4=E5=A4=9A=E4=BD=99=E9=9D=99?= =?UTF-8?q?=E6=80=81=E8=B5=84=E6=BA=90=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=96=B0=E7=9A=84=E6=BB=91=E5=9D=97=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=EF=BC=8C=20=E6=9B=B4=E6=94=B9=E7=89=88=E6=9C=AC=E5=8F=B71.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../slider/CacheSliderCaptchaTemplate.java | 51 ++++++++++++----- .../slider/DefaultSliderCaptchaTemplate.java | 20 +++++++ .../slider/SliderCaptchaResource.java | 53 +++++++++++++----- .../META-INF/cut-image/template/2/active.png | Bin 0 -> 7091 bytes .../META-INF/cut-image/template/2/fixed.png | Bin 0 -> 3582 bytes .../META-INF/cut-image/template/2/matrix.png | Bin 0 -> 1527 bytes 6 files changed, 95 insertions(+), 29 deletions(-) create mode 100644 src/main/resources/META-INF/cut-image/template/2/active.png create mode 100644 src/main/resources/META-INF/cut-image/template/2/fixed.png create mode 100644 src/main/resources/META-INF/cut-image/template/2/matrix.png diff --git a/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java b/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java index 82ff37b..baa82eb 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java +++ b/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java @@ -87,21 +87,6 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate { return poll; } - -// public static void main(String[] args) throws InterruptedException { -// SliderCaptchaTemplate captchaTemplate = new DefaultSliderCaptchaTemplate("jpeg", "png", true); -// -// captchaTemplate = new CacheSliderCaptchaTemplate(captchaTemplate, 20); -// TimeUnit.SECONDS.sleep(5); -// for (int i = 0; i < 100; i++) { -// long start = System.currentTimeMillis(); -// SliderCaptchaInfo info = captchaTemplate.getSlideImageInfo(); -// long end = System.currentTimeMillis(); -// System.out.println("耗时:" + (end - start)); -// TimeUnit.MILLISECONDS.sleep(10); -// } -// } - @Override public void addResource(URL url) { target.addResource(url); @@ -127,13 +112,49 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate { target.deleteResource(resource); } + @Override + public List listResources() { + return target.listResources(); + } + + @Override + public void clearResources() { + target.clearResources(); + } + @Override public void deleteTemplate(Map template) { target.deleteTemplate(template); } + @Override + public List> listTemplates() { + return target.listTemplates(); + } + + @Override + public void clearTemplates() { + target.clearTemplates(); + } + @Override public boolean percentageContrast(Float newPercentage, Float oriPercentage) { return target.percentageContrast(newPercentage, oriPercentage); } + + +// public static void main(String[] args) throws InterruptedException { +// SliderCaptchaTemplate captchaTemplate = new DefaultSliderCaptchaTemplate("jpeg", "png", true); +// +// captchaTemplate = new CacheSliderCaptchaTemplate(captchaTemplate, 20); +// TimeUnit.SECONDS.sleep(5); +// for (int i = 0; i < 100; i++) { +// long start = System.currentTimeMillis(); +// SliderCaptchaInfo info = captchaTemplate.getSlideImageInfo(); +// long end = System.currentTimeMillis(); +// System.out.println("耗时:" + (end - start)); +// TimeUnit.MILLISECONDS.sleep(10); +// } +// } + } diff --git a/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java b/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java index 8f339fc..4afc357 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java +++ b/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java @@ -129,11 +129,31 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate { resourceImageFiles.remove(resource); } + @Override + public List listResources() { + return Collections.unmodifiableList(resourceImageFiles); + } + + @Override + public void clearResources() { + resourceImageFiles.clear(); + } + @Override public void deleteTemplate(Map template) { templateImageFiles.remove(template); } + @Override + public List> listTemplates() { + return Collections.unmodifiableList(templateImageFiles); + } + + @Override + public void clearTemplates() { + templateImageFiles.clear(); + } + @Override public void addTemplate(Map template) { templateImageFiles.remove(template); diff --git a/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaResource.java b/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaResource.java index 760386d..d28632c 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaResource.java +++ b/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaResource.java @@ -17,13 +17,6 @@ public interface SliderCaptchaResource { */ void addResource(URL url); - /** - * 添加模板 - * - * @param template template - */ - void addTemplate(Map template); - /** * 设置资源 * @@ -31,13 +24,6 @@ public interface SliderCaptchaResource { */ void setResource(List resources); - /** - * 设置模板 - * - * @param imageTemplates imageTemplates - */ - void setTemplates(List> imageTemplates); - /** * 删除资源 * @@ -45,10 +31,49 @@ public interface SliderCaptchaResource { */ void deleteResource(URL resource); + /** + * 读取所有资源 + * + * @return List + */ + List listResources(); + + /** + * 清除所有资源 + */ + void clearResources(); + + /** + * 添加模板 + * + * @param template template + */ + void addTemplate(Map template); + + + /** + * 设置模板 + * + * @param imageTemplates imageTemplates + */ + void setTemplates(List> imageTemplates); + /** * 删除模板 * * @param template template */ void deleteTemplate(Map template); + + /** + * 查询所有模板 + * + * @return List> + */ + List> listTemplates(); + + /** + * 清除所有模板 + */ + void clearTemplates(); } diff --git a/src/main/resources/META-INF/cut-image/template/2/active.png b/src/main/resources/META-INF/cut-image/template/2/active.png new file mode 100644 index 0000000000000000000000000000000000000000..32f583879d79913ab3f51d0eb18e1f2028603d4c GIT binary patch literal 7091 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/META-INF/cut-image/template/2/fixed.png b/src/main/resources/META-INF/cut-image/template/2/fixed.png new file mode 100644 index 0000000000000000000000000000000000000000..a83b3648af552dbbdb1a9c8c81f45b5a966275cd GIT binary patch literal 3582 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 LTU@p2$=Lq^_(~^J literal 0 HcmV?d00001 diff --git a/src/main/resources/META-INF/cut-image/template/2/matrix.png b/src/main/resources/META-INF/cut-image/template/2/matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..0636cdf7eee4ca656a0472b1133d1a7de5f2a8f0 GIT binary patch literal 1527 zcmeHHJ#W)M7`~=0w3W)jz=s$t7pWlCALqttY&BF(oYF`nln|*IaqLTDTKkNBY20pQ zV`oB@7`ijEAkj!n3{*m5s)UHd00R<#fx9FQAXx=5V-G&RexB$3_LGgu?b(^DGXQ|u z(z;QlPY-~x*3>zAdf7f6w`&p6f%%c8(teRWEOF1sotw6*Gbb(<-;5 zi7>O6*0cpqkzrPnvl3hsU`9{Nx}tEyi>KZKyQx==wV^Nimg8H5__`!@IvugIDB@sC zf|{mDvLY#pKoLT?=Mgg!yl^g7Fi>a(j!zuyaZJ%{;5NzeG}1u|u3s*XguQTBC|WWp zGJOe(vgEofuRb~?RrE8AM08l&^O00VA#Mj2?MHJiCezxT?T7(sH2U4Zp-nM&3~aSs zFk{1%wvrz2Yp}vP)?M$v-2#`r|P{Vj9o`Q`QCOB+ipDPqt z*ER0OrsLVT6W(NP8f0ytz}ZFiT7X@yUuWG(h~e+@AMovet)E1LlGw2PGCZ+~P9!^y zR)M~ZmI--ug95rL&&NJ|0w8s%WUSVr({Jy`W&xObBX^I#9DOd$n;)+qy*^3#sd>LQ zQR#K354+RXvIiHl%#u1^=}laqmcuT!9E=Yw0~oUmV2s#@^@$_c@5Chi-U3K;l88-q mk`&9IllY%7Yu&@Ilb6B0lgW2ar%#`;Uva5eF<#^!JpKWQo#y-i literal 0 HcmV?d00001