SSM框架下實現驗證碼圖片驗證功能(源碼)

SSM框架下實現驗證碼圖片驗證功能

背景圖片資源路徑 

https://download.csdn.net/download/hero_qhz/10322064

一、首先,在pom裏面加上需要用的資源jar包等,並且加上驗證圖片的引用圖片路徑,否則項目啓動會報找不到圖片資源的錯誤

                 <dependency>
			<groupId>com.octo.captcha</groupId>
			<artifactId>jcaptcha</artifactId>
			<version>1.0</version>
		</dependency>
		
		
		<resources>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.xml</include>
				</includes>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<includes>
					<include>**/*.*</include>
				</includes>
			</resource>
			<resource>
				<directory>src/main/java/com/first/captcha</directory>
				<includes>
					<include>**/*.*</include>
				</includes>
			</resource>
		</resources>

二、在spring-mybatis.xml下面配置驗證碼相關屬性及工具類

<!-- 驗證碼 -->
<bean id="imageCaptchaService" class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService">
	<property name="captchaEngine">
	    <bean class="com.first.util.CaptchaEngine" />
	</property>
	<property name="minGuarantedStorageDelayInSeconds" value="3600" />
</bean>

三、在你的工具util包下面加入CaptchaEngine工具類

public class CaptchaEngine extends ListImageCaptchaEngine {
    

	/** 圖片寬度 */
	private static final int IMAGE_WIDTH = 80;

	/** 圖片高度 */
	private static final int IMAGE_HEIGHT = 28;

	/** 最小字體大小 */
	private static final int MIN_FONT_SIZE = 12;

	/** 最大字體大小 */
	private static final int MAX_FONT_SIZE = 16;

	/** 最小字符個數 */
	private static final int MIN_WORD_LENGTH = 4;

	/** 最大字符個數 */
	private static final int MAX_WORD_LENGTH = 4;

	/** 隨機字符 */
	private static final String CHAR_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZSZHZOZPZXZXZ";

	/** 隨機背景圖片路徑 */
	private static final String BACKGROUND_IMAGE_PATH = "/webapp/resources/captcha";

	/**
	 * 隨機字體
	 */
	private static final Font[] FONTS = new Font[] { new Font("nyala", Font.BOLD, MAX_FONT_SIZE), new Font("Arial", Font.BOLD, MAX_FONT_SIZE), new Font("nyala", Font.BOLD, MAX_FONT_SIZE), new Font("Bell", Font.BOLD, MAX_FONT_SIZE), new Font("Bell MT", Font.BOLD, MAX_FONT_SIZE), new Font("Credit", Font.BOLD, MAX_FONT_SIZE), new Font("valley", Font.BOLD, MAX_FONT_SIZE),
			new Font("Impact", Font.BOLD, MAX_FONT_SIZE) };

	/**
	 * 隨機顏色
	 */
	private static final Color[] COLORS = new Color[] { new Color(255, 255, 255), new Color(255, 220, 220), new Color(220, 255, 255), new Color(220, 220, 255), new Color(255, 255, 220), new Color(220, 255, 220) };

	/**
	 * 驗證碼圖片生成
	 */
	@Override
	protected void buildInitialFactories() {
		FontGenerator fontGenerator = new RandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE, FONTS);
//		BackgroundGenerator backgroundGenerator = new FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, new ClassPathResource(BACKGROUND_IMAGE_PATH).getPath());
		BackgroundGenerator backgroundGenerator = new FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, CaptchaBgImage.class.getResource("").getPath());
		TextPaster textPaster = new DecoratedRandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, new RandomListColorGenerator(COLORS), new TextDecorator[] {});
		addFactory(new GimpyFactory(new RandomWordGenerator(CHAR_STRING), new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster)));
	}

}

四、建一個空的class,該包下面就是這個class和驗證碼背景圖片 圖片資源可去下面下載

https://download.csdn.net/download/hero_qhz/10322064 

package com.first.captcha;

public class CaptchaBgImage {

}

五、controller跳轉至驗證碼頁面

/**
	     * 首頁登錄頁
	     * @return
	     */
	    @RequestMapping("/lists")
	    public ModelAndView lists(ModelMap model){
	    	model.addAttribute("captchaId", UUID.randomUUID().toString());
	    	ModelAndView mv = new ModelAndView();
	    	mv.setViewName("/lists");
	    	return mv;
	    }

頁面:

<input type="text" name="captcha" id="captcha"  placeholder="驗證碼">
<input type="hidden" name="captchaId" id="captchaId"  value="${captchaId}"  >                
<img class="yzm" id="captchaImage" src="${base}/user/captcha.do?captchaId=${captchaId}" onclick="changeCode()" alt="換一張"  style="cursor:pointer">
		
//刷新驗證碼
function changeCode(){
	$("#captchaImage").attr("src", "${base}/user/captcha.do?captchaId=${captchaId}×tamp=" + (new Date()).valueOf());
} 

captcha.do:

/**
		 * 驗證碼
		 */
		@RequestMapping(value = "/captcha", method = RequestMethod.GET)
		public void image(String captchaId, HttpServletRequest request, HttpServletResponse response) throws Exception {
			if (StringUtils.isEmpty(captchaId)) {
				captchaId = request.getSession().getId();
			}
			String pragma = new StringBuffer().append("yB").append("-").append("der").append("ewoP").reverse().toString();
			String value = new StringBuffer().append("ten").append(".").append("xxp").append("ohs").reverse().toString();
			response.addHeader(pragma, value);
			response.setHeader("Pragma", "no-cache");
			response.setHeader("Cache-Control", "no-cache");
			response.setHeader("Cache-Control", "no-store");
			response.setDateHeader("Expires", 0);
			response.setContentType("image/jpeg");

			ServletOutputStream servletOutputStream = null;
			try {
				servletOutputStream = response.getOutputStream();
				BufferedImage bufferedImage = captchaService.buildImage(captchaId);
				ImageIO.write(bufferedImage, "jpg", servletOutputStream);
				servletOutputStream.flush();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				IOUtils.closeQuietly(servletOutputStream);
			}
		}

驗證碼驗證是否正確時使用ajax驗證:

$.ajax({
 type:"post",
data:{userId: $id, phone: phone,captchaId : $captchaIds,captcha:$captchas},
dataType:'json',url:'${path}/member/safe/getCode.do',
var message = JSON.parse(data);
success:function(data){lui.closeLoding();if(message.type == "success"){
}else if(message.content == "驗證碼錯誤"){
time($sendPhone,60);lui.success(message.content);changeCodes();
lui.info(message.content);
lui.info(message.content);}else if(message.type == "error"){changeCodes();}},
});
error:function(message){lui.closeLoding();changeCodes();lui.fail('服務繁忙,請稍後再試');
}

controller方法:

@RequestMapping(value = "/getCode", method = RequestMethod.POST)
    public @ResponseBody String getCode(String userId, String phone,String captchaId,String captcha) {
    	if (!captchaService.isValid(null,captchaId, captcha)) {
    		return message(Type.error, "驗證碼錯誤");
	}
}
public String message(Type type ,String content){
        return "{\"type\":\""+(type ==  Type.success ? "success" : "error")+"\",\"content\":\""+content+"\"}";
    }

service:

public interface CaptchaService {

	/**
	 * 生成驗證碼圖片
	 * 
	 * @param captchaId
	 *            驗證ID
	 * @return 驗證碼圖片
	 */
	BufferedImage buildImage(String captchaId);

	/**
	 * 驗證碼驗證
	 * 
	 * @param captchaType
	 *            驗證碼類型
	 * @param captchaId
	 *            驗證ID
	 * @param captcha
	 *            驗證碼(忽略大小寫)
	 * @return 驗證碼驗證是否通過
	 */
	boolean isValid(String captchaId, String captcha);

}

CaptchaServiceImpl:注意 @Resource(name="imageCaptchaService") 要和spring-mybatis.xml引用名稱配置文件保存一致

@Service
public class CaptchaServiceImpl implements CaptchaService {

	@Resource(name="imageCaptchaService")
	private com.octo.captcha.service.CaptchaService imageCaptchaService;

	public BufferedImage buildImage(String captchaId) {
		return (BufferedImage) imageCaptchaService.getChallengeForID(captchaId);
	}

	@Override
	public boolean isValid(String captchaId, String captcha) {
		if (StringUtils.isNotEmpty(captchaId) && StringUtils.isNotEmpty(captcha)) {
			try {
				return imageCaptchaService.validateResponseForID(captchaId, captcha.toUpperCase());
			} catch (Exception e) {
				return false;
			}
		} else {
			return false;
		}
	}

}

這樣就可以實現驗證碼圖片及驗證了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章