页面刷新后 Laravel 会话丢失
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23958038/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Laravel Session Missing after Page Refresh
提问by randytan
I have a little problem about sessions in Laravel.
我对 Laravel 中的会话有一个小问题。
I have made the authentication function which like this:
我已经做了这样的身份验证功能:
public function postSignin(){
$attempt = Auth::attempt(array('username' => Input::get('username'), 'password' => Input::get('password')));
if ($attempt) {
return Redirect::to('index')->with('message', 'Anda telah login!' . $attempt)
->with('usersess', Input::get('username'));
} else if(!$attempt){
return Redirect::to('auth')
->with('message', 'Kombinasi email/password salah ' . $attempt)
->withInput();
}
}
let see i have send the 'usersess'var into session which i consume in my header blade like this: {{ Session::get('usersess') }}
and place it in the header.
让我看看我已经将“usersess”变量发送到会话中,我在我的标题刀片中使用{{ Session::get('usersess') }}
它,如下所示:并将其放在标题中。
BUT the problem is when i refresh the PAGE, the session is missing! Is there any clue, how to get it back without the session is missing?
但问题是当我刷新 PAGE 时,会话丢失了!有什么线索,如何在没有会话丢失的情况下取回它?
i have learn about php and using <?php session_start() ?>
is the basic function, but how it works in laravel?
我已经了解了 php 并且 using<?php session_start() ?>
是基本功能,但是它在 Laravel 中是如何工作的?
thank you!
谢谢你!
UPDATEmy session.php configuration
更新我的 session.php 配置
return array(
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
| "memcached", "redis", "array"
|
*/
'driver' => 'file',
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
'lifetime' => 180,
'expire_on_close' => false,
/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When using the native session driver, we need a location where session
| files may be stored. A default has been set for you but a different
| location may be specified. This is only needed for file sessions.
|
*/
'files' => storage_path().'/sessions',
/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/
'connection' => null,
/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table we
| should use to manage the sessions. Of course, a sensible default is
| provided for you; however, you are free to change this as needed.
|
*/
'table' => 'sessions',
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/
'lottery' => array(2, 100),
/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/
'cookie' => 'invsess',
/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application but you are free to change this when necessary.
|
*/
'path' => '/',
/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| Here you may change the domain of the cookie used to identify a session
| in your application. This will determine which domains the cookie is
| available to in your application. A sensible default has been set.
|
*/
'domain' => null,
/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you if it can not be done securely.
|
*/
'secure' => false,
);
回答by RMcLeod
->with
flashes data to the session for that page load only. If you want to keep an item in the session use Session::put('key', 'value')
. So for your example:
->with
仅为该页面加载将数据闪烁到会话中。如果您想在会话中保留一个项目,请使用Session::put('key', 'value')
. 所以对于你的例子:
if($attempt) {
Session::put('usersess', Input::get('username'));
return Redirect::to('index')->with('message', 'Anda telah login!' . $attempt);
}
EDIT
编辑
You can use Session::get('key')
to retrieve a value or Session::pull('key')
which returns the value and forgets the value. You can also use Session::forget('key')
to remove an item. Session::flush()
clears everything from the session.
您可以使用Session::get('key')
检索值或Session::pull('key')
返回值并忘记该值。您还可以使用Session::forget('key')
删除项目。Session::flush()
清除会话中的所有内容。
The session docs can be found here
会话文档可以在这里找到
回答by murad
This problem is happening for me when I am using
当我使用时,这个问题发生在我身上
use Illuminate\Support\Facades\Session;
Instead of it you can use
你可以使用它代替它
use Symfony\Component\HttpFoundation\Session\Session;
And:
和:
//to set a session variable use
$session = new Session();
$session->set('variableName', $requestData['key']);
//to get that session variable
$session = new Session();
$session->get('variableName');
回答by Joe Majewski
I wanted to contribute to this since I ran into the same issue, but my solution was different than the one up-voted.
我想为此做出贡献,因为我遇到了同样的问题,但我的解决方案与投票的解决方案不同。
After putting items into my session, they were seemingly disappearing on the next page load.
将项目放入我的会话后,它们似乎在下一页加载时消失了。
The way I was doing this was via an AJAX call. Whenever I do an AJAX call, I always use an exit
at the end, to prevent any unnecessary page processing. What I found is that this exit
was preventing Laravel from proceeding further and actually writing that data into the permanent session.
我这样做的方式是通过 AJAX 调用。每当我执行 AJAX 调用时,我总是exit
在末尾使用 ,以防止任何不必要的页面处理。我发现这exit
会阻止 Laravel 进一步进行并将该数据实际写入永久会话。
Star Fox voice: Good luck!
星狐之声:祝你好运!
回答by zeros-and-ones
This is obviously not your issue but for anyone else who found this question and the accepted answer does not solve your issue this might:
这显然不是您的问题,但对于发现此问题且接受的答案无法解决您的问题的其他任何人,这可能:
If you are storing your laravel session in the database there is a limit on how large that session value can be. The Laravel session migration has a field called "payload" that is a text type. If you exceed the limit on that field the entire session gets killed off. This was happening to me as I was dynamically adding json model data to my session.
如果您将 Laravel 会话存储在数据库中,则该会话值的大小是有限制的。Laravel 会话迁移有一个名为“payload”的字段,它是一种文本类型。如果您超过该字段的限制,则整个会话都会被终止。这发生在我身上,因为我正在将 json 模型数据动态添加到我的会话中。
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->unique();
$table->text('payload');
$table->integer('last_activity');
});
回答by tsveti_iko
Check if you don't remove the cookies in your .js. That was causing the issue for me:
检查您是否没有删除 .js 中的 cookie。这给我带来了问题:
var now = new Date();
now.setTime(now.getTime()+(-1*24*60*60*1000));
var expires = "=;"+" path=/; expires="+now.toUTCString();
document.cookie = "lastpage"+expires;