Skip to content

Commit 77a7bbd

Browse files
committed
Finalize session store
1 parent 84422db commit 77a7bbd

File tree

14 files changed

+225
-73
lines changed

14 files changed

+225
-73
lines changed

examples/src/main/java/examples/SessionApp.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package examples;
1717

18-
import io.jooby.Cookie;
1918
import io.jooby.ExecutionMode;
2019
import io.jooby.Jooby;
2120
import io.jooby.Session;
@@ -24,7 +23,7 @@
2423
public class SessionApp extends Jooby {
2524

2625
{
27-
setSessionOptions(new SessionOptions().setCookie(new Cookie("sessionId").setMaxAge(5L)));
26+
setSessionOptions(new SessionOptions());
2827
get("/exists", ctx -> ctx.sessionOrNull() != null);
2928

3029
get("/create", ctx -> {

jooby/src/main/java/io/jooby/Context.java

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import io.jooby.internal.HashValue;
1919
import io.jooby.internal.MissingValue;
20+
import io.jooby.internal.RequestSessionStore;
2021
import io.jooby.internal.SessionImpl;
2122
import io.jooby.internal.SingleValue;
2223
import io.jooby.internal.UrlParser;
@@ -129,36 +130,41 @@ public interface Context {
129130
SessionStore store = sessionOptions.getStore();
130131

131132
Session newSession = store.newSession(sessionOptions.generateId(this));
132-
store.save(newSession);
133133

134134
// write cookie
135135
setResponseCookie(sessionOptions.getCookie().setValue(newSession.getId()));
136136

137137
session = Session.create(this, newSession);
138+
139+
attribute("session", session);
138140
}
139141
return session;
140142
}
141143

142144
default @Nullable Session sessionOrNull() {
143-
Router router = getRouter();
144-
SessionOptions options = router.getSessionOptions();
145-
Cookie cookie = options.getCookie();
146-
String name = cookie.getName();
147-
String id = cookieMap().get(name);
148-
if (id == null) {
149-
return null;
150-
}
151-
SessionOptions sessionOptions = router.getSessionOptions();
152-
SessionStore store = sessionOptions.getStore();
153-
Session session = store.findSession(id);
145+
Session session = (Session) getAttributes().get("session");
154146
if (session == null) {
155-
return null;
156-
}
157-
if (cookie.getMaxAge() > 0) {
158-
// Touch session
159-
setResponseCookie(cookie.setValue(id));
147+
Router router = getRouter();
148+
SessionOptions options = router.getSessionOptions();
149+
Cookie cookie = options.getCookie();
150+
String name = cookie.getName();
151+
String id = cookieMap().get(name);
152+
if (id == null) {
153+
return null;
154+
}
155+
SessionStore store = options.getStore();
156+
session = store.findSession(id);
157+
if (session == null) {
158+
return null;
159+
}
160+
if (cookie.getMaxAge() > 0) {
161+
// Touch session
162+
setResponseCookie(cookie.setValue(id));
163+
}
164+
session = Session.create(this, session);
165+
attribute("session", session);
160166
}
161-
return Session.create(this, session);
167+
return session;
162168
}
163169

164170
default @Nonnull Value cookie(@Nonnull String name) {

jooby/src/main/java/io/jooby/InMemorySessionStore.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

jooby/src/main/java/io/jooby/Session.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,26 @@ public interface Session {
3535

3636
@Nonnull Instant getCreationTime();
3737

38+
@Nonnull Session setCreationTime(@Nonnull Instant creationTime);
39+
3840
@Nonnull Instant getLastAccessedTime();
3941

4042
@Nonnull Duration getMaxInactiveInterval();
4143

4244
@Nonnull Session setLastAccessedTime(@Nonnull Instant lastAccessedTime);
4345

46+
boolean isNew();
47+
48+
@Nonnull Session setNew(boolean isNew);
49+
50+
boolean isModify();
51+
52+
@Nonnull Session setModify(boolean modify);
53+
4454
void destroy();
4555

4656
static Session create(String id) {
47-
return new SessionImpl(id, Instant.now());
57+
return new SessionImpl(id);
4858
}
4959

5060
static Session create(Context context, Session session) {

jooby/src/main/java/io/jooby/SessionOptions.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package io.jooby;
22

3+
import io.jooby.internal.InMemorySessionStore;
4+
import io.jooby.internal.RequestSessionStore;
5+
36
import javax.annotation.Nonnull;
47
import java.security.SecureRandom;
58
import java.util.Base64;
@@ -10,8 +13,6 @@ public class SessionOptions {
1013

1114
private Function<Context, String> idGenerator = SessionOptions::defaultIdGenerator;
1215

13-
private String secret;
14-
1516
private Cookie cookie = new Cookie("jooby.sid")
1617
.setMaxAge(-1)
1718
.setHttpOnly(true)
@@ -28,17 +29,8 @@ public class SessionOptions {
2829
return this;
2930
}
3031

31-
public @Nonnull String getSecret() {
32-
return secret;
33-
}
34-
35-
public @Nonnull SessionOptions setSecret(@Nonnull String secret) {
36-
this.secret = secret;
37-
return this;
38-
}
39-
4032
public SessionStore getStore() {
41-
return store;
33+
return new RequestSessionStore(store);
4234
}
4335

4436
public void setStore(SessionStore store) {

jooby/src/main/java/io/jooby/SessionStore.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.jooby;
22

3-
43
public interface SessionStore {
54

65
Session newSession(String id);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.jooby.internal;
2+
3+
import io.jooby.Session;
4+
import io.jooby.SessionStore;
5+
6+
import java.time.Instant;
7+
import java.util.concurrent.ConcurrentHashMap;
8+
9+
public class InMemorySessionStore implements SessionStore {
10+
private ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<>();
11+
12+
@Override public Session newSession(String id) {
13+
Instant now = Instant.now();
14+
Session session = Session.create(id)
15+
.setCreationTime(now)
16+
.setLastAccessedTime(now)
17+
.setNew(true);
18+
sessions.put(id, session);
19+
return session;
20+
}
21+
22+
@Override public Session findSession(String id) {
23+
Session session = sessions.get(id);
24+
if (session != null) {
25+
session.setLastAccessedTime(Instant.now());
26+
}
27+
return session;
28+
}
29+
30+
@Override public void deleteSession(String id) {
31+
sessions.remove(id);
32+
}
33+
34+
@Override public void save(Session session) {
35+
sessions.put(session.getId(), session);
36+
session
37+
.setNew(false)
38+
.setModify(false)
39+
.setLastAccessedTime(Instant.now());
40+
}
41+
}

jooby/src/main/java/io/jooby/internal/RequestSession.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ public RequestSession(Context context, Session session) {
8080
return session.getCreationTime();
8181
}
8282

83+
@Nonnull @Override public Session setCreationTime(@Nonnull Instant creationTime) {
84+
session.setCreationTime(creationTime);
85+
return this;
86+
}
87+
8388
@Nonnull @Override public Instant getLastAccessedTime() {
8489
return session.getLastAccessedTime();
8590
}
@@ -93,13 +98,37 @@ public RequestSession(Context context, Session session) {
9398
return this;
9499
}
95100

101+
@Override public boolean isModify() {
102+
return session.isModify();
103+
}
104+
105+
@Nonnull @Override public Session setModify(boolean modify) {
106+
session.setModify(modify);
107+
return this;
108+
}
109+
110+
@Override public boolean isNew() {
111+
return session.isNew();
112+
}
113+
114+
@Nonnull @Override public Session setNew(boolean isNew) {
115+
session.setNew(isNew);
116+
return this;
117+
}
118+
119+
public Session getSession() {
120+
return session;
121+
}
122+
96123
public void destroy() {
97124
if (context != null) {
98125
try {
126+
context.getAttributes().remove("session");
99127
SessionOptions options = context.getRouter().getSessionOptions();
100128
context.setResponseCookie(options.getCookie().setMaxAge(0));
101129
options.getStore().deleteSession(session.getId());
102130
} finally {
131+
session.destroy();
103132
context = null;
104133
session = null;
105134
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.jooby.internal;
2+
3+
import io.jooby.Session;
4+
import io.jooby.SessionStore;
5+
6+
public class RequestSessionStore implements SessionStore {
7+
8+
private SessionStore store;
9+
10+
public RequestSessionStore(SessionStore store) {
11+
this.store = store;
12+
}
13+
14+
@Override public Session newSession(String id) {
15+
return store.newSession(id);
16+
}
17+
18+
@Override public Session findSession(String id) {
19+
return store.findSession(id);
20+
}
21+
22+
@Override public void deleteSession(String id) {
23+
store.deleteSession(id);
24+
}
25+
26+
@Override public void save(Session session) {
27+
store.save(((RequestSession) session).getSession());
28+
}
29+
}

0 commit comments

Comments
 (0)