1. 程式人生 > >算術表示式圖形驗證碼的實現

算術表示式圖形驗證碼的實現

goods_detail.html

<script>

function getMiaoshaPath(){
var verifyCode = $("#verifyCode").val();
if(verifyCode == ""){
layer.msg("請輸入結果");
return false;
}
$.ajax({
url: '/miaosha/generate_path',
type: "GET",
data: {//post提交表單的時候,url引數可以放在data中
goodsId: $("#goodsId").val(),
verifyCode: $("#verifyCode").val()
},
success:function(data){
if(data.code == 0){
doMiaosha(data.data);//相當於是產生的uuid
}else{
layer.msg(data.msg);

}
},
error:function(){
layer.msg("客戶端請求有誤");
}
});

}

MiaoshaController

@RequestMapping(value="/generate_path", method=RequestMethod.GET)
@ResponseBody
    public Result<String> generate_path(MiaoshaUser user, 
    @RequestParam("goodsId")long goodsId,
    @RequestParam("verifyCode")int verifyCode) {
if(user == null){
return Result.error(CodeMsg.SESSION_ERROR);
}
//這裡判斷驗證碼是否輸入正確,如果不正確,則不產生秒殺介面的地址
boolean pass = miaoshaService.passVerifyCode(user,goodsId,verifyCode);
if(!pass){
return Result.error(CodeMsg.VERIFY_CODE_ERROR);

}

MiaoshaService

@RequestMapping(value="/verifyCode", method=RequestMethod.GET)
@ResponseBody
 public Result<String> verifyCode(HttpServletResponse response, MiaoshaUser user, @RequestParam("goodsId")long goodsId) {
if(user == null){
return Result.error(CodeMsg.SESSION_ERROR);
}
BufferedImage image = miaoshaService.

createVerifyCode(user, goodsId);
try{
OutputStream out = response.getOutputStream();//輸出流就相當於返回的資料
ImageIO.write(image, "JPEG", out);
out.flush();
out.close();
return null;
}catch(Exception e){
e.printStackTrace();
return Result.error(CodeMsg.MIAOSHA_FAIL);
}
}

public BufferedImage createVerifyCode(MiaoshaUser user, long goodsId) {
if(user == null || goodsId < 0){
return null;
}
int width = 80;
int height = 32;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);//建立記憶體快取區
Graphics g = image.getGraphics();//建立畫筆
//set the background color
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
//draw the border
g.setColor(Color.black);
g.drawRect(0, 0, width - 1, height - 1);
//create a random instance to generate the codes
Random rdm = new Random();
//make some confusion
for(int i = 0; i < 60; i++){//畫一些干擾的小點點
int x = rdm.nextInt(width);
int y = rdm.nextInt(height);
g.drawOval(x, y, 0, 0);
}
//generate a random code
String verifyCode = generateVerifyCode(rdm);//
表示式
g.setColor(new Color(0, 100, 0));
g.setFont(new Font("Candara", Font.BOLD, 24));
g.drawString(verifyCode, 8, 24);
g.dispose();
//把驗證碼(計算結果)存到redis中
int md = calc(verifyCode);//對錶達式進行計算
redisService.set(MiaoshaKey.getVerifyCode, "" + user.getId() + "_" + goodsId, md);//計算結果存入redis
return image;
}
@SuppressWarnings("restriction")
private Integer calc(String exp) {//返回計算結果
try{
ScriptEngineManager manager = new javax.script.ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
Object obj = engine.eval(exp);
String str = obj.toString();
Double dou = Double.parseDouble(str.toString());
int in = dou.intValue();
return in;

}catch(Exception e){
e.printStackTrace();
}
return 0;
}

private static char[] ops = new char[]{'+', '-', '*'};
private String generateVerifyCode(Random rdm) {//產生算術表示式
int num1 = rdm.nextInt(10);
int num2 = rdm.nextInt(10);
int num3 = rdm.nextInt(10);
char op1 = ops[rdm.nextInt(3)];
char op2 = ops[rdm.nextInt(3)];
String exp = "" + num1 + op1 + num2 + op2 + num3;
return exp;
}

public boolean passVerifyCode(MiaoshaUser user, long goodsId, int verifyCode) {//表單輸入的驗證
Integer vc = redisService.get(MiaoshaKey.getVerifyCode,"" + user.getId() + "_" + goodsId, Integer.class);
if(vc!=null && (vc - verifyCode == 0)){
return true;
}
//這裡刪除redis中的結果
redisService.delete(MiaoshaKey.getVerifyCode,"" + user.getId() + "_" + goodsId);
return false;
}