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

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

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

1、前端

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

	  <el-form-item prop="verificationCode" label="驗(yàn)證碼" style="text-align: left;">
		  <el-input v-model="form.verificationCode" placeholder="請輸入驗(yàn)證碼" style="width: 120px;vertical-align: top;"></el-input>
		  <img id="img" alt="驗(yàn)證碼" @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更新圖片驗(yàn)證碼的原理,其實(shí)就是在原網(wǎng)址后添加隨機(jī)的參數(shù)來改變form.imgCodeUrl網(wǎng)址,實(shí)現(xiàn)img標(biāo)簽自動刷新請求。

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

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

使用kaptcha生成圖片驗(yàn)證碼,添加如下依賴

<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");
        // 驗(yàn)證碼長度
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        // 字體
        properties.setProperty("kaptcha.textproducer.font.names", "宋體,楷體,微軟雅黑");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

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

	...
	@Autowired
	private DefaultKaptcha defaultKaptcha;
	...
	//生成圖片驗(yàn)證碼
	@GetMapping("/createImageCode")
	public void createImageCode(HttpServletRequest request,HttpServletResponse response) {
		response.setHeader("Cache-Control", "no-store, no-cache");
		response.setContentType("image/jpeg");
		// 生成文字驗(yàn)證碼
		String text = defaultKaptcha.createText();
		// 生成圖片驗(yàn)證碼
		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、前端提交表單

代碼有點(diǎn)長,其實(shí)是嵌套了三層,第一層if (valid)判斷表單校驗(yàn)(填入的數(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 " 提交驗(yàn)證碼判斷驗(yàn)證碼是否正確,第三層 t h i s . http.get("/verifyImageCode"提交驗(yàn)證碼判斷驗(yàn)證碼是否正確,第三層this. http.get("/verifyImageCode"提交驗(yàn)證碼判斷驗(yàn)證碼是否正確,第三層this.http.post("/user/login"最后判斷用戶名和密碼是否正確,三層邏輯都通過才保存用戶登錄信息。

      submitForm() {
        this.$refs.form.validate(valid => {
		  //表單校驗(yàn)通過
          if (valid) {
			//先判斷圖形驗(yàn)證碼
			this.$http.get("/verifyImageCode",{params:{verificationCode:this.form.verificationCode}})
			.then((response)=>{
				//圖形驗(yàn)證碼成功
				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{//圖形驗(yàn)證碼錯誤
					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驗(yàn)證碼匹對

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

	//匹對圖片驗(yàn)證碼
	@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

測試時(shí),驗(yàn)證碼圖片能夠生成顯示,并能刷新。但提交表單時(shí),對/verifyImageCode的請求返回錯誤碼500。
首先打印發(fā)現(xiàn)session域的值為null。了解到原來session會話是有唯一的session id。打印session id,發(fā)現(xiàn)每次請求session id的不一樣。session id其實(shí)是存在在cookie里的。
所以前端發(fā)送請求時(shí)要攜帶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又被重置,為什么這樣子?可能是感嘆號報(bào)錯的原因:set-cookie默認(rèn)屬性是"SameSite=Lax,"。參考網(wǎng)上文章,我們修改后端配置application.properties:

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

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

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

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

相關(guān)文章

最新評論

廉江市| 高安市| 徐州市| 武宣县| 茌平县| 乐亭县| 罗平县| 泊头市| 百色市| 乌海市| 安徽省| 米易县| 靖边县| 抚远县| 紫金县| 平舆县| 香港| 紫金县| 呈贡县| 沐川县| 合山市| 龙山县| 房山区| 商都县| 霍城县| 措勤县| 平武县| 汝城县| 邵阳市| 义马市| 若尔盖县| 广宗县| 台南县| 灵川县| 徐州市| 略阳县| 阿尔山市| 特克斯县| 商丘市| 和田市| 萝北县|