Skip to content
This repository was archived by the owner on Oct 24, 2025. It is now read-only.

Commit d55522c

Browse files
committed
Java API for session and csrf directives
1 parent d572b75 commit d55522c

File tree

3 files changed

+130
-2
lines changed

3 files changed

+130
-2
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.softwaremill.session.javadsl;
2+
3+
import akka.http.javadsl.server.AllDirectives;
4+
import akka.http.javadsl.server.Route;
5+
import com.softwaremill.session.CsrfCheckMode;
6+
import com.softwaremill.session.CsrfDirectives$;
7+
import com.softwaremill.session.SessionContinuity;
8+
import com.softwaremill.session.SessionDirectives$;
9+
import com.softwaremill.session.SessionManager;
10+
import com.softwaremill.session.SetSessionTransport;
11+
import scala.Option;
12+
13+
import java.util.function.Function;
14+
import java.util.function.Supplier;
15+
16+
public class HttpSessionAwareDirectives<T> extends AllDirectives {
17+
18+
private final SessionManager<T> sessionManager;
19+
20+
public HttpSessionAwareDirectives(SessionManager<T> sessionManager) {
21+
this.sessionManager = sessionManager;
22+
}
23+
24+
25+
public Route setSession(SessionContinuity sc, SetSessionTransport st, T session, Supplier<Route> continuity) {
26+
return SessionDirectives$.MODULE$.setSession(sc, st, session, continuity);
27+
}
28+
29+
public Route optionalSession(SessionContinuity sc, SetSessionTransport st, Function<Option<T>, Route> continuity) {
30+
return SessionDirectives$.MODULE$.optionalSession(sc, st, continuity);
31+
}
32+
33+
public Route requiredSession(SessionContinuity<T> sc, SetSessionTransport st, Function<T, Route> continuity) {
34+
return SessionDirectives$.MODULE$.requiredSession(sc, st, continuity);
35+
}
36+
37+
public Route touchRequiredSession(SessionContinuity<T> sc, SetSessionTransport st, Function<T, Route> continuity) {
38+
return SessionDirectives$.MODULE$.touchRequiredSession(sc, st, continuity);
39+
}
40+
41+
public Route invalidateSession(SessionContinuity<T> sc, SetSessionTransport st, Supplier<Route> continuity) {
42+
return SessionDirectives$.MODULE$.invalidateSession(sc, st, continuity);
43+
}
44+
45+
public Route setNewCsrfToken(CsrfCheckMode<T> checkHeader, Supplier<Route> continuity) {
46+
return CsrfDirectives$.MODULE$.setNewCsrfToken(checkHeader, continuity);
47+
}
48+
49+
public Route randomTokenCsrfProtection(CsrfCheckMode<T> checkHeader, Supplier<Route> continuity) {
50+
return CsrfDirectives$.MODULE$.randomTokenCsrfProtection(checkHeader, continuity);
51+
}
52+
53+
public SessionManager<T> getSessionManager() {
54+
return sessionManager;
55+
}
56+
}

core/src/main/scala/com/softwaremill/session/CsrfDirectives.scala

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.softwaremill.session
22

3-
import akka.http.scaladsl.server.{Directive1, Directive0}
3+
import java.util.function.Supplier
4+
5+
import akka.http.javadsl.server.Route
6+
import akka.http.javadsl.server.directives.RouteAdapter
47
import akka.http.scaladsl.server.Directives._
8+
import akka.http.scaladsl.server.{Directive0, Directive1}
59
import akka.stream.Materializer
610

711
trait CsrfDirectives {
@@ -36,6 +40,15 @@ trait CsrfDirectives {
3640
}
3741
}
3842

