- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们在我的团队正在编写的一个小应用程序中使用 JCaptcha 作为验证码工具。然而,就在开发期间(在一个小团队中——我们 4 个人),我们遇到了一些针对实际验证码的诅咒词和其他可能令人反感的词。有没有办法过滤掉可能令人反感的词,以免它们呈现给用户?
最佳答案
我花时间下载 JCaptcha 并查看源代码。基本上 JCatpcha 的工作方式与除了 ReCaptcha 之外的每个验证码 一样。因此,您想要的是微不足道的。
JCaptcha 使用了 WordGenerator 的非常简单的概念,它是一个接口(interface):
public interface WordGenerator {
String getWord(Integer length);
String getWord(Integer length, Locale locale);
}
让我们忽略本地化。
典型的用法是这样的:
WordGenerator words = ...
WordToImage word2image = new SimpleWordToImage();
ImageCaptchaFactory factory = new GimpyFactory(words, word2image);
pixCaptcha = factory.getImageCaptcha();
在他们的单元测试中我们可以看到,出于测试目的:
WordGenerator words = new DummyWordGenerator("TESTING");
WordToImage word2image = new SimpleWordToImage();
ImageCaptchaFactory factory = new GimpyFactory(words, word2image);
pixCaptcha = factory.getImageCaptcha();
请注意,我们可以完全控制所使用的“WordGenerator”。
这是我刚写的一个(可用的,功能齐全的)单词生成器:
private static final Random r = new Random( System.currentTimeMillis() );
public String getWord( final Integer length ) {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
final int rnd = r.nextInt( 52 );
final char c = (char) (rnd < 26 ? 'a' + rnd : 'A' + (rnd-26));
sb.append( c );
}
return sb.toString();
}
它生成像这样的随机“词”:
fqXVxId
cdVWBSZ
zXeJFaY
aeoSeEb
OuBfzvL
unYewjG
EhbzRup
GkXkTyQ
yDGnHmh
mRFgHWM
FFBkTLF
DvCHIIT
fDmjqLH
XMWSOpa
muukLLN
jUedgYK
FlbWARe
WohMMgZ
lmeLHau
djHRqlc
请注意,如果您更喜欢“真实文字”(例如 reCaptcha,但 reCaptcha 将真实文字用于另一个目的——因为它有助于扫描/OCR 书籍!)这不是问题,只需更改 getWord(. ..) 从字典中随机挑选单词。
现在您如何防止侮辱性词语被拾取?这是微不足道的。在这里,我只举一个例子(请不要争论代码,它实际上只是一个例子,说明如何可以完成):
private static final Set<String> s = new HashSet<String>();
static {
s.add( "f**k" );
s.add( "suck" );
s.add( "dick" );
}
private static final Random r = new Random( System.currentTimeMillis() );
public String getWord( Integer length ) {
String cand = getRandomWord( length );
while ( isSwearWord(cand) ) {
cand = getRandomWord( length );
}
return cand;
}
private boolean isSwearWord( final String w ) {
return s.contains( w.toLowerCase() );
}
public String getRandomWord( final Integer length ) {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
final int rnd = r.nextInt( 52 );
final char c = (char) (rnd < 26 ? 'a' + rnd : 'A' + (rnd-26));
sb.append( c );
}
return sb.toString();
}
现在,如果你想防止脏话,你可能还想防止那些接近脏话(例如“fvck”和“dikk” 等)。这又是微不足道的:
private boolean isSwearWord( final String w ) {
List<String> ls = generateAllPermutationsWithLevenhsteinEditDistanceOne(w);
for ( final String cand : ls ) {
if ( s.contains( cand.toLowerCase()) ) {
return true;
}
}
return false;
}
“generateAllPermutationsWithLevenhsteinEditDistanceOne(w)” 方法的编写留给读者作为练习。
关于java - 有没有办法从 Jcaptcha 中过滤掉攻击性的词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555966/
我是一名优秀的程序员,十分优秀!