MVC前端與後端校驗
<1>首先是在專案中新增一個ADO.NET實體資料模型,選擇MemberInfo表 他會自動在模型裡面生成一個MemberInfo的類,也會生成一個對應的實體類DataBaseEntities。用的時候只有用模型裡的MemberInfo類和DataBaseEntities就好了。 不需再額外新增MemberInfo類了 【注意:這個DataBaseEntities 是你的資料庫名字+Entities】
<2>現在要寫使用者註冊的功能。MemberInfo類(資料表)裡有很多欄位的,而我們註冊只需要用到 Mobile 和 Email 和Pwd欄位 所以這裡。我們單獨建立一個Member的類 ,類裡面有註冊要用到的欄位。如Email,Moblie Pwd ,RePwd ,Vcode等欄位。
<3> 然後我們給Index 新增強型別檢視,檢視資料類就選擇我們要進行註冊的這個 Member類就好了。
<4> 當用戶填寫完資料點選提交的時候,我們再把Member類對應的欄位 賦值給MemberInfo欄位對應的欄位 。然後對MemberInfo進行跟新到資料儲存資料
大概流程是:bigTreeEntities db = new bigTreeEntities();
namespace bigtree.Controllers { public class AccountController : Controller { // // GET: /register/ bigTreeEntities db = new bigTreeEntities(); [HttpPost] public ActionResult Register(Member member) //Member是用於註冊的類。生成強型別檢視,選擇的檢視資料類就是Member。使用者填寫的資料的值其實就是賦給Member類的相應欄位的 { //Member是一個註冊要用到的類。Member類裡有註冊要用到的所有欄位 MemberInfo info = new MemberInfo(); //MemberInfo是資料實體類。新增實體的時候,選擇的表,自動生成的對應的類 info.mobile = member.Mobile; //將註冊類Member的欄位賦值賦值給實體類MemberInfo對應的欄位 info.email = member.Email; info.pwd = EncryptNoPrefix(member.Pwd); //對密碼進行MD5加密 //bigTreeEntities con = new bigTreeEntities(); //db.AddToMemberInfo(info); // 用於向 MemberInfo EntitySet 新增新物件的方法,已棄用 。改成下面的b.MemberInfo.AddObject(info); db.MemberInfo.AddObject(info); //將物件新增到當前實體集中的物件上下文。 db.SaveChanges(); // 將所有更新儲存到資料來源並重置物件上下文中的更改跟蹤。 return RedirectToAction("Index", "Login"); //跳轉到Login控制器下的Index方法 } } }
======================================================言歸正傳,下面開始做
Account控制器
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using bigtree.ViewModel; using System.Security.Cryptography; using bigtree.Actions; using System.Text.RegularExpressions; using Peer._128uu.DAL.Models; namespace bigtree.Controllers { public class AccountController : Controller { // // GET: /register/ bigTreeEntities db = new bigTreeEntities(); public ActionResult Index() { return View(); } /// <summary> /// MD5加密 /// </summary> /// <param name="encField">要加密的欄位</param> /// <returns></returns> public static string EncryptNoPrefix(string encField) { //input = mixtureSeed + input; System.Security.Cryptography.MD5 md5 = new MD5CryptoServiceProvider(); byte[] datSource = System.Text.Encoding.Default.GetBytes(encField); byte[] newSource = md5.ComputeHash(datSource); string byte2String = null; for (int i = 0; i < newSource.Length; i++) { string thisByte = newSource[i].ToString("x"); if (thisByte.Length == 1) thisByte = "0" + thisByte; byte2String += thisByte; } return byte2String; } /// <summary> /// 通過get請求跳到這個頁面的時候直接進入Index頁面。 /// </summary> /// <returns></returns> public ActionResult Register() { return View("Index"); } /// <summary> /// 後臺驗證寫在這個Post請求的註冊方法中,在驗證全部通過後將資料儲存到資料 /// </summary> /// <param name="member">Member是用於註冊的類。生成強型別檢視,選擇的檢視資料類就是Member。使用者填寫的資料的值其實就是賦給Member類的相應欄位的</param> /// <returns></returns> [HttpPost] public ActionResult Register(Member member) { if (string.IsNullOrWhiteSpace(member.Mobile)) { ViewData["errorMobile"] = "手機號碼不能為空"; return View("Index"); } if (!Regex.IsMatch(member.Mobile, @"^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$")) { ViewData["errorMobile"] = "手機號碼已存在或格式不正確"; return View("Index"); } //Any:確定序列中的任何元素是否存在或滿足條件,如果滿足條件,則返回true,否則返回false; //db.MemberInfo.Any(x => x.mobile == member.Mobile)的返回值是一個bool值 //檢查使用者輸入的手機號碼( member.Mobile是否在資料庫中也有同樣的手機號碼(x.mobile)) var queryMobile = db.MemberInfo.Any(x => x.mobile == member.Mobile); if (queryMobile) { ViewData["errorMobile"] = "手機號碼已存在"; return View("Index"); } if (string.IsNullOrWhiteSpace(member.Email)) { ViewData["errorEmail"] = "手機號碼不能為空"; } if (!Regex.IsMatch(member.Email, @"^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$")) { ViewData["errorEmail"] = "郵箱格式錯誤,請重新輸入"; return View("Index"); } var queryEmail = db.MemberInfo.Any(x => x.email == member.Email); if (queryEmail) { ViewData["errorEmail"] = "電子郵箱已存在"; return View("Index"); } if (string.IsNullOrWhiteSpace(member.Pwd)) { ViewData["errorPwd"] = "密碼不能為空"; return View("Index"); } if (member.Pwd.Length < 6) { ViewData["errorPwd"] = "密碼不能少於6位"; return View("Index"); } if (member.RePwd != member.Pwd) { ViewData["errorRePwd"] = "密碼不一致,請重新輸入"; return View("Index"); } if (member.Vcode != Session["ValidateCode"].ToString()) { ViewData["errorCode"] = "驗證碼錯誤,請重新輸入"; return View("Index"); } MemberInfo info = new MemberInfo();//MemberInfo是資料實體類。新增實體的時候,選擇的表,自動生成的對應的實體類 //Member是一個註冊要用到的類。Member類裡有註冊要用到的所有欄位 info.mobile = member.Mobile; //將註冊類Member的欄位賦值賦值給實體類MemberInfo對應的欄位 info.email = member.Email; info.pwd = EncryptNoPrefix(member.Pwd); //對密碼進行MD5加密 //bigTreeEntities con = new bigTreeEntities(); //db.AddToMemberInfo(info); // 用於向 MemberInfo EntitySet 新增新物件的方法,已棄用 。改成下面的b.MemberInfo.AddObject(info); db.MemberInfo.AddObject(info); //將物件新增到當前實體集中的物件上下文。 db.SaveChanges(); // 將所有更新儲存到資料來源並重置物件上下文中的更改跟蹤。 return RedirectToAction("Index", "Login"); //跳轉到Login控制器下的Index方法 } public ActionResult CheckMobile(string mobile) { var queryMobile = db.MemberInfo.Any(x => x.mobile == mobile); if (queryMobile) { return Json("{success:false,message:'手機號碼已經存在'}", JsonRequestBehavior.AllowGet); } return Json("{success:true,message:'手機號碼可以使用'}", JsonRequestBehavior.AllowGet); } public ActionResult CheckEmail(string email) { var queryEmail = db.MemberInfo.Any(x => x.email == email); if (queryEmail) { return Json("{success:false,message:'Email已經存在'}", JsonRequestBehavior.AllowGet); } return Json("{success:true,message:'Email可以使用'}", JsonRequestBehavior.AllowGet); } //驗證碼生成器。 public ActionResult GetValidateCode() { ValidateCode vCode = new ValidateCode(); string code = vCode.CreateValidateCode(5); Session["ValidateCode"] = code; byte[] bytes = vCode.CreateValidateGraphic(code); return File(bytes, @"image/jpeg"); } } }
Index檢視
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<bigtree.ViewModel.Member>" %>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="keywords" content="關鍵詞1,關鍵詞2,關鍵詞3" />
<meta name="description" content="對網站的描述" />
<title>網站</title>
<link href="../../Html/css/style.css" rel="stylesheet" type="text/css" />
<link href="../../Html/css/register.css" rel="stylesheet" type="text/css" />
<script src="../../Html/js/jquery-1.8.3.min.js" type="text/javascript"></script>
<script src="../../Html/js/js.js" type="text/javascript"></script>
<script src="../../Scripts/jquery.validate.min.js" type="text/javascript"></script>
<style type="text/css">
</style>
<script type="text/javascript">
//將字串轉換成Json
function strToJson(str) {
var json = eval('(' + str + ')');
return json;
}
$(function () {
//手機號碼驗證
jQuery.validator.addMethod("isMobile", function (value, element) {
var tel = /13[0-9]{9}$|15[0-9]{9}$|18[0-9]{9}$/;
var isPass = this.optional(element) || (tel.test(value));
if (isPass) {
$.ajax({
url: "/Account/CheckMobile",
data: { mobile: $("#Mobile").val() },
dataType: "Json",
async: false,
success: function (data) {
//alert(data)
var dataNews = strToJson(data)
isPass = dataNews.success;
//alert(isPass);
//$("#lableMobile").text(dataNews.message);
}
});
}
//alert(isPass);
return isPass;
}, "請正確填寫您的手機號碼");
//E-mail驗證
jQuery.validator.addMethod("isEmailUsed", function (value, element) {
var f = false;
$.ajax({
url: "/Account/CheckEmail",
data: { email: $("#Email").val() },
async: false,
success: function (res) {
var resNews = strToJson(res);
f = resNews.success;
}
});
return f;
}, "請使用其他郵箱");
$('form').validate({
rules: {
Mobile: {
required: true,
isMobile: true
},
Email: {
required: true,
email: true,
isEmailUsed: true
},
Pwd: {
required: true,
minlength: 6
},
RePwd: {
required: true,
equalTo: '#Pwd'
},
valiCode: {
required: true
}
},
messages: {
Mobile: {
required: "請輸入手機號碼",
isMobile: "手機號碼已存在或格式不正確"
},
Email: {
required: "請輸入郵箱",
email: "郵箱格式錯誤,請重新輸入",
isEmailUsed: "郵箱已經存在"
},
Pwd: {
required: "請填寫密碼",
minlength: "密碼不能少於6位"
},
RePwd: {
required: "請重複輸入密碼",
equalTo: '密碼不一致,請重新輸入'
},
valiCode: {
required: "請輸入驗證碼"
}
},
submitHandler: function (form) {
form.submit();
}
});
});
</script>
</head>
<body>
<% using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @id="form1",@name="form1" }))
{%>
<%: Html.ValidationSummary(true)%>
<!--頂部+logo+導航-->
<div class="logo_box">
<div id="logo">
<a title="我的王網">我的王網官網</a></div>
</div>
<!---->
<div class="registerCon">
<h2>
註冊新會員<span class="oldUser">已有賬戶?<a href="../../Html/login.html">直接登入</a></span></h2>
<ul class="registerForm">
<li>
<p class="registerTil">
手機號:</p>
<div class="setterBd">
<%: Html.TextBoxFor(model => model.Mobile, new { @class = "setterInput fl",@id="Mobile" })%>
<%--<div class="setterExplain" id="lableMobile">
可用作登入名</div>--%>
</div>
</li>
<li>
<p class="registerTil">
Email:</p>
<div class="setterBd">
<%: Html.TextBoxFor(model => model.Email, new { @class = "setterInput fl",@id="Email" })%>
<%--<div class="setterExplain" id="lableEmail">
可用作登入名</div>--%>
</div>
</li>
<li>
<p class="registerTil">
密碼:</p>
<div class="setterBd">
<%: Html.PasswordFor(model => model.Pwd, new { @class = "setterInput fl newPassword" })%>
<%--<%:Html.ValidationMessageFor(model => model.Pwd)%>--%>
<%--<div class="setterExplain" id="lablePwd">
請設定您的登入密碼</div>--%>
<ul class="strength">
<li class="low">弱</li>
<li class="mid">中</li>
<li class="hig">強</li>
</ul>
</div>
</li>
<li>
<p class="registerTil">
請再次輸入密碼:</p>
<div class="setterBd">
<%: Html.PasswordFor(model => model.RePwd, new { @class = "setterInput fl" })%>
<%:Html.ValidationMessageFor(model => model.RePwd)%>
<div class="setterExplain error" id="lableErrorPwd">
</div>
</div>
</li>
<li>
<p class="registerTil">
請輸入驗證碼:</p>
<div class="setterBd">
<input type="text" class="setterInput fl vCode" id="valiCode" name="valiCode" />
<div class="setterExplain">
<a>
<img src="../../Images/yangzhengma_03.png" alt="驗證碼"/>看不清?換一張</a></div>
</div>
</li>
</ul>
<input id="submit" type="submit" value="立即註冊" class="registerBtn" />
</div>
<% } %>
</body>
</html>
ViewModel 註冊類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace bigtree.ViewModel
{
public class Member
{
/// <summary>
/// 使用者手機
/// </summary>
//[Required(AllowEmptyStrings = false, ErrorMessage = "手機號碼不能為空")]
//[RegularExpression(@"^1[3|4|5|8][0-9]\d{4,8}$",ErrorMessage="手機號碼不正確")]
public string Mobile { get; set; }
/// <summary>
/// 密碼
/// </summary>
//[DataType(DataType.Password)]
//[StringLength(12, MinimumLength = 6, ErrorMessage = "密碼長度必須在{2}和{1}位之間")]
//[Required(AllowEmptyStrings=false,ErrorMessage="密碼不能為空")]
public string Pwd { get; set; }
/// <summary>
/// 密碼
/// </summary>
//[DataType(DataType.Password)] //將密碼已*號的形式來顯示
//[Required(AllowEmptyStrings = false, ErrorMessage = "密碼不能為空")]
public string RePwd { get; set; }
/// <summary>
/// 電子郵箱
/// </summary>
//[Required(ErrorMessage = "郵箱不能為空")]
//[RegularExpression(@"[A-Za-z0-9._%+-][email protected][A-Za-z0-9]+\.[A-Za-z]{2,4}", ErrorMessage = "{0}的格式不正確")]
public string Email { get; set; }
/// <summary>
/// 驗證碼
/// </summary>
public string Vcode { get; set; }
}
}
<2>前段Validate校驗
@model ZuCheMvcApp.Models.CR_BC_BRAND_SERIES
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Create</title>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<link href="~/third-party/easyui/jquery-easyui-1.4.1/themes/default/easyui.css" rel="stylesheet" />
<link href="~/third-party/easyui/css/default.css" rel="stylesheet" />
<script src="~/third-party/uploadify-v3.2.1/jquery.uploadify.min.js"></script>
<link href="~/third-party/uploadify-v3.2.1/uploadify.css" rel="stylesheet" />
<script src="~/Scripts/jquery.validate.js"></script>
</head>
<body>
@using (Html.BeginForm("Create", "Bc_Brand_Series", FormMethod.Post, new {@id="form1",@name="form1"}))
{
@Html.AntiForgeryToken()
<div class="panel" style="display: block; width: 400px;">
<div class="panel-header">
<div class="panel-title">品牌車系</div>
</div>
<div class="easyui-panel panel-body">
<table>
<tr><th>汽車品牌編號</th><td>@Html.TextBoxFor(model => model.CR_BC_BRAND_ID)</td></tr>
<tr><th>品牌車系名稱</th><td>@Html.TextBoxFor(model => model.SERIES_NAME)</td></tr>
<tr><th>展示圖片</th>
@*<td>@Html.EditorFor(model => model.SERIES_PIC)</td>*@
<td style="width:300px;padding-top:10px;">
<input type="text" id="PIC_NAME" name="SERIES_PIC" style="display:none;" />
<span id="uploadify"></span>
<div>
<img id="ImgResult" style="max-width: 300px; max-height: 150px; display:none;" />
</div>
</td>
</tr>
<tr><th>不計免賠服務價格</th><td>@Html.TextBoxFor(model => model.CDW_COST)</td></tr>
<tr><th>保險費</th><td>@Html.TextBoxFor(model => model.INSURANCE_COST)</td></tr>
<tr><th>建立人</th><td>@Html.TextBoxFor(model => model.CREATOR_ID)</td></tr>
<tr><th>建立時間</th><td><input type="text" name="CREATED_TIME" value="@DateTime.Now.ToString()" /></td></tr>
<tr style="display:none"><th>修改時間</th><td><input type="text" name="UPDATE_TIME" value="@DateTime.Now.ToString()" /></td></tr>
<tr><td><input type="submit" value="確定" class="btn btn-default" /></td><td>@Html.ActionLink("返回列表", "Index")</td></tr>
</table>
</div>
</div>
}
</body>
</html>
<script type="text/javascript">
$(function () {
$('#uploadify').uploadify({
uploader: '/Bc_Brand_Series/PicUpload',// 伺服器端處理地址
swf: '/third-party/uploadify-v3.2.1/uploadify.swf',
width: 60,
height: 23,
buttonText: "瀏 覽",
buttonClass: "uploadify-button-new",
fileTypeExts: "*.jpg;*.jpeg;*.png",
fileTypeDesc: "請選擇 jpg jpeg png 檔案",
fileSizeLimit: "4MB",
multi: false,
onUploadStart: function (file) {
$("#uploadify").uploadify("settings", "formData", {@foreach (string k in Request.Cookies.AllKeys)
{
@:'[email protected](k)': '@Request.Cookies[k].Value',
}'': ''
});
},
onSelectError: function (file, errorCode, errorMsg) {
switch (errorCode) {
case -110:
//alert($("#uploadify").uploadify("fileSizeLimit"));
alert("檔案 [" + file.name + "] 大小超出系統限制的" + jQuery('#uploadify').uploadify('settings', 'fileSizeLimit') + "大小!");
break;
}
},
onUploadSuccess: function (file, data, response) {
if (data != "") {
$("#ImgResult").show().attr("src", "/upload/car_brand_series/" + data);
$("#PIC_NAME").val(data);
//$("#IMG_URL").val(data);
}
}
});
});
</script>
<script type="text/javascript">
$(function () {
$("#form1").validate({
rules: {
CR_BC_BRAND_ID: { required: true },
SERIES_NAME: { required: true },
SERIES_PIC: { required: true },
CDW_COST: { required: true },
INSURANCE_COST: { required: true },
CREATOR_ID: { required: true },
CREATED_TIME: { required: true },
UPDATE_TIME: { required: true }
},
messages: {
CR_BC_BRAND_ID: { required: "不能為空" },
SERIES_NAME: { required: "*" },
SERIES_PIC: { required: "*" },
CDW_COST: { required: "*" },
INSURANCE_COST: { required: "*" },
CREATOR_ID: { required: "*" },
CREATED_TIME: { required: "*" },
UPDATE_TIME: { required: "*" }
},
submitHandler: function (form) {
//form.submit();
alert("111");
}
});
});
</script>
相關推薦
MVC前端與後端校驗
<1>首先是在專案中新增一個ADO.NET實體資料模型,選擇MemberInfo表 他會自動在模型裡面生成一個MemberInfo的類,也會生成一個對應的實體類DataBaseEntities。用的時候只有用模型裡的MemberInfo類和DataBaseEn
前端校驗與後端校驗
後端驗證是為了保證安全,前端驗證是為了讓使用者體驗更好。 必須在後端校驗的 唯一性驗證,驗證碼,敏感詞,出錯概率高的要做非同步校驗。 後端校驗可以防止介面被私自呼叫導致破壞資料庫結構;避免有人模擬瀏覽器行為直接給伺服器發請求。 有必要在前端校驗的 必填項、(郵
MVC框架(二)----前端與後端MVC、MVVM等設計模式區別與聯絡
上篇文章中提到了前端的框架分類,其中前端JS框架中有些是MVC設計模式,但是java和dotNET平臺也有自己的MVC也有自己的設計模式,這兩類有什麼區別呢,好多猿們甚是不解,旁徵博引
JSR303 後端校驗包的使用
class valid repos mapping org employee errors 提示信息 .post 1.首先通過Maven導入JSR303架包。 <!-- https://mvnrepository.com/artifact/org.hibernate
JSR303後端校驗
空檢查 @Null 驗證物件是否為null @NotNull 驗證物件是否不為null, 無法查檢長度為0的字串 @NotBlank 檢查約束字串是不是Null還有被Trim的長度是否大於0,
前端與後端介面的互動案例
一、案例描述 1,前端頁面提供使用者名稱,密碼輸入框。 2,通過Ajax傳送請求到後端Serlvet。 3,後端Serlvet處理請求,根據輸入的使用者名稱和密碼返回給前端不同資訊 前端訪問後端介面通過後端提供的的URL 二、主要程式碼 1、前端頁面 <!
Web-API請求前端與後端對應分析
api請求分析 Http請求的頭部: 1.前端 ContentType="application/x-www-form-urlencoded" Request URL:http://apidem
使用spring validation完成資料後端校驗
前言 資料的校驗是互動式網站一個不可或缺的功能,前端的js校驗可以涵蓋大部分的校驗職責,如使用者名稱唯一性,生日格式,郵箱格式校驗等等常用的校驗。但是為了避免使用者繞過瀏覽器,使用http工具直接向後端請求一些違法資料,服務端的資料校驗也是必要的,可以防止髒資
springmvc中後端校驗@Valid註解
@Valid註解用於校驗,所屬包為:javax.validation.Valid。① 首先需要在實體類的相應欄位上新增用於充當校驗條件的註解,如:@Min,如下程式碼(age屬於Girl類中的屬性):@Min(value = 20,message = "結婚年齡限制") p
前端與後端互動
具體 IP埠 視情況而定 續作修改 經供參考 前端提交表單的形式共有2中: get 將網址與表單內容做拼接成url 一起提交
學習Spring Boot:(十)使用hibernate validation完成資料後端校驗
前言 後臺資料的校驗也是開發中比較注重的一點,用來校驗資料的正確性,以免一些非法的資料破壞系統,或者進入資料庫,造成資料汙染,由於資料檢驗可能應用到很多層面,所以系統對資料校驗要求比較嚴格且追求可變性及效率。 瞭解 瞭解一點概念性的東東。 * JSR 3
js 解析json 常用方法 --前端與後端的互動(前端)
(1)前端js解析前端json資料: one: javascript定義json物件變數: var jsonobject={};//可以不使用宣告,推薦宣告一下,嚴格一些,最好使用嚴格模式 賦值json物件的key-value值: jsonobject[key]=v
web前端與後端的區別
Internet採用超文字和超媒體的資訊組織方式,將資訊的連結擴充套件到整個Internet上。Web就是一種超文字資訊系統,Web的一個主要的概念就是超文字連線,它使得文字不再象一本書一樣是固定的線性的。而是可以從一個位置跳到另外的位置。可以從中獲取更多的資訊。可以轉到別的主題上。想要了解某一個主題的內容只
一個前端與後端分離的架構例項
最近在為新系統的架構進行選型,覺得前後分離是個選擇的方向,當然也還有很多待解決問題。這篇很有幫助,原文如下: 看了《系統架構:Web應用架構的新趨勢---前端和後端分離的一點想法》 這篇文章,對前端與後端的分離非常認同,這樣做對於系統的維護是有相當大的好處的。正好自己也設
利用jquery ajax前端與後端的檔案傳輸
首先了解下$ ajax裡面的各個屬性1.url: 要求為String型別的引數,(預設為當前頁地址)傳送請求的地址。2.type: 要求為String型別的引數,請求方式(post或get)預設為get。3.timeout: 要求為Number型別的引數,設定請求超時時間(毫
sign in with apple後端校驗(java)
最近新開發的ios平臺的app在提審的時候,被拒了,原因是app上如果有接第三方登陸(比如,微信,微博,facebook等),那就必須要接apple id登陸,坑爹~蘋果霸權啊!然而沒辦法,靠他吃飯,他是爸爸,唯有順從。下面我來說一下對接蘋果登陸的後端驗證模組,目前這一塊網上資料比較少,而且說得不夠完整。
前後端分離與權限校驗
重定向 code 請求 負責 功能 用戶 直接 ace 認證 我在寫web項目時,總是會為權限認證犯愁。在采用前後端分離後,後端只提供接口,項目的路由不再歸後端管,而是由代理服務器(Nginx)控制。對於一般公開資源,URL的路由並不依賴於用戶的狀態,因此光靠代理服務器控制
Spring MVC之中前端向後端傳數據
變化 性別 debug lan 直接 oot try 方向 表單 Spring MVC之中前端向後端傳數據 Spring MVC之中前端向後端傳數據和後端向前端傳數據是數據流動的兩個方向, 在此先介紹前端向後端傳數據的情況. 一般而言, 前端向後端傳數據的場景, 大多是出
淺析前端渲染與後端渲染
前端渲染與後端渲染本質上可以理解為:瀏覽器渲染與伺服器渲染 備註:以下純屬本人個人的一些總結與看法,如有異同,歡迎大家指教; 渲染的本質:字串的拼接,將資料渲染進固定格式的html程式碼中,形成最終的html顯示在使用者頁面上。 對比:
作為一個前端應該如何高效的與後端協作開發
前言 人們總是不斷地在為提高工作效率不斷的努力,發明新的東西,開創新的方式,目的是為了讓生活越來越簡單,越來越美好。所以隨著技術的發展,前後端分離越來越明確,以至於職位分化也越來越明確。 1. 前後端分離 前端與後端的分離,能使前端的開發脫離後端的開發模式,擁有更大的自由度,以此便可做前