生活随笔
收集整理的這篇文章主要介紹了
struts2中jsp页面上验证码的生成
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如何在jsp頁面中顯示驗證碼:
?
驗證碼:<img?class="yzm_img"?align="middle"?id="validateImage"?src="p_w_picpathCode.action"?width="150"?height="40"?οnclick="this.src='p_w_picpathCode.action?time-'+(new?Date()).getTime();"/>? 自動發送p_w_picpathCode.action請求,struts2配置文件如下所寫:
?
?????????<action?name="p_w_picpathCode"?class="org.tarena.action.user.ImageAction">?????????????<result?name="success"?type="stream">?????????????????<param?name="inputName">p_w_picpathStream</param>?????????????????<param?name="bufferSize">2048</param>?????????????</result>?????????</action>? 相應的action如下:
?
public?class?ImageAction?{ ?????private?InputStream?p_w_picpathStream; ????? ?????public?InputStream?getImageStream()?{ ?????????return?p_w_picpathStream; ?????} ??????public?void?setImageStream(InputStream?p_w_picpathStream)?{ ?????????this.p_w_picpathStream?=?p_w_picpathStream; ?????} ??????public?String?execute(){ ?????????Map<String,BufferedImage>?map?=?ImageUtil.getImage(); ??????????????????String?key?=?map.keySet().iterator().next(); ?????????Map<String,Object>?session?=?ActionContext.getContext().getSession(); ?????????session.put("code",?key); ??????????????????BufferedImage?p_w_picpath?=?map.get(key); ?????????ByteArrayOutputStream?bos?=?new?ByteArrayOutputStream(); ?????????JPEGImageEncoder?jpeg?=?JPEGCodec.createJPEGEncoder(bos); ?????????try?{ ?????????????jpeg.encode(p_w_picpath); ?????????????byte[]?bts?=?bos.toByteArray(); ?????????????p_w_picpathStream?=?new?ByteArrayInputStream(bts); ?????????????return?"success"; ?????????}?catch?(IOException?e)?{ ?????????????e.printStackTrace(); ?????????????return?"error"; ?????????} ?????} ?}? 其中ImageUtil類如下:
?
public?final?class?ImageUtil?{ ?????private?static?final?String[]?chars?=?{?"2",?"3",?"4",?"5",?"6", ?????????????"7",?"8",?"9",?"a",?"b",?"c",?"d",?"e",?"f",?"g",?"h"?}; ?????private?static?final?int?SIZE?=?5; ?????private?static?final?int?LINES?=?20; ?????private?static?final?int?WIDTH?=?200; ?????private?static?final?int?HEIGHT?=?100; ?????private?static?final?int?FONT_SIZE?=?60; ????? ?????public?static?Map<String,BufferedImage>?getImage()?{ ?????????StringBuffer?sb?=?new?StringBuffer(); ?????????BufferedImage?p_w_picpath?=?new?BufferedImage(WIDTH,?HEIGHT, ?????????????????BufferedImage.TYPE_INT_RGB); ?????????Graphics?graphic?=?p_w_picpath.getGraphics(); ?????????graphic.setColor(Color.LIGHT_GRAY); ?????????graphic.fillRect(0,?0,?WIDTH,?HEIGHT); ?????????Random?ran?=?new?Random(); ??????????????????for(int?i=1;i<=SIZE;i++){ ????????????? ?????????????int?r?=?ran.nextInt(chars.length); ?????????????graphic.setColor(getRandomColor()); ?????????????graphic.setFont(new?Font(null,Font.BOLD+Font.ITALIC,FONT_SIZE)); ?????????????graphic.drawString(chars[r],(i-1)*WIDTH/SIZE?,?HEIGHT/2); ?????????????sb.append(chars[r]);?????????} ??????????????????for(int?i=1;i<=LINES;i++){ ?????????????graphic.setColor(getRandomColor()); ?????????????graphic.drawLine(ran.nextInt(WIDTH),?ran.nextInt(HEIGHT),?ran.nextInt(WIDTH),ran.nextInt(HEIGHT)); ?????????} ?????????Map<String,BufferedImage>?map?=?new?HashMap<String,BufferedImage>(); ?????????map.put(sb.toString(),?p_w_picpath); ?????????return?map; ?????} ????? ?????private?static?Color?getRandomColor(){ ?????????Random?ran?=?new?Random(); ?????????Color?color?=?new?Color(ran.nextInt(256),ran.nextInt(256),ran.nextInt(256)); ?????????return?color; ?????} ?} ? 這樣action就返回一個流文件到img標簽所在的位置,并直接顯示出來。
如果想增加“看不清楚換一張的功能”,那就重新再走一遍action,每走一次生成的驗證碼圖片都是隨機的。
如何驗證填寫的驗證碼是正確的呢?如下:
在頁面中使用jquery
?
$(function(){ ?????????????$("#validateCode").blur(function(){ ?????????????flag.validateCode=false; ?????????????var?txt?=?$(this).val(); ?????????????if(txt==""){ ?????????????????$("#msg").html("<img?src='../p_w_picpaths/right.gif'/>不能為空!");?????????????}else{ ?????????????????$.post( ?????????????????????"valid.action?dt="+new?Date().getTime(), ?????????????????????{"code":txt}, ?????????????????????function(data){ ?????????????????????????if(data.ok){ ?????????????????????????????$("#numberInfo").html("<img?src='../p_w_picpaths/right.gif'/>驗證碼正確!"); ?????????????????????????????flag.validateCode=true; ?????????????????????????}else{ ?????????????????????????????$("#numberInfo").html("<img?src='../p_w_picpaths/wrong.gif'/>驗證碼不正確!"); ?????????????????????????} ?????????????????????}, ?????????????????????"json"?????????????????); ?????????????} ?????????}); ??});? 使用了ajax局部刷新,里面的#msg,#numberInfo這都是一些div塊的id,這就不用多說了,下面再寫一下valid.action所指向的action:
struts2配置文件中如下所寫:
?
?????<action?name="valid"?class="org.tarena.action.user.ValidImageAction">?????????<result?name="success"?type="json"></result>?????</action>? 則所指向的action為ValidImageAction:
?
public?class?ValidImageAction?{ ?????private?String?code?=?""; ?????private?boolean?ok?=?false; ????? ?????public?boolean?isOk()?{ ?????????return?ok; ?????} ??????public?void?setOk(boolean?ok)?{ ?????????this.ok?=?ok; ?????} ??????public?String?execute(){ ?????????Map<String,Object>?session?=?ActionContext.getContext().getSession(); ??????????????????String?scode?=?(String)session.get("code"); ?????????if(code.equals(scode)){ ?????????????ok?=?true; ?????????}else{ ?????????????ok?=?false; ?????????} ?????????return?"success"; ?????} ??????@JSON(serialize=false)?????public?String?getCode()?{ ?????????return?code; ?????} ??????public?void?setCode(String?code)?{ ?????????this.code?=?code; ?????} ????? ?}? 以上使用的是struts2做控制器,如果是servlet或者struts也一樣,稍微改動一下
轉載于:https://blog.51cto.com/4045060/765285
總結
以上是生活随笔為你收集整理的struts2中jsp页面上验证码的生成的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。