問題1,沒有保存密碼,驗(yàn)證密碼的時(shí)候又重新生成了新密碼,所以永遠(yuǎn)都是密碼錯(cuò)誤
問題2,$data='{password:"' . $password. '"}';
和 echo json_encode($data);
重復(fù),json_encode
就是生成json的
問題3,ajax使用dataType: "json"
時(shí),jquery會(huì)自動(dòng)解析json字符串,不需要再一次data = eval("("+msg+")");
問題4,獲取密碼的點(diǎn)擊事件中,還沒有輸入密碼呢,干嘛還要提交密碼 data: {password: password}, //提交到password.php的數(shù)據(jù)
<?php
session_start();
function getRandPass()
{
$chars = ("0123456789abcdefghijklmnopqrstuvwxyz");
$min = 6;//最小字?jǐn)?shù)
$max = 9;//最大字?jǐn)?shù)
$len = mt_rand($min,$max);//隨機(jī)長度
$password = '';
$a_len = strlen($chars);
for($i = 0;$i < $len;$i++)
{
$password .= $chars[mt_rand(0,$a_len - 1)];//隨機(jī)取出一個(gè)字符
}
return $password;
}
if(isset($_POST['password']))
{
if($_SESSION['password'] == $_POST['password'])//驗(yàn)證密碼
{
$data['code'] = 1;
}
else
{
$data['code'] = 0;
}
}
else
{
$password = getRandPass();
$_SESSION['password'] = $password;//保存密碼,以便下次驗(yàn)證密碼
$data['password'] = $password;
}
echo json_encode($data);//輸出json數(shù)據(jù)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<input type="text" id="password">
<button id="sub">
獲取密碼
</button>
<button id="gopass">
驗(yàn)證密碼
</button>
<input type="text" id="text">
<span id="texts">
</span><!-- 用以顯示返回來的數(shù)據(jù),只刷新這部分地方 -->
<script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js">
</script>
<script>
$('#gopass').click(function()
{
var password = $('#password').val();
if(password == '')
{
$('#texts').html('密碼不能為空!');
return false;
}
$.ajax(
{
url: 'password.php',
type: 'POST',
dataType: 'json',
data:
{
password: password
},
beforeSend: function()
{
$('#texts').html('驗(yàn)證中!');//用于調(diào)試驗(yàn)證過程
},
success: function(data)
{
if(data.code == 1)
{
//驗(yàn)證密碼
$('#texts').html('驗(yàn)證成功' );
}else
{
$('#texts').html('密碼錯(cuò)誤!');
}
}
});
});
$('#sub').click(function()
{
var password = $('#password').val();
$.ajax(
{
type: "get",
url: "password.php",//提交到password.php的數(shù)據(jù)
dataType: "json", //回調(diào)函數(shù)接收數(shù)據(jù)的數(shù)據(jù)格式
success: function(data)
{
$('#text').empty(); //清空Text里面的所有內(nèi)容
$('#text').val(data.password); //密碼在#text中輸出
$('#texts').html('獲取成功!');
console.log(data); //控制臺(tái)輸出調(diào)試結(jié)果
},
error:function(msg)
{
console.log(msg);//控制臺(tái)輸出錯(cuò)誤調(diào)試結(jié)果
}
});
});
</script>
</body>
</html>
在點(diǎn)擊按鈕后,給有權(quán)限的人分配一個(gè)Token,并將該Token 記錄到緩存中,設(shè)置為 1分鐘過期.
操作:
用戶點(diǎn)擊進(jìn)入按鈕的時(shí)候, 判斷當(dāng)前擁有權(quán)限的人數(shù)是否達(dá)到閥值 (判斷Token的數(shù)量)
達(dá)到閥值,然會(huì)403 Forbidden. 否則生成新的Token 分配給該用戶
大致邏輯應(yīng)該是這樣的.僅供參考.
這個(gè)代碼肯定是跑不起來的哦.不過思路應(yīng)該就這樣了
<?php
// 除了 Auth 可以匿名訪問(就是客戶端請求的時(shí)候,不帶Token的情況)之外. 其他的所有請求都必須攜帶Token上傳
// 這里的Token 可以放到 Header 中
$request = HttpRequest;
$response = HttpResponse();
// 請求資源不是Auth,且沒有攜帶Token的情況,直接返回403,或者跳轉(zhuǎn)頁面到獲取Token的地方(就是點(diǎn)擊進(jìn)入頁面的那個(gè)按鈕的地方)
if ($request->getPath() !== 'auth' && !$request->getHeader('token')) {
return $response->withHeader(403);
}
// 如果攜帶Token,但是Token已經(jīng)失效,那么不能訪問,或者跳轉(zhuǎn)到獲取Token頁面重新獲取Token
if ($token = $request->getHeader('token') && !(new Accessable($token))->isTokenAvaliable()) {
return $response->withHeader(403);
}
// 正常邏輯
/*****************************************************************************************/
class Accessable()
{
protected $token;
public function __construct($token)
{
$this->token = $token;
}
/**
* 老用戶是否還有權(quán)限可以訪問,就是判斷他的Token是否還存在,畢竟1分鐘后,Token就會(huì)自動(dòng)被刪除
*/
public function isTokenAvaliable()
{
$redis = Redis();
if ($redis->exists($token)) {
return true;
}
return false;
}
}
/**
* 授權(quán)操作
*/
class Auth
{
const EXPIRE_TIME = 60;
const AUTH_TOKENS = 'auth_tokens'; // 用來保存所有的Token,方便Redis查詢
public function POST()
{
if (!$this->isNewUserAvaliable()) {
return 403; // 返回403 Forbidden
}
$token = $this->generateToken();
return $token;
}
/**
* 生成可以訪問的票據(jù)Token
*/
protected function generateToken()
{
$redis = new Redis();
$token = sprintf('Token:%s', uuid());
$redis->set($token, 1);
$redis->expire($token, self::EXPIRE_TIME); // 設(shè)置為1分鐘自動(dòng)過期
$redis->sAdd(self::AUTH_TOKENS, $token);
return $token;
}
/**
* 對于新用戶是否可以訪問判斷(因?yàn)樗麤]有攜帶Token上來,那么就是新用戶)
* 判斷方式,是查詢Redis中存在的Token數(shù)量是否達(dá)到閥值
*/
protected function isNewUserAvaliable()
{
$redis = new Redis();
$tokens = $redis->sMembers(self::AUTH_TOKENS);
$counter = 0;
foreach ($tokens as $token) {
if ($redis->exists($token)) {
++$counter;
continue;
}
$redis->sRem($token);
}
if ($counter >= self::MAX_USER_COUNT) {
return false;
}
return true;
}
}
可以這樣測試
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test' , 'root' , '123456');
$stmt = $pdo->prepare("inset into test (name) values (:name)");
$stmt->execute([
':name' => 'test'
]);
sleep(5);
// 獲取剛插入記錄的id
var_dump($pdo->lastInsertId());
另起一個(gè)進(jìn)程插入一條數(shù)據(jù).
沒用過laravel
,看了下thinkphp5 的源碼getLastInsID
使用的是PDO 的 lastInsertId
$this->linkID
PDO 當(dāng)前連接ID
也就是說通過這個(gè)ID獲取的自增ID是屬于當(dāng)前對象的最后一次插入值的ID
并不是簡單的獲取最后一條數(shù)據(jù)的ID。
為了程序的簡單易用性。每個(gè)配置都有默認(rèn)值吧 ?
你要求的是 在 notice
表中存在,檢索的時(shí)候 排除notice表中有的數(shù)據(jù)
你可以這樣做,不需要模型關(guān)聯(lián)
首先,取出 notice
表中的數(shù)據(jù),只需要取出 user_id
字段的數(shù)據(jù)
public function getData(Notice $notic , User $user)
{
$userIds = $notic->all()->pluck('user_id')->toArray();
$users = $user->query()->whereNotIn('id' , $userIds)->get();
dd( $users);
}
pluck
方法為給定鍵獲取所有集合值 , 在通過 查詢語句,使用whereNotIn
的 方式 查詢數(shù)據(jù)
不是通過自增 id 來查詢,前 100 條數(shù)據(jù),
如果是使用 sql 語句查詢 , 則使用 limit 0,100
使用laravel的話,則有一個(gè)take方法, 例如take(100)
hasWhere laravel 中好像沒有這個(gè)方法噢
var ws = new WebSocket("ws://127.0.0.1:8081?token={token}");
b是一個(gè)類,不是接口,不能去實(shí)現(xiàn)
可以先存為草稿,訪問時(shí)帶上 preview=1之類的參數(shù),訪問草稿數(shù)據(jù)來預(yù)覽,但是線上草稿數(shù)據(jù)是不會(huì)展示出來的。
當(dāng)然要加上對應(yīng)的唯一id。 如果id怕被猜測,比如用遞增的數(shù)字,可以換為加密串,這樣就不容易被猜測訪問到了。
供參考。
問題已經(jīng)解決!
原因是我apache
服務(wù)器的配置文件http.conf
沒有配置正確
正確配置如下:
1:開啟LoadModule rewrite_module modules/mod_rewrite.so
(去掉這段之前的#
)
2: 將DocumentRoot
對應(yīng)的<Diretory>
標(biāo)簽下的AllowOverride None
改為AllowOverride ALL
(配置文件里面共有三處的AllowOverride
,我是將yii文件夾放在了htdocs
下 )
DocumentRoot "${SRVROOT}/htdocs" <Directory "${SRVROOT}/htdocs"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
錯(cuò)誤提示的比較清楚了, 找不到指定的模塊。
請檢查 extension_dir
是否包含dll模塊。
官方下載 PHP7
windows包是具有這些模塊的,路徑相對于php.ini
同級別的 ext 目錄下。
// 這個(gè)是小年糕公司的筆試題, 我做了這個(gè)題目獲得了面試資格.去公司面試也是筆試,筆試掛掉了。
// 然后到公司是做這3個(gè)題目,https://www.cnblogs.com/mingz...
// 不考慮字母
function s2i(s) {
return s.split('').reduce(function(a, c) {
var code = c.charCodeAt(0);
if (48<=code && code < 58) {
a.push(code-48);
}
return a;
}, []).reduce(function(a, c) {
return 10*a + c;
}, 0);
}
function versionCmp(s1, s2) {
var a = s1.split('.').map(function(s) {
return s2i(s);
});
var b = s2.split('.').map(function(s) {
return s2i(s);
});
var n = a.length < b.length ? a.length : b.length;
for (var i = 0; i < n; i++) {
if (a[i] < b[i]) {
return -1;
} else if (a[i] > b[i]) {
return 1;
}
}
if (a.length < b.length) return -1;
if (a.length > b.length) return 1;
var last1 = s1.charCodeAt(s1.length-1) | 0x20,
last2 = s2.charCodeAt(s2.length-1) | 0x20;
return last1 > last2 ? 1 : last1 < last2 ? -1 : 0;
}
oauth 試試看
貼出你訪問的url
url_model=>0
訪問方式應(yīng)該是:
http://serverName/appName/?m=module&a=action&id=1,
你試試這種方式訪問 看看
對于任意數(shù)據(jù): 不是所有數(shù)據(jù)都一定能合并 ("最終一致")。比如dropbox在有沖突的時(shí)候是直接給你復(fù)制一份,讓你自己解決。
只有文本的時(shí)候相對好些,但能合并也需要不弱的條件。無法合并時(shí)讓人類 (你的用戶) 處理可能比較好。
同意樓上,建議樓主把blade部分也貼出來,瞎猜還是很浪費(fèi)時(shí)間還不一定解決問題
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
其實(shí)你只差理解整個(gè)OAuth:
refreshToken
和accessToken
,兩個(gè)都可以在AuthServiceProvider
設(shè)置過期時(shí)間localstorage
里,一種存在session或sessionstorage
refreshToken
放在cookie里,把accessToken
和過期時(shí)間放在body里返回refreshToken
過期則重新登錄,accessToken
過期則用refreshToken
換取accessToken
php artisan route:list
查看所有auth相關(guān)api的路由下面是一個(gè)綜合方法:
public function proxy($grantType, array $data = [])
{
$data = array_merge($data, [
'client_id' => env('PASSPORT_CLIENT_ID'),
'client_secret' => env('PASSPORT_CLIENT_SECRET'),
'grant_type' => $grantType,
]);
$http = new Client();
$response = $http->post(url('oauth/token'), ['form_params' => $data,]);
$token = json_decode((string)$response->getBody(), true);
return response()->json([
'token' => $token['access_token'],
'auth_id' => md5($token['refresh_token']),
'expires_in' => $token['expires_in'],
])->cookie('refreshToken', $token['refresh_token'], 14400, null, null, false, true);
}
你打印出來的是一個(gè)閉包的closure對象,因?yàn)槟氵€沒用使用這個(gè)閉包對象,所以你即使寫了但是他還是沒有返回值。稍微改動(dòng)下代碼這么寫 拿你這段代碼為例
只需要再a中使用一下閉包函數(shù)就會(huì)得到你想要的結(jié)果,var_dump($param());就是這樣寫就ok了。因?yàn)?.本身閉包函數(shù)就是通過closure對象來實(shí)現(xiàn)的2。閉包函數(shù)他還是一個(gè)函數(shù),需要使用才能得到他的返回值。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。