spring mvc 整合 jcaptcha 生成圖形驗證碼
阿新 • • 發佈:2018-12-31
jcaptcha是一個開源的用來生成驗證碼的Java開源元件
maven依賴
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha</artifactId>
<version>1.0</version>
</dependency>
一般倉庫中沒有對應的jar,比如imaging-01012005.jar那麼需要手動新增倉庫
<repository>
<id >atlassian</id>
<name>atlassian</name>
<url>http://maven.jahia.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
spring配置bean
<context:component-scan base-package="com.pobaicn.ai" />
<bean id="captchaService"
class="com.octo.captcha.service.multitype.GenericManageableCaptchaService">
<description>驗證碼服務</description>
<constructor-arg index ="0">
<ref bean="com.pobaicn.ai.component.CSRCaptchaEngine" />
</constructor-arg>
<constructor-arg index="1">
<value>300</value>
</constructor-arg><!--超時時間 秒 -->
<constructor-arg index="2">
<value>20000</value>
</constructor-arg><!--最大併發數 -->
<constructor-arg index="3">
<value>20000</value>
</constructor-arg>
</bean>
com.pobaicn.ai.component.CSRCaptchaEngine類
@Component("com.pobaicn.ai.component.CSRCaptchaEngine")
public class CSRCaptchaEngine extends ListImageCaptchaEngine {
@Override
protected void buildInitialFactories() {
int minWordLength = 4;
int maxWordLength = 5;
int fontSize = 50;
int imageWidth = 152;
int imageHeight = 100;
WordGenerator wordGenerator = new RandomWordGenerator(
"0123456789abcdefghijklmnopqrstuvwxyz");
TextPaster randomPaster = new DecoratedRandomTextPaster(minWordLength,
maxWordLength, new RandomListColorGenerator(new Color[] {
new Color(23, 170, 27), new Color(220, 34, 11),
new Color(23, 67, 172) }), new TextDecorator[] {});
BackgroundGenerator background = new UniColorBackgroundGenerator(
imageWidth, imageHeight, Color.white);
FontGenerator font = new RandomFontGenerator(fontSize, fontSize,
new Font[] { new Font("nyala", Font.BOLD, fontSize),
new Font("Bell MT", Font.PLAIN, fontSize),
new Font("Credit valley", Font.BOLD, fontSize) });
ImageDeformation postDef = new ImageDeformationByFilters(
new ImageFilter[] {});
ImageDeformation backDef = new ImageDeformationByFilters(
new ImageFilter[] {});
ImageDeformation textDef = new ImageDeformationByFilters(
new ImageFilter[] {});
WordToImage word2image = new DeformedComposedWordToImage(font,
background, randomPaster, backDef, textDef, postDef);
addFactory(new GimpyFactory(wordGenerator, word2image));
}
JPEGImageEncoder 這個不是jdk標準類,位於com.sun.image.codec.jpeg; 只需將jdk還成jre即可
controller層
@Controller
@RequestMapping("api")
public class ApiController extends BaseController {
@Autowired
private GenericManageableCaptchaService captchaService;
@RequestMapping(value = "getCode", method = RequestMethod.GET)
public void getCode(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
byte[] captchaChallengeAsJpeg = null;
// 輸出jpg的位元組流
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
String captchaId = httpServletRequest.getSession().getId();
BufferedImage challenge = (BufferedImage) captchaService
.getChallengeForID(captchaId,
httpServletRequest.getLocale());
// a jpeg encoder
JPEGImageEncoder jpegEncoder = JPEGCodec
.createJPEGEncoder(jpegOutputStream);
jpegEncoder.encode(challenge);
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
// flush it in the response
httpServletResponse.setHeader("Cache-Control", "no-store");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
httpServletResponse.setContentType("image/jpeg");
ServletOutputStream responseOutputStream = httpServletResponse
.getOutputStream();
responseOutputStream.write(captchaChallengeAsJpeg);
responseOutputStream.flush();
responseOutputStream.close();
} catch (Exception e) {
try {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
} catch (IOException e1) {
e1.printStackTrace();
}
return;
}
}
}
呼叫方法
<img src="domin/api/getcode"
onclick="this.src='domin/api/getcode?d='+new Date()*1" width="160" height="30"/>
後臺校驗
Boolean isCorrect = Boolean.FALSE;
String captchaId = request.getSession().getId();
String code = request.getParameter("code");
try {
isCorrect = captchaService.validateResponseForID(captchaId,code);//true is right
//...dosomething
} catch (Exception e) {
log.error(e.getMessage());
}