最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue+springboot實現(xiàn)圖形驗證碼Kaptcha的示例

 更新時間:2023年11月15日 15:12:35   作者:玄尺_007  
圖形驗證碼是做網(wǎng)站常用的功能,本文主要介紹了vue+springboot實現(xiàn)圖形驗證碼Kaptcha的示例,具有一定的參考價值,感興趣的可以了解一下

1、前端

form使用了element-ui的組件,主要還是看img標簽,src綁定了form.imgCodeUrl數(shù)據(jù),點擊圖片時觸發(fā)refreshCode更新圖片驗證碼。

	  <el-form-item prop="verificationCode" label="驗證碼" style="text-align: left;">
		  <el-input v-model="form.verificationCode" placeholder="請輸入驗證碼" style="width: 120px;vertical-align: top;"></el-input>
		  <img id="img" alt="驗證碼" @click="refreshCode" :src="form.imgCodeUrl" style="padding-left: 12px;"/>
	  </el-form-item>
    data() {
      return {
        form: {
          username: '',
          password: '',
		  verificationCode:'',
		  imgCodeUrl:this.$verificationCodeUrl,
        },
    ...
	...
  refreshCode(){
	  this.form.imgCodeUrl=this.$verificationCodeUrl+"?d="+new Date().getTime();
  }	

上面refreshCode更新圖片驗證碼的原理,其實就是在原網(wǎng)址后添加隨機的參數(shù)來改變form.imgCodeUrl網(wǎng)址,實現(xiàn)img標簽自動刷新請求。

  • this.$verificationCodeUrl是請求的網(wǎng)址,這里設(shè)置成全局常量寫在了main.js中
//驗證碼地址
Vue.prototype.$verificationCodeUrl="http://127.0.0.1/api/createImageCode";

2、后端實現(xiàn)生成createImageCode驗證碼圖片

使用kaptcha生成圖片驗證碼,添加如下依賴

<dependency>
     <groupId>com.github.penggle</groupId>
     <artifactId>kaptcha</artifactId>
     <version>2.3.2</version>
</dependency>

配置kaptcha圖片生成規(guī)則

...
import java.util.Properties;
 
@Configuration
public class KaptchaConfig {
    @Bean
    public DefaultKaptcha getDefaultKaptcha() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 圖片寬
        properties.setProperty("kaptcha.image.width", "130");
        // 圖片高
        properties.setProperty("kaptcha.image.height", "50");
        // 圖片邊框
        properties.setProperty("kaptcha.border", "yes");
        // 邊框顏色
        properties.setProperty("kaptcha.border.color", "105,179,90");
        // 字體顏色
        properties.setProperty("kaptcha.textproducer.font.color", "blue");
        // 字體大小
        properties.setProperty("kaptcha.textproducer.font.size", "40");
        // session key
        properties.setProperty("kaptcha.session.key", "imageCode");
        // 驗證碼長度
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        // 字體
        properties.setProperty("kaptcha.textproducer.font.names", "宋體,楷體,微軟雅黑");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

生成驗證碼的圖片通過response.getOutputStream流發(fā)送到前端,而驗證碼保存到session域中,等待用戶登錄表單提交時進行校驗匹對

	...
	@Autowired
	private DefaultKaptcha defaultKaptcha;
	...
	//生成圖片驗證碼
	@GetMapping("/createImageCode")
	public void createImageCode(HttpServletRequest request,HttpServletResponse response) {
		response.setHeader("Cache-Control", "no-store, no-cache");
		response.setContentType("image/jpeg");
		// 生成文字驗證碼
		String text = defaultKaptcha.createText();
		// 生成圖片驗證碼
		BufferedImage image = defaultKaptcha.createImage(text);
		//保存到session域
		HttpSession session = request.getSession();
		session.setAttribute("imageCode",text);
		ServletOutputStream out = null;
		try {
			//響應(yīng)輸出圖片流
			out = response.getOutputStream();
			ImageIO.write(image, "jpg", out);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				out.flush();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

3、前端提交表單

代碼有點長,其實是嵌套了三層,第一層if (valid)判斷表單校驗(填入的數(shù)據(jù)是否符合規(guī)則),第二層this. h t t p . g e t ( " / v e r i f y I m a g e C o d e " 提交驗證碼判斷驗證碼是否正確,第三層 t h i s . http.get("/verifyImageCode"提交驗證碼判斷驗證碼是否正確,第三層this. http.get("/verifyImageCode"提交驗證碼判斷驗證碼是否正確,第三層this.http.post("/user/login"最后判斷用戶名和密碼是否正確,三層邏輯都通過才保存用戶登錄信息。

      submitForm() {
        this.$refs.form.validate(valid => {
		  //表單校驗通過
          if (valid) {
			//先判斷圖形驗證碼
			this.$http.get("/verifyImageCode",{params:{verificationCode:this.form.verificationCode}})
			.then((response)=>{
				//圖形驗證碼成功
				if(response.data.code === 0){
					//判斷用戶名和密碼
					this.$http.post("/user/login",{
						username:this.form.username,
						password:this.form.password
					})
					.then((response)=>{
						if(response.data.code === 0){//登錄成功
							this.$message({
							  message: '登錄成功',
							  type: 'success',
							});
							localStorage.setItem("user",JSON.stringify(response.data.data));//保存用戶信息
							this.$router.push("/");
						}
						else{
							this.$message.error("用戶名或密碼錯誤,請重試?。?!");
						}
					})
					.catch((error)=>{
						//未接受到response的網(wǎng)絡(luò)傳輸?shù)儒e誤
						console.log(error);
					});
				}else{//圖形驗證碼錯誤
					this.$message.error(response.data.data.message);
					return;
				}
			})
			.catch((error)=>{
				//未接受到response的網(wǎng)絡(luò)傳輸?shù)儒e誤
				console.log(error);
				return;
			});	
          } else {
            this.$message.error('表單填寫錯誤,請檢查');
            return false;
          }
        });
      },

4、后端/verifyImageCode驗證碼匹對

CommonResult是自定義的返回數(shù)據(jù)結(jié)果類,可以搜我以前文章。前端傳來的驗證碼與session域中的匹對。

	//匹對圖片驗證碼
	@GetMapping("/verifyImageCode")
	public CommonResult<Object> verifyImageCode(String verificationCode,HttpServletRequest request) {
		HttpSession session = request.getSession();
		if(session.getAttribute("imageCode").equals(verificationCode)) {
			return CommonResult.success();
		}else {
			return CommonResult.failed(ErrorCode.IMG_CODE_VERIFY_ERROR.getCode(), Message.createMessage(ErrorCode.IMG_CODE_VERIFY_ERROR.getMessage()));
		}
	}

5、bug

測試時,驗證碼圖片能夠生成顯示,并能刷新。但提交表單時,對/verifyImageCode的請求返回錯誤碼500。
首先打印發(fā)現(xiàn)session域的值為null。了解到原來session會話是有唯一的session id。打印session id,發(fā)現(xiàn)每次請求session id的不一樣。session id其實是存在在cookie里的。
所以前端發(fā)送請求時要攜帶cookie證書,vue配置

//攜帶證書 session id
axios.defaults.withCredentials = true

后端的跨域配置也要允許證書通行

//配置跨域過濾器CorsFilter
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        //允許證書
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        List<String> list = Arrays.asList("*");
        corsConfiguration.setAllowedHeaders(list);
        corsConfiguration.setAllowedMethods(list);
        corsConfiguration.setAllowedOriginPatterns(list);
        source.registerCorsConfiguration("/**", corsConfiguration);
        CorsFilter corsFilter = new CorsFilter(source);
        return corsFilter;
    }
}

還沒完,請求還是返回500。瀏覽器調(diào)試器顯示如下

請求頭中已經(jīng)帶cookie,然而響應(yīng)頭又set-cookie了,也就是cookie里的session id又被重置,為什么這樣子?可能是感嘆號報錯的原因:set-cookie默認屬性是"SameSite=Lax,"。參考網(wǎng)上文章,我們修改后端配置application.properties:

#獲取同一個session id的cookie設(shè)置
server.servlet.session.cookie.secure=true
server.servlet.session.cookie.same-site=none

再運行起來,set-cookie和感動號消失,調(diào)試通過。

參考文章:vue+springboot實現(xiàn)登錄驗證碼

到此這篇關(guān)于vue+springboot實現(xiàn)圖形驗證碼Kaptcha的示例的文章就介紹到這了,更多相關(guān)vue+springboot 圖形驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue.js中使用道具方法demo

    Vue.js中使用道具方法demo

    這篇文章主要為大家介紹了Vue.js中使用道具方法demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 解決Vue控制臺報錯Failed to mount component: template or render function not defined.

    解決Vue控制臺報錯Failed to mount component: tem

    這篇文章主要介紹了解決Vue控制臺報錯Failed to mount component: template or render function not defined.問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 如何使用fetchEventSource實現(xiàn)sse流式請求

    如何使用fetchEventSource實現(xiàn)sse流式請求

    這篇文章主要介紹了如何使用fetchEventSource實現(xiàn)sse流式請求問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vue.js學習筆記之v-bind和v-on解析

    vue.js學習筆記之v-bind和v-on解析

    這篇文章主要介紹了vue.js學習筆記之v-bind和v-on解析,v-bind 指令用于響應(yīng)地更新 HTML 特征,v-on 指令用于監(jiān)聽DOM事件,文中還給大家提到了v-bind,v-on的縮寫,感興趣的朋友參考下吧
    2018-05-05
  • Vue3+Element Plus實現(xiàn)自定義彈窗組件的全屏功能

    Vue3+Element Plus實現(xiàn)自定義彈窗組件的全屏功能

    在現(xiàn)代化的前端開發(fā)中,彈窗組件是提升用戶體驗的重要元素,本文將介紹如何使用 Vue 3 和 Element Plus 庫來創(chuàng)建一個具有全屏功能的自定義彈窗組件,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-07-07
  • element?ui富文本編輯器的使用效果與步驟(quill-editor)

    element?ui富文本編輯器的使用效果與步驟(quill-editor)

    富文本編輯器在任何項目中都會用到,在Element中我們推薦vue-quill-editor組件,下面這篇文章主要給大家介紹了關(guān)于element?ui富文本編輯器的使用效果與步驟(quill-editor)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • vue車牌號校驗和銀行校驗實戰(zhàn)

    vue車牌號校驗和銀行校驗實戰(zhàn)

    這篇文章主要介紹了vue車牌號校驗和銀行校驗實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • vue3+elementPlus實現(xiàn)年份選擇器

    vue3+elementPlus實現(xiàn)年份選擇器

    這篇文章主要為大家詳細介紹了vue3如何通過elementPlus實現(xiàn)一個簡單的年份選擇器,文中的示例代碼講解詳細,需要的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • vue-element-admin中node-sass換成dart-sass,安裝依賴報code?128多種問題的解決方法

    vue-element-admin中node-sass換成dart-sass,安裝依賴報code?128多種問題的解決

    這篇文章主要介紹了vue-element-admin中node-sass換成dart-sass,安裝依賴報code?128多種問題的解決方法,本文給大家分享問題原因分析及解決方法,需要的朋友可以參考下
    2023-02-02
  • VUE父組件異步獲取數(shù)據(jù),子組件接收的值為空的問題

    VUE父組件異步獲取數(shù)據(jù),子組件接收的值為空的問題

    這篇文章主要介紹了VUE父組件異步獲取數(shù)據(jù),子組件接收的值為空的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評論

沾化县| 博白县| 隆尧县| 扎囊县| 松潘县| 孝感市| 磐安县| 吉隆县| 江永县| 保定市| 德阳市| 平凉市| 饶平县| 姜堰市| 称多县| 咸丰县| 启东市| 泰州市| 卢湾区| 蒙阴县| 澄城县| 措勤县| 蒲城县| 景洪市| 大关县| 博罗县| 镇平县| 兴安县| 资中县| 肇源县| 兴海县| 思南县| 徐汇区| 邻水| 常德市| 余江县| 西城区| 宜章县| 繁峙县| 双峰县| 鄂托克旗|