LogoRevali

Cookies

Read request cookies with @Cookie and set response cookies with SetCookies

Read a cookie the client sent with @Cookie(name). Set cookies on the response through SetCookies, which becomes one Set-Cookie header per cookie.

Minimal example#

routes/controllers/session_controller.dart
import 'package:revali_router/revali_router.dart';

@Controller('session')
class SessionController {
  const SessionController();

  @Post()
  void login(SetCookies cookies) {
    cookies['session'] = 'abc123';
    cookies.maxAge = const Duration(days: 7);
  }

  @Get()
  String current(@Cookie('session') String? session) => session ?? 'none';
}
curl -i -X POST http://localhost:8080/api/session
# set-cookie: session=abc123; Secure; HttpOnly; SameSite=Lax; Path=/; Max-Age=604800

curl http://localhost:8080/api/session -H 'Cookie: session=abc123'
# {"data":"abc123"}

Reading cookies#

WhereHow
Endpoint, one cookie @Cookie('name') String? value (a missing cookie on a non-nullable parameter gives 400 )
Endpoint, all cookiesRequestCookies cookies parameter
Lifecycle componentrequest.headers.cookies['name']

Setting cookies#

SetCookies is available as an implied parameter in endpoints and lifecycle components, and as response.headers.setCookies.

class EnsureVisitorId implements LifecycleComponent {
  const EnsureVisitorId();

  MiddlewareResult assign(Request request, SetCookies cookies) {
    if (request.headers.cookies['visitor'] == null) {
      cookies['visitor'] = generateVisitorId();
    }

    return const MiddlewareResult.next();
  }
}
MemberEffectDefault
cookies['name'] = valueAdds or replaces a cookie.
remove('name')Drops a cookie from this response.
maxAge Max-Age as a Duration. unset (session cookie)
expiresExpires as a DateTime.unset
domainDomainunset
pathPath/
secureSecure flagtrue
httpOnlyHttpOnly flagtrue
sameSite SameSiteCookie.strict, .lax or .none lax

To delete a cookie in the browser, set it again with Max-Age 0:

cookies['session'] = '';
cookies.maxAge = Duration.zero;

Related: Response headers · Binding