vue+SSM实现验证码功能


Posted in Javascript onDecember 07, 2018

 源码:https://github.com/HannahLihui/StudentManager-SSM/tree/master/SSM-git/StudentManager-SSM-master

1.前端有一个img引入,这里this.src=this.src+'?'就会调用映射到后台的checkCode

<el-form-item prop="code">
     <img src="checkCode" alt="" width="100" height="32" class="passcode" style="height:43px;cursor:pointer; float:left;"onclick="this.src=this.src+'?'">>
    <el-input v-model="login.code" placeholder="请输入验证码" style="width: 100px; float:center" auto-complete="off"></el-input>
</el-form-item>

2.后台返回一个图片

@RequestMapping(value="/checkCode")
 public void checkCode(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
 //设置相应类型,告诉浏览器输出的内容为图片
   response.setContentType("image/jpeg");
   HttpSession session = request.getSession();
   //设置响应头信息,告诉浏览器不要缓存此内容
   response.setHeader("pragma", "no-cache");
   response.setHeader("Cache-Control", "no-cache");
   response.setDateHeader("Expire", );
   RandomValidateCode randomValidateCode = new RandomValidateCode();
   try {
    randomValidateCode.getRandcode(request, response);
   } catch (Exception e) {
    e.printStackTrace();
   }
 }

3.是通过RandomValidateCode生成随机字符串以及图片。下面这个代码可以直接用一下。来自:

public class RandomValidateCode {
public static final String RANDOMCODEKEY = "randomcode_key";//放到session中的key
 private Random random = new Random();
 private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
 private int width = 80;//图片宽
 private int height = 26;//图片高
 private int lineSize = 40;//干扰线数量
 private int stringNum = 4;//随机产生字符数量
 /**
 * 生成随机图片
 */
 public void getRandcode(HttpServletRequest request,
   HttpServletResponse response) {
  HttpSession session = request.getSession();
  //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
  BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
  //产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
  Graphics g = image.getGraphics();
  g.fillRect(0, 0, width, height);
  g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
  g.setColor(getRandColor(160, 200));
  //绘制干扰线
  for(int i=0;i<=lineSize;i++){
   drowLine(g);
  }
  //绘制随机字符
  String randomString = "";
  for(int i=1;i<=stringNum;i++){
   randomString=drowString(g,randomString,i);
  }
  session.removeAttribute(RANDOMCODEKEY);
  session.setAttribute(RANDOMCODEKEY, randomString);
  g.dispose();
  try {
  //将内存中的图片通过流动形式输出到客户端
   ImageIO.write(image, "JPEG", response.getOutputStream());
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 /*
 * 获得字体
 */
 private Font getFont(){
  return new Font("Fixedsys",Font.CENTER_BASELINE,18);
 }
 /*
 * 获得颜色
 */
 private Color getRandColor(int fc,int bc){
  if(fc > 255)
   fc = 255;
  if(bc > 255)
   bc = 255;
  int r = fc + random.nextInt(bc-fc-16);
  int g = fc + random.nextInt(bc-fc-14);
  int b = fc + random.nextInt(bc-fc-18);
  return new Color(r,g,b);
 }
 /*
 * 绘制字符串
 */
 private String drowString(Graphics g,String randomString,int i){
  g.setFont(getFont());
  g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
  String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
  randomString +=rand;
  g.translate(random.nextInt(3), random.nextInt(3));
  g.drawString(rand, 13*i, 16);
  return randomString;
 }
 /*
 * 绘制干扰线
 */
 private void drowLine(Graphics g){
  int x = random.nextInt(width);
  int y = random.nextInt(height);
  int xl = random.nextInt(13);
  int yl = random.nextInt(15);
  g.drawLine(x, y, x+xl, y+yl);
 }
 /*
 * 获取随机的字符
 */
 public String getRandomString(int num){
  return String.valueOf(randString.charAt(num));
 }
}

--------------------------------------------------------------------------------

4.至于验证验证码就是我弄了半天的东西。。。

因为我不太会vue 然后写前端研究了会会才知道它是怎么用的。然后我开始是想从前端拿到后端的session,但是vue这个是html页面,不能<%@ %>引入java代码,然后我又试了一下js的ajax引入,但是报错,vue框架我也不太懂。。然后还是交给后端验证嘛。

然后就很简单了,从login那里验证,提交的时候多了一个验证码,但是我觉得这样做其实是不太好的,因为验证码跟登录一起验证,有点耗时,分开比较好。

submitForm(login) {
   this.$refs[login].validate((valid) => {
    if (valid) {
     this.loadings(); //加载动画
    // window.alert(this.login.code);
     this.$http.post('/login', {
      username: this.login.username,
      password: this.login.password,
      remember: this.login.remember,
      code:this.login.code
     }).then(result => {
     //window.alert(result);
      // 判断用户是否登录成功,后端返回JSON格式数据,不然娶不到数据
      if (result.body.success) {
      alert("success");
       window.location.href = "/listStudentInfo";
       this.loading.close(); //关闭动画加载
      } else {
       // 弹出错误信息框
       this.$emit(
        'submit-form',
        this.$message({
         message:result.body.message,
         type: 'warning',
         duration: 6000
        }),
       );
       // 清空表单状态
       this.$refs[login].resetFields();
      }
     });
   }
    else {
     this.$emit(
      'submit-form',
      this.$message({
       message: '输入信息有误!',
       type: 'warning',
       duration: 6000
      }),
     );
     return false;
    }
   });
  },
@RequestMapping("/login")
public Result Login( @RequestParam(value = "username", required = false) String username,
   @RequestParam(value = "password", required = false) String password,
   @RequestParam(value = "remember", required = false) String remember,
   @RequestParam(value = "code", required = false) String code,
   HttpServletRequest request
   ) {
String error = null;
HttpSession session = request.getSession();
 System.out.println(code);
 //System.out.println(session.getAttribute( RandomValidateCode.RANDOMCODEKEY));
if(username==null||session.getAttribute( RandomValidateCode.RANDOMCODEKEY).equals(code)) {
//System.out.println("code 有问题");
return new Result(false, error);
}
//System.out.println(password);
//System.out.println("调试");
Subject subject=SecurityUtils.getSubject();
UsernamePasswordToken token=new UsernamePasswordToken(username,password);
if (remember != null) {
   if (remember.equals("true")) {
    //说明选择了记住我
    token.setRememberMe(true);
   } else {
    token.setRememberMe(false);
   }
  } else {
   token.setRememberMe(false);
  }
System.out.println(token.isRememberMe());
try {
subject.login(token);
Result re=new Result(true, "success");
return new Result(true,error);
} catch (UnknownAccountException e) {
  System.out.println( "登陆出错");
  error = "用户账户不存在,错误信息:" + e.getMessage();
 }catch (IncorrectCredentialsException ex) {
 System.out.println( "用户名和密码不匹配");
 error = "用户名或密码错误,错误信息:" + ex.getMessage();
 }catch (AuthenticationException e) {
 System.out.println( "其他的登陆错误");
 error = "错误信息:" + e.getMessage();
 }
return new Result(false, error);
}

5.session

简单说一下我理解的session和cookie的区别吧,session是保存在服务端的,cookie是保存在客户端的,就是本地会有一个文件夹专门保存cookie。cookie主要是为了保存用户状态嘛,因为http是无状态的连接,每次连接完就不会知道下一次是不是同一个用户。但是保存用户信息在很多应用场景中都是必要的。而session比cookie更加安全,因为session信息保存在服务端的,不容易被盗用。所以重要登陆信息还是应该保存在session上。而且服务端能够保存的session比较大,而单个cookie一般不超过20k.

session是怎么保存用户信息的呢?就是一个用户有一个sessionId,通过sessionId保存用户信息。

session的使用:

session.setAttribute("key","value");
session.getAttribute("key");

6.登陆界面

vue+SSM实现验证码功能

总结

以上所述是小编给大家介绍的vue+SSM实现验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery浮动DIV提示信息并自动隐藏的代码
Aug 29 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
Jul 26 Javascript
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
js中关于一个分号的崩溃示例
Nov 11 Javascript
浅谈javascript中的事件冒泡和事件捕获
Dec 28 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 Javascript
浅谈JS封闭函数、闭包、内置对象
Jul 18 Javascript
老生常谈js中的MVC
Jul 25 Javascript
Vue组件通信实践记录(推荐)
Aug 15 Javascript
使用Bootrap和Vue实现仿百度搜索功能
Oct 26 Javascript
Js面试算法详解
Apr 08 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
Apr 24 Javascript
详解如何为你的angular app构建一个第三方库
Dec 07 #Javascript
JS实现随机生成10个手机号的方法示例
Dec 07 #Javascript
angular学习之动态创建表单的方法
Dec 07 #Javascript
JavaScript栈和队列相关操作与实现方法详解
Dec 07 #Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
Dec 07 #Javascript
vue webpack打包后图片路径错误的完美解决方法
Dec 07 #Javascript
详解在create-react-app使用less与antd按需加载
Dec 06 #Javascript
You might like
php 函数中使用static的说明
2012/06/01 PHP
PHP删除数组中的特定元素的代码
2012/06/28 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
Jquery $.map使用方法实例详解
2020/09/01 jQuery
学习Python selenium自动化网页抓取器
2018/01/20 Python
使用numba对Python运算加速的方法
2018/10/15 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
2020/09/05 Python
python selenium 获取接口数据的实现
2020/12/07 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
C#如何进行LDAP用户校验
2012/11/21 面试题
会议邀请书范文
2014/02/02 职场文书
小学教师办公室制度
2014/02/03 职场文书
产假请假条
2014/04/10 职场文书
保护环境建议书300字
2014/05/13 职场文书
机电专业求职信
2014/06/14 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
跑出一片天观后感
2015/06/08 职场文书
文艺节目主持词
2015/07/06 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
2022年四月新番
2022/03/15 日漫
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL