国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot整合郵箱驗(yàn)證碼實(shí)現(xiàn)用戶(hù)注冊(cè)

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot整合郵箱驗(yàn)證碼實(shí)現(xiàn)用戶(hù)注冊(cè)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

嘮嗑部分

今天我們來(lái)分享一下在系統(tǒng)開(kāi)發(fā)過(guò)程中,如何使用驗(yàn)證碼來(lái)驗(yàn)證用戶(hù)并完成用戶(hù)注冊(cè)

首先來(lái)看一下成品界面展示

SpringBoot整合郵箱驗(yàn)證碼實(shí)現(xiàn)用戶(hù)注冊(cè)

說(shuō)一下以上注冊(cè)功能的設(shè)計(jì):

用戶(hù)手動(dòng)輸入用戶(hù)名(全數(shù)據(jù)庫(kù)唯一)、密碼、確認(rèn)密碼、郵箱地址(單個(gè)郵箱最多可注冊(cè)3個(gè)用戶(hù))、正確的郵箱驗(yàn)證碼,即可注冊(cè)

先來(lái)展示一下

輸入用戶(hù)信息

SpringBoot整合郵箱驗(yàn)證碼實(shí)現(xiàn)用戶(hù)注冊(cè)

收到郵箱驗(yàn)證碼

SpringBoot整合郵箱驗(yàn)證碼實(shí)現(xiàn)用戶(hù)注冊(cè)

注冊(cè)成功

言歸正傳

使用驗(yàn)證碼這種方式呢是比較常見(jiàn)的,我們?cè)谧?cè)App的時(shí)候,會(huì)有手機(jī)驗(yàn)證碼、郵箱的類(lèi)似哈(發(fā)郵件是免費(fèi)的),郵箱驗(yàn)證也能夠保證其真實(shí)性,防止惡意用戶(hù)非法注冊(cè)

下面我們就來(lái)說(shuō)一下,這一系列的實(shí)現(xiàn)思路

1、用戶(hù)名唯一驗(yàn)證就省略了哈,不在此范圍內(nèi)

2、在用戶(hù)填入信息時(shí)前端先做必傳、格式驗(yàn)證。

3、郵箱驗(yàn)證通過(guò)后,點(diǎn)擊發(fā)送驗(yàn)證碼時(shí),攜帶郵箱參數(shù)請(qǐng)求后端接口。

4、后端生成并發(fā)送驗(yàn)證碼后,將驗(yàn)證碼進(jìn)行分布式存儲(chǔ),如存到redis,key為郵箱,value為驗(yàn)證碼,失效時(shí)間設(shè)置3分鐘。

5、用戶(hù)在3分鐘內(nèi)收到驗(yàn)證碼并填入注冊(cè)表單,請(qǐng)求用戶(hù)注冊(cè)接口。

6、后端在收到注冊(cè)請(qǐng)求后,首先驗(yàn)證參數(shù)的合法性,驗(yàn)證通過(guò)后,根據(jù)郵箱去redis查詢(xún)驗(yàn)證碼。

7、未查詢(xún)到驗(yàn)證碼,則說(shuō)明驗(yàn)證碼已經(jīng)過(guò)期,返回驗(yàn)證碼校驗(yàn)失敗,查詢(xún)到驗(yàn)證碼后,與表單中的驗(yàn)證碼進(jìn)行比較,相同則繼續(xù)注冊(cè)邏輯,不同則返回驗(yàn)證碼校驗(yàn)失敗。

代碼環(huán)節(jié)

1、Vue組件

