mintellity/laravel-tabbed-session

Separate session for each browser tab.

0.4.0 2024-01-09 16:37 UTC

This package is auto-updated.

Last update: 2024-05-09 17:36:41 UTC


README

With this package, you can have a separate session for each browser tab. This is e.g. useful if you want to have a different tenant for each tab. This package utilizes a query parameter to identify the tab and stores all data in an array within the default session.

Installation

You can install the package via composer:

composer require mintellity/laravel-tabbed-session

Add the middleware to your app/Http/Kernel.php file. Beware that the middleware must be added after the StartSession middleware and must be added before all other middlewares that should use the tabbed session:

protected $middleware = [
    // ...
    \Mintellity\LaravelTabbedSession\Http\Middleware\TabbedSessionMiddleware::class,
];

Add the JS script to e.g. your resources/js/app.js file:

require('../../vendor/mintellity/laravel-tabbed-session/resources/js/tabbedSession');

The default query parameter name is tabId. You can change this by editing your environment file and adding the following line. Take care that the parameter name is unique and does not conflict with other parameters in your routes. If you change the parameter name, you also have to change the name in the JS script:

BROWSER_TAB_URL_PARAMETER_NAME=browserTabId
require('../../vendor/mintellity/laravel-tabbed-session/resources/js/tabbedSession')('browserTabId');

Usage

To access the tabbed session, you can use the browsserTab()->session() helper function:

browserTab()->session()->put('foo', 'bar');
browserTab()->session()->get('foo'); // bar

Disable for some paths

You can disable the TabbedSession entirely for specific paths. Include the paths in $exclude in the config. Regex-patterns matching against the path are also possible:

return [
    'exclude' => [
        'admin/*', // Will disable middleware for all paths matching this pattern, e.g. admin/user/create
    ]
]

Beware: The helper function browserTab() will throw an exception if used on a disabled path.

Frontend "Session"

This is an optional feature that lets you store some data per tab in a cookie. The cookie can also be accessed from the frontend.

⚠️ This is not a secure way to store data! The data is not encrypted and can be manipulated by the user. Use this feature only for data that is not security relevant.

Installation

Add the cookie to the list of unencrypted cookies in App\Http\Middleware\EncryptCookies:

$this->disableFor(config('tabbed-session.frontend-cookie-name'));

The cookie name can be changed by editing your environment file and adding the following line:

FRONTEND_TAB_SESSION_COOKIE_NAME=frontend_tab_session

And add the script to your resources/js/app.js file:

require('../../vendor/mintellity/laravel-tabbed-session/resources/js/frontendTabSession')('frontend_tab_session');

Usage

In the frontend with JS:

window.tabSessionStorage.set('foo', 'bar');
window.tabSessionStorage.get('foo'); // bar

From the backend:

browserTab()->frontendSession()->set('foo', 'bar');
browserTab()->frontendSession()->get('foo'); // bar

See an example for implementing storing and setting the active Bootstrap nav/tab

Changelog

Please see CHANGELOG for more information on what has changed recently.

Credits

License

The MIT License (MIT). Please see License File for more information.