页面访问
请求路径 | login.htm
请求方式 | GET
请求参数 | 参数表
返回值 | 表单验证码 | 变量：formCaptcha 类型：FormCaptcha
说明 | 1.当未登录用户访问需要登录的页面时URL会自动带有jumpUrl参数，为当前URL的Base64编码,可以设计登录成功后跳转到登录前页面功能 2.当未登录用户访问需要登录的页面时默认会自动跳转到登录页,Ajax提交的请求会返回jumpPath字段的请求头,值是要跳转的登录页

页面访问 - AJAX方式
请求路径 | login.htm
请求方式 | GET
自定义请求头 | 协议头：X-Requested-With 值：XMLHttpRequest
请求成功返回 | JSON格式值 类型:FormCaptcha | 值内容说明：表单验证码

表单验证码 FormCaptcha
变量 | 类型 | 说明
--- | --- | ---
showCaptcha | boolean | 是否显示验证码
captchaKey | String | 验证码编号
说明 | Freemarker模板不支持直接输出布尔类型(boolean),布尔类型对象输出要使用内建函数c将布尔值转换为字符串；例如布尔类型${formCaptcha.showCaptcha}要写成${formCaptcha.showCaptcha?c}才能正确显示；比较${formCaptcha.showCaptcha?c == 'true'}

提交 会员登录 - 默认方式
请求路径 | login.htm
请求方式 | POST
请求参数 | 参数表
提交成功返回 | 默认跳转到jump模板页显示提交成功信息；跳转路径参数jumpUrl有值时按参数值路径跳转
提交失败返回 | 错误值 | 变量：error 类型：Map<String,String>

提交 会员登录 - AJAX方式
请求路径 | login.htm
请求方式 | POST
自定义请求头 | 协议头：X-Requested-With 值：XMLHttpRequest
请求参数 | 参数表
提交返回 | JSON格式值 类型:Map<String,Object> | 键参数：success 值内容说明：成功返回true 失败返回false 值类型：String
键参数：error 值内容说明：错误值集合 值类型：Map<String,String>
键参数：captchaKey 值内容说明：验证码编号
键参数：jumpUrl 值内容说明：登录前URL；success为true时有值
键参数：systemUser 值内容说明：登录用户；success为true时有值 值类型：AccessUser
键参数：accessToken 值内容说明：访问令牌
键参数：refreshToken 值内容说明：刷新令牌

用户 AccessUser
变量 | 类型 | 说明
--- | --- | ---
id | long | Id
account | String | 账号

校验验证码
请求路径 | checkCaptcha.htm
请求方式 | GET
返回类型 | JSON
必填参数 | captchaKey : 验证码编号 captchaValue : 验证码值 同一编号验证码每分钟提交次数不能超过60次,超出时验证码图片返回空字符
提交返回 | 字符串格式值 类型:String | 值内容说明：成功返回true 失败返回false 值类型：String

会员登录 错误值 error
变量 | 类型 | 说明
--- | --- | ---
account | String | 账号错误
mobile | String | 手机号错误
type | Integer | 用户类型错误
password | String | 密码错误
captchaValue | String | 验证码错误
token | String | 令牌错误

访问'会员登录'页参数
参数 | 类型 | 是否必填 | 说明
--- | --- | --- | ---
code | String | 按需填写 | 微信公众号code 在微信浏览器使用此参数可以实现保持登录状态

提交'会员登录'参数
参数 | 类型 | 是否必填 | 说明
--- | --- | --- | ---
account | String | 按需填写 | 账号
type | Integer | 是 | 用户类型
mobile | String | 按需填写 | 手机号
password | String | 是 | 密码 必须执行sha256一次
captchaKey | String | 按需填写 | 验证码编号
captchaValue | String | 按需填写 | 验证码值 同一编号验证码每分钟提交次数不能超过60次,超出时验证码图片返回空字符
token | String | 是 | 令牌
thirdPartyOpenId | String | 按需填写 | 第三方用户获取唯一标识 例如微信公众号openid
jumpUrl | String | 否 | '提交表单 - 默认方式'提交成功后跳转路径,不填写默认跳转到首页；参数必须经过encodeBase64URL编码后才能提交。例${encodeBase64URL('/index')}

## 示例

<form id="loginForm" name="login" method="post" autocomplete="off" action="login?jumpUrl=${url_jumpUrl}"> <!-- 令牌标记 --> <input type="hidden" id="token" name="token" value="${token}"> <#-- 账号 --> <input id="account" name="account" type="text" maxLength="40" value="" /> <#-- 用户名错误 --> ${(error['account'])!} <#-- 密码 --> <input id="password" name="password" type="password" maxLength="20" value="" /> <#-- 密码错误 --> ${(error['password'])!} <#-- 验证码 --> <input type="hidden" id="captchaKey" name="captchaKey" value="${formCaptcha.captchaKey}"> <#-- 验证码值 --> <input id="captchaValue" name="captchaValue" type="text" value=""/> <#-- 验证码图片 --> <img id="captcha" src="captcha/${formCaptcha.captchaKey!}.jpg"/> <#-- 验证码错误 --> ${(error['captchaValue'])!} <#-- 令牌错误 --> ${error['token']} <#-- 密码必须使用sha256加密一次才能提交 CryptoJS.SHA256(password) --> <input type="submit" value="默认提交" /> <#-- ajax提交请看下面示例 --> <input type="button" value="ajax提交" onClick="javascript:ajaxSubmit();"> </form> <#-- 组装提交参数 必须引入cryptoJS/core.js 和cryptoJS/sha256.js --> <script type="text/javascript" language="javascript"> //组装参数 function getParameter(){ var parameter = ""; //url跳转参数 var jumpUrl = getUrlParam("jumpUrl"); if(jumpUrl != null){ parameter += "&jumpUrl="+encodeURIComponent(jumpUrl); } //令牌标记 var token = document.getElementById("token").value; parameter += "&token="+token; //验证码Key var captchaKey = document.getElementById("captchaKey"); if(captchaKey != null){ parameter += "&captchaKey="+encodeURIComponent(captchaKey.value); } //验证码值 var captchaValue = document.getElementById("captchaValue"); if(captchaValue != null){ parameter += "&captchaValue="+encodeURIComponent(captchaValue.value); } //账号 var account = document.getElementById("account").value; parameter += "&account="+encodeURIComponent(account); //密码需SHA256加密 var password = document.getElementById("password").value; if(password != ""){ //password在加密前要原始数据，不能进行任何转义 parameter += "&password="+ CryptoJS.SHA256(password); } //删除第一个&号,防止因为多了&号而出现警告: Parameters: Invalid chunk ignored.信息 if(parameter.indexOf("&") == 0){ parameter = parameter.substring(1,parameter.length); } return parameter; } </script> <#-- ajax提交示例 --> <script type="text/javascript" language="javascript"> //ajax提交 function ajaxSubmit(){ //直接将组装好的参数提交即可 var parameter = getParameter(); } </script>

提交 会员退出 - 默认方式
请求路径 | logout.htm
请求方式 | POST
请求参数 | 令牌 | 变量：token 类型：String
提交成功返回 | 跳转到login.htm页
提交失败返回 | 跳转到index.htm页

## 示例

<a href="" onClick="javascript:document.getElementById('logout').submit();return false;">退出</a> <form id="logout" action="logout.htm?token=${token}" method="post" ></form>