43+
/**
44+
* Java alternative
45+
*/
46+
def randomTokenCsrfProtection[T](checkMode: CsrfCheckMode[T], inner: Supplier[Route]): Route = RouteAdapter {
47+
randomTokenCsrfProtection(checkMode) {
48+
inner.get.asInstanceOf[RouteAdapter].delegate
49+
}
50+
}
51+
3952
def submittedCsrfToken[T](checkMode: CsrfCheckMode[T]): Directive1[String] = {
4053
headerValueByName(checkMode.manager.config.csrfSubmittedName).recover { rejections =>
4154
checkMode match {
@@ -52,6 +65,15 @@ trait CsrfDirectives {
5265

5366
def setNewCsrfToken[T](checkMode: CsrfCheckMode[T]): Directive0 =
5467
setCookie(checkMode.csrfManager.createCookie())
68+
69+
/**
70+
* Java alternative
71+
*/
72+
def setNewCsrfToken[T](checkMode: CsrfCheckMode[T], inner: Supplier[Route]): Route = RouteAdapter {
73+
setNewCsrfToken(checkMode) {
74+
inner.get.asInstanceOf[RouteAdapter].delegate
75+
}
76+
}
5577
}
5678

5779
object CsrfDirectives extends CsrfDirectives

core/src/main/scala/com/softwaremill/session/SessionDirectives.scala

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.softwaremill.session
22

3-
import akka.http.scaladsl.server.{Directive1, Directive0}
3+
import java.util.function.Supplier
4+
5+
import akka.http.javadsl.server.Route
6+
import akka.http.javadsl.server.directives.RouteAdapter
47
import akka.http.scaladsl.server.Directives._
8+
import akka.http.scaladsl.server.{Directive0, Directive1}
59

610
import scala.concurrent.ExecutionContext
711

@@ -22,6 +26,15 @@ trait SessionDirectives extends OneOffSessionDirectives with RefreshableSessionD
2226
}
2327
}
2428

29+
/**
30+
* Java alternative
31+
*/
32+
def setSession[T](sc: SessionContinuity[T], st: SetSessionTransport, v: T, inner: Supplier[Route]): Route = RouteAdapter {
33+
setSession(sc, st, v) {
34+
inner.get.asInstanceOf[RouteAdapter].delegate
35+
}
36+
}
37+
2538
/**
2639
* Read a session from the session cookie, wrapped in [[SessionResult]] describing the possible
2740
* success/failure outcomes.
@@ -50,12 +63,30 @@ trait SessionDirectives extends OneOffSessionDirectives with RefreshableSessionD
5063
}
5164
}
5265

66+
/**
67+
* Java alternative
68+
*/
69+
def invalidateSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: Supplier[Route]): Route = RouteAdapter {
70+
invalidateSession(sc, st) {
71+
inner.get.asInstanceOf[RouteAdapter].delegate
72+
}
73+
}
74+
5375
/**
5476
* Read an optional session from the session cookie.
5577
*/
5678
def optionalSession[T](sc: SessionContinuity[T], st: GetSessionTransport): Directive1[Option[T]] =
5779
session(sc, st).map(_.toOption)
5880

81+
/**
82+
* Java alternative
83+
*/
84+
def optionalSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[Option[T], Route]): Route = RouteAdapter {
85+
optionalSession(sc, st) { session =>
86+
inner.apply(session).asInstanceOf[RouteAdapter].delegate
87+
}
88+
}
89+
5990
/**
6091
* Read a required session from the session cookie.
6192
*/
@@ -65,6 +96,15 @@ trait SessionDirectives extends OneOffSessionDirectives with RefreshableSessionD
6596
case Some(data) => provide(data)
6697
}
6798

99+
/**
100+
* Java alternative
101+
*/
102+
def requiredSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[T, Route]): Route = RouteAdapter {
103+
requiredSession(sc, st) { session =>
104+
inner.apply(session).asInstanceOf[RouteAdapter].delegate
105+
}
106+
}
107+
68108
/**
69109
* Sets the session cookie again with the same data. Useful when using the [[SessionConfig.sessionMaxAgeSeconds]]
70110
* option, as it sets the expiry date anew.
@@ -80,6 +120,16 @@ trait SessionDirectives extends OneOffSessionDirectives with RefreshableSessionD
80120
def touchRequiredSession[T](sc: SessionContinuity[T], st: GetSessionTransport): Directive1[T] = {
81121
requiredSession(sc, st).flatMap { d => setOneOffSessionSameTransport(sc, st, d) & provide(d) }
82122
}
123+
124+
/**
125+
* Java alternative
126+
*/
127+
def touchRequiredSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[T, Route]): Route = RouteAdapter {
128+
touchRequiredSession(sc, st) { session =>
129+
inner.apply(session).asInstanceOf[RouteAdapter].delegate
130+
}
131+
}
132+
83133
}
84134

85135
object SessionDirectives extends SessionDirectives

0 commit comments

Comments
 (0)