@Override public void save(final Session session) { Map<String, String> attrs = new HashMap<>(session.attributes()); attrs.put("_createdAt", Long.toString(session.createdAt())); attrs.put("_accessedAt", Long.toString(session.accessedAt())); attrs.put("_savedAt", Long.toString(session.savedAt())); sessions.set(session.id(), attrs, timeout, TimeUnit.SECONDS); }
@Override public Object get(WebContext context, String key) { return req.ifSession() .map(session -> { String value = session.get(key).toOptional().orElse(null); return strToObject(value); }).orElse(null); }
/** * Set a session local using a the given name. If a local already exists, it will be replaced * with the new value. Keep in mind that null values are NOT allowed. * * @param name Attribute's name. * @param value Attribute's value. * @return This session. */ @Nonnull default Session set(final String name, final long value) { return set(name, Long.toString(value)); }
@Override public Object resolve(final Object context, final String name) { Object value = null; if (context instanceof Session) { Session session = (Session) context; value = session.isDestroyed() ? null : session.get(name).toOptional().orElse(null); } return value == null ? UNRESOLVED : value; }
@Override public void create(final Session session) { sessions.putIfAbsent(session.id(), session); }
@SuppressWarnings({"unchecked", "rawtypes" }) @Override public Set<Entry<String, Object>> propertySet(final Object context) { if (context instanceof Session) { Map session = ((Session) context).attributes(); return session.entrySet(); } return Collections.emptySet(); }
@Override public TemplateModel wrap(final Object obj) throws TemplateModelException { if (obj instanceof Config) { ConfigObject config = ((Config) obj).root(); return DefaultMapAdapter.adapt(config.unwrapped(), (ObjectWrapperWithAPISupport) wrapper); } if (obj instanceof Request) { Map<String, Object> req = ((Request) obj).attributes(); return DefaultMapAdapter.adapt(req, (ObjectWrapperWithAPISupport) wrapper); } if (obj instanceof Session) { Session session = (Session) obj; if (session.isDestroyed()) { return wrapper.wrap(null); } Map<String, String> hash = session.attributes(); return DefaultMapAdapter.adapt(hash, (ObjectWrapperWithAPISupport) wrapper); } return wrapper.wrap(obj); }
@Override public void handle(final Request req, final Response rsp, final Route.Chain chain) throws Throwable { /** * Get or generate a token */ Session session = req.session(); String token = session.get(name).toOptional().orElseGet(() -> { String newToken = generator.apply(req); session.set(name, newToken); return newToken; }); req.set(name, token); if (requireToken.test(req)) { String candidate = req.header(name).toOptional() .orElseGet(() -> req.param(name).toOptional().orElse(null)); if (!token.equals(candidate)) { throw new Err(Status.FORBIDDEN, "Invalid Csrf token: " + candidate); } } chain.next(req, rsp); } }
@Override public void save(final Session session) { cache.put(session.id(), session); }
private Route.After saveCookie() { return (req, rsp, result) -> { req.ifSession().ifPresent(session -> { Optional<String> value = req.cookie(cookie.name().get()).toOptional(); Map<String, String> initial = value .map(this::attributes) .orElse(Collections.emptyMap()); Map<String, String> attributes = session.attributes(); // is dirty? boolean dirty = !initial.equals(attributes); log.debug("session dirty: {}", dirty); if (dirty) { log.debug("saving session cookie"); String encoded = Cookie.URL_ENCODER.apply(attributes); String signed = Cookie.Signature.sign(encoded, secret); rsp.cookie(new Cookie.Definition(cookie).value(signed)); } else if (timeout > 0) { // touch session value.ifPresent(raw -> rsp.cookie(new Cookie.Definition(cookie).value(raw))); } }); return result; }; }
@Override public TemplateModel wrap(final Object obj) throws TemplateModelException { if (obj instanceof Config) { ConfigObject config = ((Config) obj).root(); return DefaultMapAdapter.adapt(config.unwrapped(), (ObjectWrapperWithAPISupport) wrapper); } if (obj instanceof Request) { Map<String, Object> req = ((Request) obj).attributes(); return DefaultMapAdapter.adapt(req, (ObjectWrapperWithAPISupport) wrapper); } if (obj instanceof Session) { Session session = (Session) obj; if (session.isDestroyed()) { return wrapper.wrap(null); } Map<String, String> hash = session.attributes(); return DefaultMapAdapter.adapt(hash, (ObjectWrapperWithAPISupport) wrapper); } return wrapper.wrap(obj); }
@Override public void handle(final Request req, final Response rsp, final Route.Chain chain) throws Throwable { /** * Get or generate a token */ Session session = req.session(); String token = session.get(name).toOptional().orElseGet(() -> { String newToken = generator.apply(req); session.set(name, newToken); return newToken; }); req.set(name, token); if (requireToken.test(req)) { String candidate = req.header(name).toOptional() .orElseGet(() -> req.param(name).toOptional().orElse(null)); if (!token.equals(candidate)) { throw new Err(Status.FORBIDDEN, "Invalid Csrf token: " + candidate); } } chain.next(req, rsp); } }
@Override public Object resolve(final Object context, final String name) { Object value = null; if (context instanceof Session) { Session session = (Session) context; value = session.isDestroyed() ? null : session.get(name).toOptional().orElse(null); } return value == null ? UNRESOLVED : value; }
@Override public void save(final Session session) { Map<String, String> attributes = new HashMap<>(session.attributes()); attributes.put("_accessedAt", Long.toString(session.accessedAt())); attributes.put("_createdAt", Long.toString(session.createdAt())); attributes.put("_savedAt", Long.toString(session.savedAt())); cache.put(new Element(session.id(), attributes)); }
@Override public void save(final Session session) { sessions.put(session.id(), session); }
@SuppressWarnings({"unchecked", "rawtypes" }) @Override public Set<Entry<String, Object>> propertySet(final Object context) { if (context instanceof Session) { Map session = ((Session) context).attributes(); return session.entrySet(); } return Collections.emptySet(); }
/** * Set a session local using a the given name. If a local already exists, it will be replaced * with the new value. Keep in mind that null values are NOT allowed. * * @param name Attribute's name. * @param value Attribute's value. * @return This session. */ @Nonnull default Session set(final String name, final CharSequence value) { return set(name, value.toString()); }