vue+SSM实现验证码功能
源码: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实现验证码功能,希望对大家有所帮助
上一篇: 简单了解python shutil模块原理及使用方法
下一篇: Oracle中如何进行进制转换