Struts生成驗(yàn)證碼

驗(yàn)證碼增加了應(yīng)用的安全性寺庄,驗(yàn)證碼也有各種各樣拓颓,如數(shù)字字母組合膳算、漢字捺宗、點(diǎn)擊數(shù)字等八毯,其本質(zhì)就是后臺(tái)生成的驗(yàn)證碼與前端輸入的進(jìn)行校驗(yàn)昌阿,下面通過代碼來看一下:

1.編寫生成代碼的action類

import org.apache.commons.lang.RandomStringUtils;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import javax.imageio.ImageIO;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.util.Random;

public class ValidateCodeAction extends BaseAction {

public ActionForward getCode(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {

if (logger.isDebugEnabled()) {

logger.debug("進(jìn)入到ValidateCodeAction.getCode()方法");

}

try {

//設(shè)置圖片的長(zhǎng)度和寬度

int width =55;

int height = 20;

//生成一個(gè)4位的數(shù)字字母隨機(jī)組合

String codeStr = RandomStringUtils.random(4, true, true);

//設(shè)置response

response.setContentType("images/jpeg");

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

//獲取session

HttpSession session = request.getSession();

//生成驗(yàn)證

ServletOutputStream out = response.getOutputStream();

BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

Graphics graphics=image.getGraphics();

//設(shè)置背景顏色

graphics.setColor(getRandColor(200,250));

graphics.fillRect(0,0,width,height);

//設(shè)置字體

Font font=new Font("Times New Roman", Font.BOLD, 22);

graphics.setFont(font);

//設(shè)置邊框

graphics.setColor(Color.BLACK);

graphics.drawRect(0,0,width-1,height-1);

//設(shè)置干擾線

graphics.setColor(getRandColor(160,200));

Random random=new Random();

for (int i = 0; i < 155; i++) {

int x2 = random.nextInt(width);

int y2 = random.nextInt(height);

int x3 = random.nextInt(12);

int y3 = random.nextInt(12);

graphics.drawLine(x2, y2, x2 + x3, y2 + y3);

}

//將驗(yàn)證碼顯示到圖片中

graphics.setColor(new Color(20 + random.nextInt(110), 20 + random

.nextInt(110), 20 + random.nextInt(110)));

graphics.drawString(codeStr,4,16);

logger.debug("生成的驗(yàn)證碼:"+codeStr);

//將驗(yàn)證碼設(shè)置到session中

session.setAttribute("validateCode",codeStr);

//使圖片生效

graphics.dispose();

ImageIO.write((BufferedImage) image, "JPEG", out);

out.flush();

out.close();

} catch (Exception e) {

logger.debug("生成驗(yàn)證碼錯(cuò)誤:" + e.getMessage());

}

return null;

}

private Color getRandColor(int fc, int bc) { // 給定范圍獲得隨機(jī)顏色

Random random = new Random();

if (fc > 255)

fc = 255;

if (bc > 255)

bc = 255;

int r = fc + random.nextInt(bc - fc);

int g = fc + random.nextInt(bc - fc);

int b = fc + random.nextInt(bc - fc);

return new Color(r, g, b);

}

}

2.在struts的配置文件配置action

path="/validateCodeAction"

type="path/ValidateCodeAction"

scope="request"

parameter="mt"

unknown="false"

validate="false"

>

3.在jsp配置

用于傳入驗(yàn)證碼:

這樣就可以在登錄邏輯中判斷驗(yàn)證碼是否正確山害。當(dāng)訪問量過大時(shí)村生,驗(yàn)證碼放在session對(duì)服務(wù)器的壓力增加嘉涌,影響服務(wù)器的性能妻熊;若放在cookie中,則不安全洛心。綜合考慮使用的緩存固耘,將生成的驗(yàn)證碼存放到緩存中,設(shè)置失效時(shí)間词身,這樣既可以實(shí)現(xiàn)安全性也能減輕服務(wù)器的壓力厅目。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子损敷,更是在濱河造成了極大的恐慌葫笼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拗馒,死亡現(xiàn)場(chǎng)離奇詭異路星,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诱桂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門洋丐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挥等,你說我怎么就攤上這事友绝。” “怎么了肝劲?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵迁客,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我辞槐,道長(zhǎng)掷漱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任榄檬,我火速辦了婚禮卜范,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丙号。我一直安慰自己先朦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布犬缨。 她就那樣靜靜地躺著喳魏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怀薛。 梳的紋絲不亂的頭發(fā)上刺彩,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音枝恋,去河邊找鬼创倔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛焚碌,可吹牛的內(nèi)容都是我干的畦攘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼十电,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼知押!你這毒婦竟也來了叹螟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤台盯,失蹤者是張志新(化名)和其女友劉穎罢绽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體静盅,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡良价,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒿叠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片明垢。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖市咽,靈堂內(nèi)的尸體忽然破棺而出袖外,到底是詐尸還是另有隱情,我是刑警寧澤魂务,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站泌射,受9級(jí)特大地震影響粘姜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熔酷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一孤紧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拒秘,春花似錦号显、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羹应,卻和暖如春揽碘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背园匹。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工雳刺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裸违。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓掖桦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親供汛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枪汪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容