/example/src/main/java/com/softwaremill/example/session/SetSessionJava.java

https://github.com/softwaremill/akka-http-session · Java · 111 lines · 91 code · 19 blank · 1 comment · 0 complexity · a19d27cdd2b188db0bc1402844efcacb MD5 · raw file

  1. package com.softwaremill.example.session;
  2. import akka.NotUsed;
  3. import akka.actor.ActorSystem;
  4. import akka.dispatch.MessageDispatcher;
  5. import akka.http.javadsl.ConnectHttp;
  6. import akka.http.javadsl.Http;
  7. import akka.http.javadsl.ServerBinding;
  8. import akka.http.javadsl.model.HttpRequest;
  9. import akka.http.javadsl.model.HttpResponse;
  10. import akka.http.javadsl.server.Route;
  11. import akka.http.javadsl.unmarshalling.Unmarshaller;
  12. import akka.stream.ActorMaterializer;
  13. import akka.stream.javadsl.Flow;
  14. import com.softwaremill.session.BasicSessionEncoder;
  15. import com.softwaremill.session.CheckHeader;
  16. import com.softwaremill.session.RefreshTokenStorage;
  17. import com.softwaremill.session.Refreshable;
  18. import com.softwaremill.session.SessionConfig;
  19. import com.softwaremill.session.SessionEncoder;
  20. import com.softwaremill.session.SessionManager;
  21. import com.softwaremill.session.SetSessionTransport;
  22. import com.softwaremill.session.javadsl.HttpSessionAwareDirectives;
  23. import com.softwaremill.session.javadsl.InMemoryRefreshTokenStorage;
  24. import org.slf4j.Logger;
  25. import org.slf4j.LoggerFactory;
  26. import java.io.IOException;
  27. import java.util.concurrent.CompletionStage;
  28. import static com.softwaremill.session.javadsl.SessionTransports.CookieST;
  29. public class SetSessionJava extends HttpSessionAwareDirectives<MyJavaSession> {
  30. private static final Logger LOGGER = LoggerFactory.getLogger(SetSessionJava.class);
  31. private static final String SECRET = "c05ll3lesrinf39t7mc5h6un6r0c69lgfno69dsak3vabeqamouq4328cuaekros401ajdpkh60rrtpd8ro24rbuqmgtnd1ebag6ljnb65i8a55d482ok7o0nch0bfbe";
  32. private static final SessionEncoder<MyJavaSession> BASIC_ENCODER = new BasicSessionEncoder<>(MyJavaSession.getSerializer());
  33. // in-memory refresh token storage
  34. private static final RefreshTokenStorage<MyJavaSession> REFRESH_TOKEN_STORAGE = new InMemoryRefreshTokenStorage<MyJavaSession>() {
  35. @Override
  36. public void log(String msg) {
  37. LOGGER.info(msg);
  38. }
  39. };
  40. private Refreshable<MyJavaSession> refreshable;
  41. private SetSessionTransport sessionTransport;
  42. public SetSessionJava(MessageDispatcher dispatcher) {
  43. super(new SessionManager<>(
  44. SessionConfig.defaultConfig(SECRET),
  45. BASIC_ENCODER
  46. )
  47. );
  48. refreshable = new Refreshable<>(getSessionManager(), REFRESH_TOKEN_STORAGE, dispatcher);
  49. sessionTransport = CookieST;
  50. }
  51. public static void main(String[] args) throws IOException {
  52. final ActorSystem system = ActorSystem.create("example");
  53. final ActorMaterializer materializer = ActorMaterializer.create(system);
  54. final Http http = Http.get(system);
  55. final MessageDispatcher dispatcher = system.dispatchers().lookup("akka.actor.default-dispatcher");
  56. final SetSessionJava app = new SetSessionJava(dispatcher);
  57. final Flow<HttpRequest, HttpResponse, NotUsed> routes = app.createRoutes().flow(system, materializer);
  58. final CompletionStage<ServerBinding> binding = http.bindAndHandle(routes, ConnectHttp.toHost("localhost", 8080), materializer);
  59. System.out.println("Server started, press enter to stop");
  60. System.in.read();
  61. binding
  62. .thenCompose(ServerBinding::unbind)
  63. .thenAccept(unbound -> system.terminate());
  64. }
  65. private Route createRoutes() {
  66. CheckHeader<MyJavaSession> checkHeader = new CheckHeader<>(getSessionManager());
  67. return
  68. route(
  69. randomTokenCsrfProtection(checkHeader, () ->
  70. route(
  71. path("login", () ->
  72. post(() ->
  73. entity(Unmarshaller.entityToString(), body -> {
  74. LOGGER.info("Logging in {}", body);
  75. return setSession(refreshable, sessionTransport, new MyJavaSession(body), () ->
  76. setNewCsrfToken(checkHeader, () ->
  77. extractRequestContext(ctx ->
  78. onSuccess(() -> ctx.completeWith(HttpResponse.create()), routeResult ->
  79. complete("ok")
  80. )
  81. )
  82. )
  83. );
  84. }
  85. )
  86. )
  87. )
  88. )
  89. )
  90. );
  91. }
  92. }