怎么在vue中使用SSM實現(xiàn)一個驗證碼功能?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的臺兒網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
Vue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以創(chuàng)建可維護性和可測試性更強的代碼庫,Vue允許可以將一個網(wǎng)頁分割成可復(fù)用的組件,每個組件都包含屬于自己的HTML、CSS、JavaScript,以用來渲染網(wǎng)頁中相應(yīng)的地方,所以越來越多的前端開發(fā)者使用vue。
1.前端有一個img引入,這里this.src=this.src+'?'就會調(diào)用映射到后臺的checkCode
<el-form-item prop="code"> <img src="checkCode" alt="" width="100" height="32" class="passcode" onclick="this.src=this.src+'?'">> <el-input v-model="login.code" placeholder="請輸入驗證碼" auto-complete="off"></el-input> </el-form-item>
2.后臺返回一個圖片
@RequestMapping(value="/checkCode") public void checkCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設(shè)置相應(yīng)類型,告訴瀏覽器輸出的內(nèi)容為圖片 response.setContentType("image/jpeg"); HttpSession session = request.getSession(); //設(shè)置響應(yīng)頭信息,告訴瀏覽器不要緩存此內(nèi)容 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生成隨機字符串以及圖片。下面這個代碼可以直接用一下。來自:
https://www.jb51.net/article/152255.htm
public class RandomValidateCode { public static final String RANDOMCODEKEY = "randomcode_key";//放到session中的key private Random random = new Random(); private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//隨機產(chǎn)生的字符串 private int width = 80;//圖片寬 private int height = 26;//圖片高 private int lineSize = 40;//干擾線數(shù)量 private int stringNum = 4;//隨機產(chǎn)生字符數(shù)量 /** * 生成隨機圖片 */ public void getRandcode(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); //BufferedImage類是具有緩沖區(qū)的Image類,Image類是用于描述圖像信息的類 BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR); //產(chǎn)生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 { //將內(nèi)存中的圖片通過流動形式輸出到客戶端 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格式數(shù)據(jù),不然娶不到數(shù)據(jù) if (result.body.success) { alert("success"); window.location.href = "/listStudentInfo"; this.loading.close(); //關(guān)閉動畫加載 } else { // 彈出錯誤信息框 this.$emit( 'submit-form', this.$message({ message:result.body.message, type: 'warning', duration: 6000 }), ); // 清空表單狀態(tài) 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("調(diào)試"); 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的區(qū)別吧,session是保存在服務(wù)端的,cookie是保存在客戶端的,就是本地會有一個文件夾專門保存cookie。cookie主要是為了保存用戶狀態(tài)嘛,因為http是無狀態(tài)的連接,每次連接完就不會知道下一次是不是同一個用戶。但是保存用戶信息在很多應(yīng)用場景中都是必要的。而session比cookie更加安全,因為session信息保存在服務(wù)端的,不容易被盜用。所以重要登陸信息還是應(yīng)該保存在session上。而且服務(wù)端能夠保存的session比較大,而單個cookie一般不超過20k.
session是怎么保存用戶信息的呢?就是一個用戶有一個sessionId,通過sessionId保存用戶信息。
session的使用:
session.setAttribute("key","value"); session.getAttribute("key");
看完上述內(nèi)容,你們掌握怎么在vue中使用SSM實現(xiàn)一個驗證碼功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)頁題目:怎么在vue中使用SSM實現(xiàn)一個驗證碼功能
文章網(wǎng)址:http://muchs.cn/article4/jpedoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設(shè)、商城網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站改版、標(biāo)簽優(yōu)化、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)