先说下验证码的最基本思路。首先在后端生成随机验证码,存入session。前端接收后端生成的验证码图片或随机字符,展示给用户。用户输入验证码,提交时发送到后台,与session中的验证码进行比较。下面代码是生成的图片验证码,简单一点的可以直接生成随机数,来直接代替生成图片验证码的代码块

启动类中加入

@Overridepublic void addInterceptors(InterceptorRegistry registry){InterceptorRegistration ir=registry.addInterceptor(new Interceptor1());ir.addPathPatterns("/**");//下面的/*/是要放开的方法和页面。像登录页面、在登陆时连接数据库判断用户是否正确的方法等。跟登录页面有关的方法貌似必须放开!!!包括映射登录页的方法ir.excludePathPatterns("/admin/yzm","/user/judge","/admin/sess","/user/findName","/admin/login","/admin/image","/admin/image.jpg","static/**","/js/**","/html/**","/images/**","/css/**");}

在controller包下

新建一个class文件,在文件中加入以下代码(我也是直接复制的)

package com.example.controller;//路径就是这样的import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;public class Interceptor1 implements HandlerInterceptor {//注意继承类@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{HttpSession session=request.getSession();Object ob=session.getAttribute("uname");//这个就是要验证的内容,如果name为空,就会被拦截if (ob!=null) {//如果不为空,返回true,可以正常访问return true;//return后的代码不会执行,else写不写无所谓}//从这往下session.setAttribute("preurl",request.getRequestURI());StringBuffer url = request.getRequestURL();String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getServletContext().getContextPath()).append("/").toString();//response.sendRedirect(tempContextUrl);//从这往上,什么意思我没看(其实是看不太懂),直接复制...response.sendRedirect("/admin/login");//登录失败后要跳转的页面,我的是失败后直接跳转登录页面return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler,ModelAndView model) throws Exception{}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler,Exception ex) throws Exception{}}

在其他控制类中

//这个是映射登录页面的方法,里面不需要任何操作就行
@RequestMapping("login")public String login() {return "/admin/login";}//这块是生成验证码图片的,图片是代码生成的,不需要自己添加
@RequestMapping(value = "/yzm", method = RequestMethod.GET)public void yzm(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);response.setContentType("image/jpeg");// 生成随机字串String verifyCode = VerifyCodeUtils.generateVerifyCode(4);// 存入会话sessionHttpSession session = request.getSession(true);// 删除以前的session.removeAttribute("verCode");session.removeAttribute("codeTime");session.setAttribute("verCode", verifyCode.toLowerCase());//将生成的验证码存入sessionsession.setAttribute("codeTime", LocalDateTime.now());// 生成图片int w = 100, h = 30;OutputStream out = response.getOutputStream();VerifyCodeUtils.outputImage(w, h, out, verifyCode);}//对输入的验证码和生成的验证码进行比较的
@RequestMapping("judge")
@ResponseBody
public JSONObject judge(HttpServletRequest req) {JSONObject jsonObject = new JSONObject();HttpSession session = req.getSession();String yzm = (String) session.getAttribute("verCode");//获取自动生成的验证码//System.out.println("yzm:"+yzm);String iyzm = req.getParameter("iyzm").toLowerCase();//获取用户输入的验证码,toLowerCase()好像是将大写字母转小写吧,是为了输入验证码的时候不区分大小写//System.out.println("iyzm:"+iyzm);//对两个验证码进行判断if(!yzm.equals(iyzm) ) {//如果两个不相同,不再进行下面的操作jsonObject.put("num", "1");jsonObject.put("result", "验证码输入错误");return jsonObject;}else {String uname = req.getParameter("uname");//接收登录页输入的name,获取数据库数据进行验证session.setAttribute("uname", uname);//将输入的neme存入sessionUser user = userService.findName(uname);//使用输入的uname进行查询,获取数据库中的name,如果查到数据,表示uname输入正确;查询为空,uname输入错误(我的实体类是user)//String power = user.getPower();//有事没事,输出一下,看看有没有毛病//String uid = user.getUid();//这个id应该是通过上面方法查出来后,从实体中获取的,可能是我其他地方用的,在这里没什么用//System.out.println(uid);if(user==null) {//如果查询结果为空,说明用户名不存在jsonObject.put("num", "2");jsonObject.put("result", "用户名不存在或输入有误");return jsonObject;}else {//不为空,uname输入正确,进行密码的验证String pwd = req.getParameter("pwd");//System.out.println(pwd);//System.out.println(user.getPwd());if(!user.getPwd().contentEquals(pwd)) {//密码不相同,contentEquals() 方法用于将此字符串与指定的 StringBuffer 比较(百度的)跟equals差不多jsonObject.put("num", "3");jsonObject.put("result", "密码输入有误");return jsonObject;}else {jsonObject.put("num", "4");jsonObject.put("result", "登录成功");return jsonObject;}}//System.out.println(uname);}
}

前端页面代码

<div class="field"><!-- css代码我没有,我是直接扒的模板,虽然没有css,界面不美观,但是胜在能实现效果嘛。autocomplete="off"这个是清楚input记录的,反正加上就完事了 --><input autocomplete="off"type="text" class="input input-big" id="nul" name="code" v-model="yzm" placeholder="填写右侧的验证码" data-validate="required:请填写右侧的验证码" /><img id="img" src="/admin/yzm" onclick="change()" class="passcode" style="height: 43px; cursor: pointer;" />
</div><!-- js代码  -->
methods:{//根据输入的内容进行查询findAll:function(){//alert(vm.uname);if(vm.uname==""){//先在前端验证下是否为空,后端也要验证alert("请输入用户名");}else{//将输入的内容传到后端$.post("/user/judge",{uname:vm.uname,pwd:vm.pwd,iyzm:vm.yzm},function(data){if(data.num==4){//全部正确,跳转首页window.location.href="/admin/index";}else if(data.num==1){alert(data.result);change();//调用change(),实现验证码刷新//$("#nul").remove().val();}else{alert(data.result);}});}},},
//这个方法我是写在vue外面的
function change(){var img = document.getElementById("img"); img.src = "/admin/yzm?date="+new Date();
}

springboot添加图片验证码(拦截器)相关推荐

  1. springBoot之过滤器和拦截器的使用

    在springBoot中,过滤器和拦截器的使用. 过滤器 概述 过滤器是什么? 简单的来说,过滤器就是过滤的作用,在web开发中过滤一些我们指定的url. 过滤器主要做什么? 过滤掉一些不需要的东西, ...

  2. SpringBoot从零单排 ------ 拦截器的使用

    在项目开发中我们常常需要对请求进行验证,如登录校验.权限验证.防止重复提交等等,通过拦截器来过滤请求.自定义一个拦截器需要实现HandlerInterceptor接口. 代码如下: import or ...

  3. 在SpringBoot项目中整合拦截器

    拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现.总结起来,拦截器大致有以下几种使用场景: 1.权限检查:如登录检测,进入处理程序检测用户是否登录,如果没有,则直接 ...

  4. springboot中配置了拦截器后,拦截器无效的解决方案之一

    springboot中配置了拦截器后,拦截器无效的解决方案之一 参考文章: (1)springboot中配置了拦截器后,拦截器无效的解决方案之一 (2)https://www.cnblogs.com/ ...

  5. SpringBoot 优雅的配置拦截器方式

    作者:攻城狮-飞牛 my.oschina.net/bianxin/blog/2876640 其实spring boot拦截器的配置方式和springMVC差不多,只有一些小的改变需要注意下就ok了. ...

  6. SpringBoot实现过滤器、拦截器与切片

    作者:七印miss juejin.im/post/5c6901206fb9a049af6dcdcf Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤 ...

  7. SpringBoot实现过滤器、拦截器与切片源码分析

    过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Servlet的一种"加强版",它主要用于对用户请求进行预处理和后处理,拥有一个典型的处理链.Filter也可 ...

  8. 玩转 SpringBoot 2 快速整合拦截器

    概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器(HandlerInterceptor).使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInt ...

  9. 第六章:如何在SpringBoot项目中使用拦截器

    拦截器对使用SpringMvc.Struts的开发人员来说特别熟悉,因为你只要想去做好一个项目必然会用到它.拦截器在我们平时的项目中用处有很多,如:日志记录(我们后续章节会讲到).用户登录状态拦截.安 ...

最新文章

  1. android studio离线配置gradle插件_Gradle 扫盲与 Task 基础
  2. Metasploit设置HttpTrace参数技巧
  3. CL_CRM_REPORT_ACCRULE_ONEORDER
  4. 设计模式 - Mediator
  5. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】
  6. Java 8 中的 CompletableFuture 太好用了!20 个示例全分享…
  7. _splitpath / _wsplitpath 将绝对路径分割为盘符、路径、文件名、扩展名。
  8. JS 异步系列 —— Promise 札记
  9. STM32程序下载的三种方式
  10. SpringCloud系列——Eureka中Region和Zone概念介绍
  11. 基于web的实验室设备管理系统
  12. 【企业架构设计实战】2 业务架构设计
  13. python梨视频爬虫下载,反反爬
  14. iphoneX的safari浏览器操作栏隐藏时兼容底部Home键
  15. 杰里695N系列(soundbox)之0.0 开发环境搭建
  16. 3a企业信用等级证书怎么办理
  17. 【discuz免费插件】众大智能云采集5.0版
  18. canvas实现画板工具
  19. 物联网学习笔记(摘录)
  20. mysql中查询本月销售记录_mysql之select查询:练习

热门文章

  1. 智能家居实训(华清远见)第三天
  2. 编写一个程序打印如下对称图形
  3. vs调试查看中间变量
  4. 中望cad文字显示问号怎么办_CAD图纸中的钢筋符号显示成问号,怎么办?
  5. 番茄花园 Ghost XP SP3 2011.7月 快速装机版
  6. QT软件开发: QWidget窗口绘制圆角
  7. Jsoup爬取同花顺龙虎榜
  8. 基于JAVAWEB大学生成长档案系统
  9. 利用Office 365 定制企业合同管理平台,实现企业合同管理新篇章!
  10. oracle 将excel数据导入多个表,5种从Excel数据导入Oracle方法