前端+servlet獲得驗證碼圖片
阿新 • • 發佈:2018-12-15
網頁通過servlet獲得驗證碼圖片,並且可以點選更新
jsp中
<img src="/MYSystem/servlet/ImageServlet" onClick="refresh(this);" />
<script>
function refresh(obj){
obj.src="/MYSystem/servlet/ImageServlet?"+Math.random();
}
</script>
注意:必須要有Math.random()才能點選重新整理,不然瀏覽器認為圖片地址沒有發生改變,圖片不會重新整理。
public void doGet(HttpServletRequest req,HttpServletResponse res)throws IOException,ServletException{ res.setContentType("image/jpeg");//設定響應型別,告訴瀏覽器輸出的內容為圖片 res.setHeader("Pragma","No-cache");//設定響應頭資訊,告訴瀏覽器不要快取此內容 欄位名 欄位值 res.setHeader("Cache-Control","nocache"); res.setDateHeader("Expire",0); RandomValidate validate=new RandomValidate(); try{ validate.getRandom(req,res);//輸出圖片 } catch(Exception e){ e.printStackTrace(); } } public void doPost(HttpServletRequest req,HttpServletResponse res)throws IOException,ServletException{ doGet(req,res); }
RandomValidate類
public static final String RANDOMCODEKEY="codekey";//sessionID private Random random=new Random();//random物件 private String randString="123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private int width=80;//圖片寬 private int height=25;//圖片高 private int lineSize=40;//干擾線數量 private int stringNum=4;//隨機字元數量 /* *獲得字型 */ private Font getFont(){ return new Font("Fixedsys",Font.CENTER_BASELINE,18);//字的特徵 } /* *生成隨機圖片 */ public void getRandom(HttpServletRequest req,HttpServletResponse res){ HttpSession session=req.getSession(); BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR); Graphics g=image.getGraphics();//產生BUfferedImage的物件Graphics物件,該物件可以在圖片上進行繪製操作 g.fillRect(0,0,width,height);//矩形的 座標 及 長 寬 g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18)); g.setColor(new Color(118,36,48));//隨機顏色 //繪製干擾線 for(int i=0;i<=lineSize;i++){ draw(g); } //繪製隨機字元 String randomString= "";//注意前面必須要有空格 for(int i=1;i<=stringNum;i++){ randomString=drawS(g,randomString,i); } session.setAttribute(RANDOMCODEKEY, randomString);//randomString 是獲得的驗證碼字串 g.dispose();//釋放資源 try{ ImageIO.write(image, "JPEG", res.getOutputStream());//將記憶體中的圖片通過流的形式輸到客戶端 }catch(Exception e){ e.printStackTrace(); } } //繪製字串 private String drawS(Graphics g,String randomString,int i){ g.setFont(getFont());//重獲得驗證碼字元的字型 g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));//重獲隨機顏色 String rand=String.valueOf(getRandom(random.nextInt(randString.length())));//從字串的長度裡隨機獲得字串 randString+=rand; g.translate(random.nextInt(3),random.nextInt(3));//就是將random.nextInt(3) random.nextInt(3)變成原點 g.drawString(rand,13*i,16); return randomString; } //繪製干擾線 private void draw(Graphics g){ int x=random.nextInt(width); int y=random.nextInt(height); int x1=random.nextInt(13); int y1=random.nextInt(15); g.drawLine(x,y,x+x1,y+y1); } //獲得隨機字元 private String getRandom(int num){ return String.valueOf(randString.charAt(num));//獲得12345..xyz的隨機字串 注:char String.charAt(i)獲得i處索引的值 }
最終結果