java代码实现验证码功能(验证码生成和验证一套带走)
2019-02-27 17:02
423 查看
版权声明:https://blog.csdn.net/heqiang000 https://blog.csdn.net/heqiang000/article/details/87978910
4000
大家都知道为了防止我们的网站被有些人和黑客恶意攻击,比如我们网站的注册页面,如果我们在用户注册的时候不加上一个验证码框的话,别人就可以写一个脚本对你的网站进行恶意的注册,比如每分钟对你的网站进行n次的注册,那么你的网站就会被攻击而崩溃。当我们增加了验证码之后,别人再写脚本的时候就必须先识别你的验证码,而要识别图片验证码中的内容,却不是那么的容易,这样就能够有效的防止我们的网站被恶意的注册攻击。废话不多说,直接上代码。还是比较简单。(此功能在登录和注册以及找回密码等地方都可以用)
1、先创建一个工具类,这个类是写好了的,直接复制就可以用
import java.awt.*; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; import java.util.Random; public class RandomValidateCodeUtil { private static int width = 100;// 定义图片的width private static int height = 30;// 定义图片的height private static int codeCount = 4;// 定义图片上显示验证码的个数 private static int xx = 18; private static int fontHeight = 30; private static int codeY = 27; private static char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R','T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a','b','c','d','e','f','g','h','j','k','m','n','p','q','r','s','t','u','v','w','x','y', '2', '3', '4','5', '6', '7', '8', '9' }; /** * 生成一个map集合 * code为生成的验证码 * codePic为生成的验证码BufferedImage对象 * @return */ public static Map<String,Object> generateCodeAndPic() { // 定义图像buffer BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // Graphics2D gd = buffImg.createGraphics(); // Graphics2D gd = (Graphics2D) buffImg.getGraphics(); Graphics gd = buffImg.getGraphics(); // 创建一个随机数生成器类 Random random = new Random(); // 将图像填充为白色 gd.setColor(Color.WHITE); gd.fillRect(0, 0, width, height); // 创建字体,字体的大小应该根据图片的高度来定。 Font font = new Font("Fixedsys", Font.BOLD, fontHeight); // 设置字体。 gd.setFont(font); // 画边框。 gd.setColor(Color.BLACK); gd.drawRect(0, 0, width - 1, height - 1); // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。 gd.setColor(Color.BLACK); for (int i = 0; i < 30; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); gd.drawLine(x, y, x + xl, y + yl); } // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。 StringBuffer randomCode = new StringBuffer(); int red = 0, green = 0, blue = 0; // 随机产生codeCount数字的验证码。 for (int i = 0; i < codeCount; i++) { // 得到随机产生的验证码数字。 String code = String.valueOf(codeSequence[random.nextInt(30)]); // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。 red = random.nextInt(255); green = random.nextInt(255); blue = random.nextInt(255); // 用随机产生的颜色将验证码绘制到图像中。 gd.setColor(new Color(red, green, blue)); gd.drawString(code, (i + 1) * xx, codeY); // 将产生的四个随机数组合在一起。 randomCode.append(code); } Map<String,Object> map =new HashMap<String,Object>(); //存放验证码 map.put("code", randomCode); //存放生成的验证码BufferedImage对象 map.put("codePic", buffImg); return map; } }
2、控制层(controller:)
/** * 登录验证 * @param req * @param resp * @throws IOException */ @RequestMapping("/code") public void doGet(HttpServletRequest req, HttpServletResponse resp,String timestamp){ // 调用工具类生成的验证码和验证码图片 Map<String, Object> codeMap = RandomValidateCodeUtil.generateCodeAndPic(); // 将四位数字的验证码保存到Session中。 HttpSession session = req.getSession(); req.getSession().setAttribute("code", codeMap.get("code").toString()); // 禁止图像缓存。 resp.setHeader("Pragma", "no-cache"); resp.setHeader("Cache-Control", "no-cache"); resp.setDateHeader("Expires", -1); resp.setContentType("image/jpeg"); // 将图像输出到Servlet输出流中。 ServletOutputStream sos; try { sos = resp.getOutputStream(); ImageIO.write((RenderedImage) codeMap.get("codePic"), "jpeg", sos); sos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
注意:控制层层中有一个参数 timestamp,虽然这个参数没有用到,但是还是要传过来,而且要保证这个参数每时每刻都在变化,因为在页面上获取验证码是需要调用这个接口,只有当参数不一样是,才会请求成功。还有就是如果项目中配置了拦截器的,一定要把这个接口的url给放行,不然前端获取不到验证码
3、页面代码:
<div> <img src="<%=path%>/resources/img/code.png" alt="">//验证码的图片,可有可无 <input type="text" name="code" id="code" style="width: 40%"> //输入验证码的input框 <a href="javascript:void(0);" rel="external nofollow" title="点击更换验证码"> <img id="ImgId" src="/code" onclick="getVerify()" style="position:absolute;top:2px;right:50px"> </a> //生成的获取印有验证码的图片。mig标签中的src属性就是获取验证码的那个接口的url地址,它会去调用这个接口获取验证 码;在图片外面套用一个a标签,就是为了点击图片变换验证码,就是变换img标签的src属性的值 </div> <div class="yes_login"><a href="javascript:void(0)" id="loginBtn" style="letter-spacing: 10px;">登录</a></div>
<script type="text/javascript"> //登录验证码 function getVerify(obj){ $("#ImgId").attr('src',"/code?timestamp=" + (new Date()).valueOf());//这里就是上面我解释的调用这个接口需要传递 timestamp参数,这个参数是时间戳,每调用一次这个接口,这个参数就会不一样 }
</script>
4、验证:
public BaseResponse<User> login(String code,HttpServletRequest request) throws NoSuchAlgorithmException, UnsupportedEncodingException{ BaseResponse<User> baseResponse = new BaseResponse<>(); String codeStr = request.getSession().getAttribute("code").toString();//获取session中的code对应的值(验证码) if(!code.toLowerCase().equals(codeStr.toLowerCase())){ //将用户输入的验证码和session中获取的值做比较 baseResponse.setMessage("验证码不正确"); baseResponse.setResponseStatus(0); return baseResponse; }
}
相关文章推荐
- Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
- Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
- java调接口实现发送手机短信验证码功能,手机验证码,接口调用
- Ajax+Struts2实现验证码验证功能实例代码
- java调接口实现发送手机短信验证码功能,手机验证码,接口调用
- Java实现发送短信验证验证码功能
- Java实现验证码验证功能
- Java实现验证码验证功能
- java生成输出验证码图片,并进行验证的代码
- 用代码实现在eclipse中自动生成package_这个功能很有用_java版
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- java实现验证码生成,解决在页面验证时候session获得的总是前一次值的问题
- Java实现验证码验证功能
- java随机验证码生成实现实例代码
- 【java】注册功能动态验证码的生成和验证(完整图片验证码封装工具类)
- Java如何实现验证码验证功能
- JAVA技术:代码实现验证码图片的生成
- Java实现随机验证码功能实例代码