01-短信验证码、动态验证码

说明:(生成Gif、Png类型的图形验证码)

最近两次做项目,一些功能性的代码重复的写因此非常的麻烦。因此记录一下,以防下次。

1、功能性代码:图形绘制、验证码生成。

1、导入别人写好的工具父类、以及需要支持的工具类。(最主要的)

工具类已经被我导出成Jar的形式:工具类地址

  1. 父类 Captcha、两个子类 PngCaptchaGifCaptcha
    01-短信验证码、动态验证码

2、编写一个公共的Controller请求、用于复用获取图形验证码。

  /**
	 * @param time 
	 * 回调多次请求的时候根据系统当前时间来进行不同的请求,防止同一时间重复进行多次请求。
	 
	 * 注意:将值存入session中,以便获取验证码的值,通过覆盖进行值更新。
	 * 1.只要登录不成功即需要每次进行请求新的验证码。
	 * 2.需要设置响应头,告诉浏览器,并且不进行缓存。
	 * 3.session为true的时候当request不存在session,则创建一个;一般用于存、取数据。
	 * 4.session默认为true,session为false一般用于查询数据的时候,没有session不会创建新的;
	 */
@RequestMapping(value = "/getGifCode.html", method = RequestMethod.GET)
public void getGifCode(@RequestParam(required=false) String time,HttpServletResponse response,HttpServletRequest res) throws IOException {
  
    HttpSession session = res.getSession(true);		
  	// 设置响应信息
    response.setHeader("Pragma", "No-cache");		
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);		
    response.setContentType("image/gif");			
  
    /*
     *  1.创建gif格式动画验证码 宽,高,位数。
     *  2.向客户端响应输出gif动态验证信息。
     *  3.此处可以通过实例化PngCaptcha()获取png图形验证码。
     *  4.captcha两个方法,out()输出图片、text()获取文本。
     */
    Captcha captcha = new GifCaptcha(120, 40, 5);
    captcha.out(response.getOutputStream());
  
   	// 将验证码随机产生的随机验证码信息存入Session之中。
    session.setAttribute(GlobalConstant.captcha, captcha.text());
    System.out.println("生成的验证码:"+captcha.text());
}}

3、前端获取方式

<div style="margin-left: 10px;">
		<img src="getGifCode.html" >
    <!-- 点击产生图片,编写JS参数为 time=Date.getTime() -->
</div>

2、短信验证码的实现

依赖的类、依赖的jar包:

<!-- 发送短信依赖包 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.7</version>
</dependency>

额外的依赖类(导入官方下载的Demo即可):
01-短信验证码、动态验证码

实现接口: 使用第三方云之讯的SDK,官网地址

配置文件:

#测试使用
is_test=true	
rest_server=open.ucpaas.com

实现短信验证码的工具类: 具体看官方api

/**
 * @ClassName: SendSMSTool  
 * @Description: 主要调用 云之讯 接口发送短信工具类
 * @author Unruly  
 * @date 2018年12月28日
 */
public class SendSMSTool {
	
	static AbsRestClient InstantiationRestAPI() {
		return new JsonReqClient();
	}
	

	public static String SendMessage(String randNum, String mobile){
		if(StringUtils.isBlank(mobile)) {
			return "手机号:Is a blank";
		}
		String sid  = "****************************";	
		String token = "****************************";	
		String appid ="****************************";
		String templateid ="415648";					// 发送的短信验证码模板
		String result=InstantiationRestAPI().sendSms(sid, token, appid, templateid, randNum, mobile, appid);
		JSONObject json = JSONObject.parseObject(result);
		return json.getString("msg");
	}
	
}

控制层处理请求方式:

/**
	 * 发送短信的方法
	 * @param num 手机号
	 * @param res 
	 * @return 发送的状态
	 * @throws Exception
	 */
@ResponseBody
@RequestMapping(value = "/sendMessage")
public Object getSMS(@RequestParam(name = "phone", required = true) String phone) throws Exception {
  HashMap<String, Object> map = new HashMap<>(16);
  HttpSession session = ServletTool.getSession();
  map.put(GlobalConstant.code, 1001);
  map.put(GlobalConstant.msg, "发送信息失败:请输入合法的手机号!");
  if (!StringUtils.isBlank(phone) && GlobalRegTool.phone_reg(phone)) {
    /* 随机的生成的手机验证码 */
    String phoneVercode = String.valueOf(RandomUtils.nextInt(10000, 100000));
    String sendMessage = SendSMSTool.SendMessage(phoneVercode, phone);
    map.put(GlobalConstant.code,0);
    map.put(GlobalConstant.msg, sendMessage);
    session.setAttribute(GlobalConstant.session_phone, phone);    
    // 将验证信息存入Session
    session.setAttribute(GlobalConstant.phone_code, phoneVercode);
  }
  return map;
}
上一篇:Redis 哨兵模式搭建


下一篇:爬虫入门_9:增量式爬虫