<template>
  <div class="header-all">
      <!--...-->
    <el-dialog :visible.sync="loginFlag" width="500px" :close-on-click-modal="false" :show-close="true">
      <!--登錄表單省略...-->
      <el-form ref="registerForm" v-show="!login" :model="registerInfo" :rules="registerRules" class="register-form"
               autocomplete="on"
               label-position="left">
        <div class="title-container">
          <h3 class="title" style="text-align: center;font-size: 20px;margin-bottom: 15px;">
            {{ sysInfo.sysTitle }}注冊(cè)</h3>
        </div>

        <el-form-item prop="userName">
          <el-input
              prefix-icon="el-icon-user"
              ref="username"
              v-model="registerInfo.userName"
              placeholder="請(qǐng)輸入用戶(hù)名"
              name="userName"
              type="text"
              tabindex="1"
              autocomplete="on"
          />
        </el-form-item>

        <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
          <el-form-item prop="password">
            <el-input
                show-password
                prefix-icon="el-icon-lock"
                ref="password"
                v-model="registerInfo.password"
                placeholder="請(qǐng)輸入賬戶(hù)密碼"
                name="password"
                tabindex="2"
                autocomplete="on"
                @blur="capsTooltip = false"
            />
            <span class="show-pwd">
          </span>
          </el-form-item>
        </el-tooltip>

        <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
          <el-form-item prop="password2">
            <el-input
                show-password
                prefix-icon="el-icon-lock"
                ref="password2"
                v-model="registerInfo.password2"
                placeholder="請(qǐng)確認(rèn)密碼"
                name="password2"
                tabindex="2"
                autocomplete="on"
                @blur="capsTooltip = false"
            />
            <span class="show-pwd">
          </span>
          </el-form-item>
        </el-tooltip>

        <el-form-item prop="email">
          <el-input
              prefix-icon="el-icon-message"
              ref="email"
              v-model="registerInfo.email"
              placeholder="請(qǐng)輸入郵箱地址,每個(gè)郵箱最多可綁定3個(gè)賬號(hào)"
              name="email"
              type="text"
              tabindex="1"
              autocomplete="on"
          />
        </el-form-item>

        <el-form-item prop="code">
          <el-row :gutter="20">
            <el-col :span="12">
              <el-input
                  ref="code"
                  type="text"
                  prefix-icon="el-icon-key"
                  v-model="registerInfo.code"
                  placeholder="請(qǐng)輸入郵箱驗(yàn)證碼"
                  name="code"
                  tabindex="2"
                  autocomplete="on"
                  @keyup.enter.native="registerHandle"
              />
            </el-col>
            <el-col :span="6" :offset="3">
              <el-button type="primary" size="small" :disabled="pause" @click="sendEmailCode">獲取驗(yàn)證碼 <span v-if="pause">{{ time }}</span>
              </el-button>
            </el-col>
          </el-row>
        </el-form-item>

        <el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;"
                   @click.native.prevent="registerHandle">注冊(cè)
        </el-button>

        <div style="text-align: right">
          <el-link type="primary" :underline="false" @click.native="nativeToLogin">已有賬號(hào),去登錄>></el-link>
        </div>
      </el-form>
    </el-dialog>

    <el-dialog
        title="新用戶(hù)提示"
        :visible.sync="dialogVisible"
        width="30%">
      <span>系統(tǒng)檢測(cè)到您是新用戶(hù),請(qǐng)及時(shí)更新信息</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="toUpdateSelfInfo">去更新</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
