如何设置session过期时间

发布网友 发布时间:2022-04-06 06:38

我来回答

3个回答

懂视网 时间:2022-04-06 10:59

Laravel的session的配置文件配置在 app/config/session.php 中,使用时可以看看 session 配置文件中可用的选项设定及注释。

Laravel 默认使用 file 的方式来实现 session的。她并不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相关的session函数,例如session_start(), $_SESSION。Laravel在运行过程中会在app/storage/session/目录写入session的信息,所以这个目录需要有写权限,否者session就无法写入成功。

Laravel除了使用默认的file作为session的实现,还支持cookie, Memcached, Redis数据库的后端驱动作为session的实现。必要的时候还需要自己实现一个session的实现方式,比如在微信公众账号和用户的交互,这中session就无法直接使用,因为每次都是微信服务器来请求,无法通过请求的来源来辨别用户。

laravel的session简要API

Session的API还是比较简单的,大家看看中文文档也大概知道是怎么个意思。但是有那么几个还不太好理解。

//session的永久保存(在不过期范围内)
Session::put('key', 'value');

//等同于PHP的原生session
$_SESSION['key'] = 'value';

//get操作
$value = Session::get('key', 'default');

//去除操作并删除,类似pop概念
$value = Session::pull('key', 'default');

//检测是否存在key
Session::has('users');

//删除key
Session::forget('key');

这个对应只要session不过期,基本上是永久保存,下次http请求也是存在的。不同于下面的flash概念。

laravel的session中flash概念

但是Laravel出了个快闪flash的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。

//保存key,value
Session::flash('key', 'value');

//取值方法还是一样的
Session::get('key');

//刷新快闪数据时间,保持到下次请求
Session::keep(array('username', 'email'));

这个flash的概念和上面的put的概念不太一样。

  • put :这个对应只要session不过期,基本上是永久保存,下次请求也是存在的。
  • flash :保存的值,本次请求可以使用,下次http请求可以使用,再下一次就不存在了。
  • 也就是说下一次的请求用完就被销毁了,不会让session的值变的越来越大,可以保存一些临时的数据。

    这中情况的使用场景比如有:

  • 用户请求了页面,出现错误信息,重定向到一个新的页面,需要展示之前的数据。(虽然可以通过url参数来传递,处理不好可能会有xss漏洞)。
  • 用户访问了一个页面,过滤器发现没权限,保存当前页面url,重定向到登录页面,登录成功,取出值,重定向到原先的页面。(这里可能需要刷新保存的快闪数据)
  • session落地的时间

    我天真的以为使用了Session::put函数就能保存这个变量了。于是我的代码这样写:

    class LoginController {
    
     public function login(){
     Session::put('key','value'); 
     print_r( Session::all() ); //取出来看看是否put成功
     exit; //习惯性的调试都exit,不执行后续代码
     //return Redirect::to(/); 框架在return后还会有后续的代码执行的
     }
    }

    结果下次请求就是找不到本次的Session,而且看app/storage/session目录就是没有文件生成。总感觉不对劲啊。

    后来看到网络上有个方法Session::save(),于是我也用了下,居然发现成功的生成了session的文件。于是我感觉到,Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。

    查看调用相关的代码。laravel编译后,在bootstrap/compiled.php

    class Middleware implements HttpKernelInterface
    {
     ...
     public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
     {
     $this->checkRequestForArraySessions($request);
     if ($this->sessionConfigured()) {
      $session = $this->startSession($request); // 启动session
      $request->setSession($session);
     }
     $response = $this->app->handle($request, $type, $catch); // 调用controller的method
     if ($this->sessionConfigured()) {
      $this->closeSession($session);  //关闭session
      $this->addCookieToResponse($response, $session);
     }
     return $response;
     }
     ...
    
     protected function closeSession(SessionInterface $session)
     {
     $session->save(); // 保存session
     $this->collectGarbage($session);
     }
    }
    小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=>true。可以看到函数的调用关系。

    可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。

    热心网友 时间:2022-04-06 08:07

    常用的有两种方法:
    1. 在主页面中写入下面两句:
    HttpSession session=request.getSession(true);
    session.setMaxInactiveInterval(3600);//3600秒,注意服务器端的3600秒,而不是客户端的
    2. 在项目的web.xml中设置:
    <session-config>
    <session-timeout>60</session-timeout>
    </session-config>
    这里的60就是60分钟。
    还有一种在服务器端设置的方法,因为不同的服务器配置不同,在这就不说了,以上两个就足够用了。

    热心网友 时间:2022-04-06 09:25

    要了解Session首先要知道一个概念:Session的销毁只有两种情况:第一:session调用了 session.invalidate()方法. 第二:前后两次请求超出了session指定的生命周期时间

    方法一:web app server中,如websphere里可以设置超时时间为30分钟。

    方法二:在web.xml中的session-config配置
    session-timeout元素(WEB.XML文件中的元素)用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。如:
    <session-config> <session-timeout>30</session-timeout></session-config> //30分钟

    方法三:setMaxInactiveInterval设置当前会话时间
    setMaxInactiveInterval设置的是当前会话的失效时间,不是整个web的时间,单位为以秒计算。如果设置的值为零或负数,则表示会话将永远不会超时。常用于设置当前会话时间。该优先级要比方法三中的优先级高。

    方法四:session中保存一个bean或者map,里面存储上相应的过期时间,一旦过期,remove掉。
    方法四可以通过一个线程去扫描,如果时间带了,线程自动清除,或者用的时候进行判断,用过后进行remove,如果使用线程自动remove,可以使用spring的线程池。

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com