<!--引入...-->
const defaultRegisterInfo = {
  userName: '',
  password: '',
  password2: '',
  email: '',
  code: ''
}
export default {
  <!--...-->
  data() {
    var checkUserName = (rule, value, callback) => {
      const pattern = /^[A-Za-z0-9-_]+$/;
      if (!value) {
        return callback(new Error('登錄名不能為空'));
      }
      if (pattern.test(value) && value.length <= 16) {
        checkUserNameExist({userName: value}).then(res => {
          if (res.data) {
            callback(new Error('登錄名已存在'));
          } else {
            callback();
          }
        })
      } else {
        callback(new Error('登錄名須由數(shù)字、英文字母、-、下劃線(xiàn)(不包含、)組成,不大于16位'));
      }
    };
    var validatePass = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('請(qǐng)輸入密碼'));
      } else {
        if (this.registerInfo.password !== '') {
          this.$refs.registerForm.validateField('password2');
        }
        callback();
      }
    };
    var validatePass2 = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('請(qǐng)?jiān)俅屋斎朊艽a'));
      } else if (value !== this.registerInfo.password) {
        callback(new Error('兩次輸入密碼不一致!'));
      } else {
        callback();
      }
    };
    var validateEmail = (rule, value, callback) => {
      const pattern = /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/;
      if (value && value !== '') {
        if (pattern.test(value)) {
          checkEmailBindStatus({email: value}).then(res => {
            if (res.data) {
              callback();
            } else {
              callback(new Error('當(dāng)前郵箱綁定用戶(hù)已達(dá)到上限'));
            }
          })
        } else {
          callback(new Error('郵箱格式不正確'));
        }
      } else {
        callback(new Error('郵箱為必傳項(xiàng)'));
      }
    };
    return {
      defaultUserImg: defaultUserImg,
      refresh: true,
      baseUrl: URL_PREFIX,
      codeUrl: URL_PREFIX + '/auth/getCaptcha',
      rules: {
        username: [{required: true, trigger: 'blur', message: '用戶(hù)名為必填項(xiàng)'}],
        password: [{required: true, trigger: 'blur', message: '密碼為必填項(xiàng)'}],
        code: [{required: true, trigger: 'blur', message: '驗(yàn)證碼為必填項(xiàng)'}]
      },
      loading: false,
      registerInfo: {
        userName: '',
        password: '',
        password2: '',
        email: '',
        code: ''
      },
      time: 30,
      pause: false,
      registerRules: {
        userName: [{validator: checkUserName, trigger: 'blur'}],
        password: [{validator: validatePass, trigger: 'blur'}],
        password2: [{validator: validatePass2, trigger: 'blur'}],
        email: [{validator: validateEmail, trigger: 'blur'}],
        code: [{required: true, trigger: 'blur', message: '驗(yàn)證碼為必填項(xiàng)'}]
      },
      dialogVisible: false
    }
  },
  methods: {
    // 用戶(hù)注冊(cè)
    registerHandle() {
      this.$refs.registerForm.validate(valid => {
        if (valid) {
          this.loading = true
          const registerInfo = {
              ...this.registerInfo,
              password: this.$encruption(this.registerInfo.password), 
              password2: this.$encruption(this.registerInfo.password2)
          }
          register(registerInfo).then(res => {
            this.$message.success('用戶(hù)注冊(cè)成功')
            this.loading = false
            this.registerInfo = defaultRegisterInfo
            this.$refs.registerForm.resetFields()
            this.nativeToLogin()
          })
        } else {
          console.log('error submit!!')
          return false
        }
        setTimeout(() => {
          this.loading = false
        }, 2000)
      })
    },
    // 發(fā)送驗(yàn)證碼
    sendEmailCode() {
      this.$refs.registerForm.validateField('email', valid => {
        if (!valid) {
          if (this.pause) {
            this.$message.error('操作太頻繁,請(qǐng)稍后再試')
          } else {
            sendEmailCode({email: this.registerInfo.email}).then(res => {
              this.$message.success('驗(yàn)證碼發(fā)送成功,請(qǐng)注意查收!')
              this.pause = true
              const timer = setInterval(() => {
                if (this.time > 0) {
                  this.time = this.time - 1;
                }
                if (this.time <= 0) {
                  this.pause = false;
                  clearInterval(timer)
                  this.time = 30
                }
              }, 1000)
            })
          }
        }
      });
    }
  }
}
</script>

<style scoped lang="less">
   <!--css省略-->
</style>

2、api

// 發(fā)送驗(yàn)證碼
export function sendEmailCode(data = {}) {
  return request({
    url: URL_PREFIX + '/main/user/sendEmailCode',
    method: 'post',
    data
  })
}
// 注冊(cè)
export function register(data = {}) {
  return request({
    url: URL_PREFIX + '/main/user/register',
    method: 'post',
    data
  })
}

3、服務(wù)端發(fā)送驗(yàn)證碼

@PostMapping("/user/sendEmailCode")
@ApiOperation("發(fā)送驗(yàn)證碼處理器")
public BaseResult sendEmailCode(@RequestBody @Validated SendEmailCodeDTO dto, HttpServletRequest request){
    BaseResult result = BaseResult.ok();
    baseService.sendEmailCode(dto, request, result);
    return result;
}

實(shí)現(xiàn)類(lèi)

@Override
public void sendEmailCode(SendEmailCodeDTO dto, HttpServletRequest request, BaseResult result) {
    long startTime = System.currentTimeMillis();
    try {
        // 驗(yàn)證碼發(fā)送頻率控制驗(yàn)證
        String string = redisUtil.getString(redisUtil.getCacheKey(CachePrefixContent.PUBLIC_EMAIL_CODE_TIME, dto.getEmail()));
        if (StringUtils.hasLength(string)) {
            result.setCode(CurrencyErrorEnum.OPERA_ERROR.getCode());
            result.setMsg(CurrencyErrorEnum.OPERA_ERROR.getMsg() + ",驗(yàn)證碼發(fā)送過(guò)于頻繁,請(qǐng)稍后再試");
        } else {
            // 生成6位數(shù)驗(yàn)證碼
            String code = StringUtil.generatorCode(6);
            // 將驗(yàn)證碼存入redis,有效期3分鐘
            redisUtil.set(redisUtil.getCacheKey(CachePrefixContent.PUBLIC_EMAIL_CODE, dto.getEmail()), code, 3L, TimeUnit.MINUTES);
            // 調(diào)用mail發(fā)送郵件
            sendMailUtil.sendMail(dto.getEmail(), "郵箱驗(yàn)證碼", sendMailUtil.buildCodeContent(code));
            // 驗(yàn)證碼發(fā)送頻率控制
            redisUtil.set(redisUtil.getCacheKey(CachePrefixContent.PUBLIC_EMAIL_CODE_TIME, dto.getEmail()), dto.getEmail(), 30L, TimeUnit.SECONDS);
        }
    } catch (Exception e) {
        log.error("郵箱驗(yàn)證碼發(fā)送失敗,{}", e);
        result.setCode(CurrencyErrorEnum.OPERA_ERROR.getCode());
        result.setMsg(CurrencyErrorEnum.OPERA_ERROR.getMsg());
    } finally {
        long endTime = System.currentTimeMillis();
        log.info("【{}】【郵箱驗(yàn)證碼發(fā)送接口】【{}ms】 \n入?yún)?{}\n出參:{}", "發(fā)送驗(yàn)證碼", endTime - startTime, dto, result);
    }
}

4、服務(wù)端用戶(hù)注冊(cè)接口

@PostMapping("/user/register")
@ApiOperation("新用戶(hù)注冊(cè)處理器")
public BaseResult register(@RequestBody @Validated UserRegirsterDTO dto, HttpServletRequest request){
    BaseResult result = BaseResult.ok();
    userService.register(dto, request, result);
    return result;
}

實(shí)現(xiàn)類(lèi),非必要代碼就省略了哈

@Override
@Transactional
public void register(UserRegirsterDTO dto, HttpServletRequest request, BaseResult result) {
    long startTime = System.currentTimeMillis();
    try {
        // 因?yàn)閭鬏斶^(guò)程中對(duì)密碼進(jìn)行加密了,先解密在驗(yàn)證長(zhǎng)度
        String password = RSAUtil.decrypt(dto.getPassword(), commonConfig.getRsaPrivateKey());
        if (password.length() > 16) {
            result.setCode(CurrencyErrorEnum.REQUEST_PARAMETER_ERROR.getCode());
            result.setMsg(CurrencyErrorEnum.REQUEST_PARAMETER_ERROR.getMsg() + ",用戶(hù)密碼最大16個(gè)字符");
            return;
        }
        //  去redis獲取郵箱驗(yàn)證碼
        String sysCode = redisUtil.getString(redisUtil.getCacheKey(CachePrefixContent.PUBLIC_EMAIL_CODE, dto.getEmail()));
        // 驗(yàn)證碼存在且與參數(shù)傳遞過(guò)來(lái)的相等
        if (StringUtils.hasLength(sysCode) && sysCode.equals(dto.getCode())) {
            // 清楚這個(gè)驗(yàn)證碼
            redisUtil.removeKey(redisUtil.getCacheKey(CachePrefixContent.PUBLIC_EMAIL_CODE, dto.getEmail()));
            // 郵箱綁定賬號(hào)數(shù)驗(yàn)證 ...
            // 用戶(hù)名唯一驗(yàn)證 ...
            // 用戶(hù)注冊(cè)
            User user = new User();
            BeanUtils.copyProperties(dto, user);
            user.setCreateTime(LocalDateTime.now());
            user.setUserId(IdUtil.simpleUUID());
            user.setPassword(passwordEncoder.encode(password));
            int insert = userMapper.insert(user);
            // 用戶(hù)注冊(cè)后的一系列權(quán)限分配,初始化...
        } else {
            // 未查詢(xún)到驗(yàn)證碼,返回驗(yàn)證碼校驗(yàn)失敗
            result.setCode(CurrencyErrorEnum.OPERA_ERROR.getCode());
            result.setMsg(CurrencyErrorEnum.OPERA_ERROR.getMsg() + ",驗(yàn)證碼校驗(yàn)失敗");
        }
    } catch (Exception e) {
        log.error("新用戶(hù)注冊(cè)失敗,{}", e);
        result.setCode(CurrencyErrorEnum.OPERA_ERROR.getCode());
        result.setMsg(CurrencyErrorEnum.OPERA_ERROR.getMsg());
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    } finally {
        long endTime = System.currentTimeMillis();
        log.info("【{}】【新用戶(hù)注冊(cè)接口】【{}ms】 \n入?yún)?{}\n出參:{}", "新增", endTime - startTime, JSON.toJSONString(dto), result);
    }
}
結(jié)語(yǔ)

今天這個(gè)案例就分享到這,總結(jié)一下

1、在發(fā)送請(qǐng)求時(shí),作為前端需根據(jù)需求嚴(yán)格的對(duì)參數(shù)進(jìn)行較驗(yàn),無(wú)誤后發(fā)送請(qǐng)求。

2、作為后端來(lái)講,接口設(shè)計(jì)應(yīng)極為嚴(yán)格,需自行參數(shù)驗(yàn)證,不能相信前端,因?yàn)楹苡锌赡?,設(shè)計(jì)的接口會(huì)脫離瀏覽器被訪問(wèn)。

3、此案例代碼較多,部分不相關(guān)的代碼省略了,請(qǐng)周知。

4、制作不易,一鍵三連再走吧,您的支持永遠(yuǎn)是我最大的動(dòng)力!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-474462.html

到了這里,關(guān)于SpringBoot整合郵箱驗(yàn)證碼實(shí)現(xiàn)用戶(hù)注冊(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 尚融寶20-實(shí)現(xiàn)用戶(hù)注冊(cè)和用戶(hù)認(rèn)證

    尚融寶20-實(shí)現(xiàn)用戶(hù)注冊(cè)和用戶(hù)認(rèn)證

    目錄 一、需求 二、前端整合發(fā)送驗(yàn)證碼 三、實(shí)現(xiàn)用戶(hù)注冊(cè) 1、創(chuàng)建VO對(duì)象 2、定義常量 3、引入MD5工具類(lèi) 4、Controller 5、Service 6、前端整合 四、實(shí)現(xiàn)用戶(hù)登錄 1、后端整合JWT 2、前端整合 五、校驗(yàn)用戶(hù)登錄 1、后端 2、前端 ? 點(diǎn)擊獲取驗(yàn)證碼后先對(duì)手機(jī)號(hào)進(jìn)行驗(yàn)證是否為空,其

    2023年04月21日
    瀏覽(21)
  • HTML實(shí)現(xiàn)用戶(hù)注冊(cè)頁(yè)面

    HTML實(shí)現(xiàn)用戶(hù)注冊(cè)頁(yè)面

    效果圖: 編寫(xiě)代碼的時(shí)候用到了大量的正則表達(dá)式,大家可以去主頁(yè)里找一下,里面有一篇就是關(guān)于常用正則表達(dá)式的介紹。

    2024年02月11日
    瀏覽(24)
  • Java開(kāi)發(fā):實(shí)現(xiàn)用戶(hù)注冊(cè)登錄的功能

    Java開(kāi)發(fā):實(shí)現(xiàn)用戶(hù)注冊(cè)登錄的功能

    一、前言 在Java開(kāi)發(fā)過(guò)程中,實(shí)現(xiàn)用戶(hù)的注冊(cè)功能是最基本的,用戶(hù)通過(guò)手機(jī)號(hào)或者郵箱作為注冊(cè)賬號(hào)也是非常常見(jiàn)的操作方式,不管是通過(guò)手機(jī)號(hào)注冊(cè)或者郵箱注冊(cè),原理都差不多,那么本文就來(lái)分享一下在Java開(kāi)發(fā)過(guò)程中的用戶(hù)注冊(cè)賬號(hào)的功能實(shí)現(xiàn)。 二、準(zhǔn)備工作 1、通過(guò)

    2023年04月09日
    瀏覽(24)
  • Django用戶(hù)認(rèn)證: 利用Django Auth模塊實(shí)現(xiàn)用戶(hù)注冊(cè)、登錄與登出

    用戶(hù)登錄注冊(cè)屬于用戶(hù)認(rèn)證的一部分,Django內(nèi)置了一套用戶(hù)認(rèn)證體系,使用起來(lái)比較方便,而且支持用戶(hù)定制和拓展,足以滿(mǎn)足任何復(fù)雜的業(yè)務(wù)需求。 Django框架中,用戶(hù)權(quán)限管理被劃分為三個(gè)層次: 用戶(hù) :系統(tǒng)使用者,擁有自己的權(quán)限??杀灰粋€(gè)或多個(gè)用戶(hù)組包含。 用戶(hù)組

    2023年04月20日
    瀏覽(26)
  • 用前端框架Bootstrap和Django實(shí)現(xiàn)用戶(hù)注冊(cè)頁(yè)面

    用前端框架Bootstrap和Django實(shí)現(xiàn)用戶(hù)注冊(cè)頁(yè)面

    命令如下: 執(zhí)行下面條命令依次創(chuàng)建需要的應(yīng)用: 名叫users的應(yīng)用創(chuàng)建好后,還需要在全局配置文件中對(duì)應(yīng)在用進(jìn)行注冊(cè),具體方法如下: 打開(kāi)““E:Python_projectP_001myshop-testmall_backendmall_backendsettings.py””文件,找到名叫“INSTALLED_APPS”的列表(list),在其中加入應(yīng)用名,

    2024年02月06日
    瀏覽(30)
  • MVC框架實(shí)現(xiàn)用戶(hù)登錄注冊(cè)功能(連接數(shù)據(jù)庫(kù))

    MVC框架實(shí)現(xiàn)用戶(hù)登錄注冊(cè)功能(連接數(shù)據(jù)庫(kù))

    一、簡(jiǎn)單理解MVC框架 二、項(xiàng)目結(jié)構(gòu) 三、項(xiàng)目源碼 3.1 User 3.2?UserDao 3.3?RegisterDao 3.4?servletControll 3.5 servletControllRegister 3.6?web.xml 3.7?login.jsp 3.8?register.jsp 3.9?success.jsp 3.10?failure.jsp ?四、實(shí)現(xiàn)效果 總結(jié) 本篇文章主要介紹利用MVC框架去實(shí)現(xiàn)一個(gè)簡(jiǎn)單的用戶(hù)登錄注冊(cè)功能,內(nèi)容主

    2024年02月06日
    瀏覽(38)
  • 使用Django Rest Framework設(shè)計(jì)與實(shí)現(xiàn)用戶(hù)注冊(cè)API

    在現(xiàn)代Web應(yīng)用開(kāi)發(fā)中,RESTful API已成為前后端分離架構(gòu)中的關(guān)鍵組件。Django Rest Framework (DRF) 是一款基于Django的優(yōu)秀庫(kù),提供了豐富的工具和接口,極大地簡(jiǎn)化了RESTful API的設(shè)計(jì)與實(shí)現(xiàn)。本文將以用戶(hù)注冊(cè)功能為例,展示如何運(yùn)用DRF構(gòu)建一個(gè)完整的API端點(diǎn),包括數(shù)據(jù)驗(yàn)證、模型

    2024年04月25日
    瀏覽(19)
  • 用Java代碼實(shí)現(xiàn)學(xué)生管理系統(tǒng)(可實(shí)現(xiàn)用戶(hù)登錄注冊(cè)功能)

    用Java代碼實(shí)現(xiàn)學(xué)生管理系統(tǒng)(可實(shí)現(xiàn)用戶(hù)登錄注冊(cè)功能)

    簡(jiǎn)單實(shí)現(xiàn)學(xué)生系統(tǒng)的登錄和注冊(cè),以及學(xué)生信息添加、刪除,修改、查詢(xún)功能。根據(jù)需求,創(chuàng)建一個(gè)學(xué)生類(lèi)和和用戶(hù)類(lèi)以及學(xué)生系統(tǒng)類(lèi),在登錄管理系統(tǒng)之前需要先注冊(cè)用戶(hù),只有輸入正確的用戶(hù)名和密碼才可以登錄,忘記密碼后可以根據(jù)用戶(hù)信息進(jìn)行修改,用容器存儲(chǔ)學(xué)生

    2024年02月05日
    瀏覽(24)
  • “Layui用戶(hù)認(rèn)證:實(shí)現(xiàn)安全高效的登錄和注冊(cè)體驗(yàn)”

    “Layui用戶(hù)認(rèn)證:實(shí)現(xiàn)安全高效的登錄和注冊(cè)體驗(yàn)”

    layui(諧音:類(lèi) UI) 是一套開(kāi)源的 Web UI 解決方案,采用自身經(jīng)典的模塊化規(guī)范,并遵循原生 HTML/CSS/JS 的開(kāi)發(fā)方式,極易上手,拿來(lái)即用。其風(fēng)格簡(jiǎn)約輕盈,而組件優(yōu)雅豐盈,從源代碼到使用方法的每一處細(xì)節(jié)都經(jīng)過(guò)精心雕琢,非常適合網(wǎng)頁(yè)界面的快速開(kāi)發(fā)。layui 區(qū)別于那些基

    2024年02月16日
    瀏覽(24)
  • Django實(shí)現(xiàn)用戶(hù)注冊(cè)登錄,表單提交后跳轉(zhuǎn)網(wǎng)頁(yè)(學(xué)習(xí)筆記)

    Django實(shí)現(xiàn)用戶(hù)注冊(cè)登錄,表單提交后跳轉(zhuǎn)網(wǎng)頁(yè)(學(xué)習(xí)筆記)

    效果圖如下: ? 使用命令提示符,進(jìn)入想存放項(xiàng)目的目錄: 在項(xiàng)目coco目錄下新建static文件夾,用于存放網(wǎng)頁(yè)文件的css,js,imgs 在coco_app目錄下新建文件夾templates,用于存放需要用到的HTML網(wǎng)頁(yè) 打開(kāi)coco文件夾中的settings.py注冊(cè)coco_app 引用templates 連接數(shù)據(jù)庫(kù),這里我用的MySQL數(shù)據(jù)

    2023年04月11日
    瀏覽(53)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包