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

https://github.com/softwaremill/akka-http-session · Java · 113 lines · 88 code · 18 blank · 7 comment · 0 complexity · cb07a0ec3dd38c9179252d14167c4d27 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.stream.ActorMaterializer;
  12. import akka.stream.javadsl.Flow;
  13. import com.softwaremill.session.BasicSessionEncoder;
  14. import com.softwaremill.session.CheckHeader;
  15. import com.softwaremill.session.RefreshTokenStorage;
  16. import com.softwaremill.session.Refreshable;
  17. import com.softwaremill.session.SessionConfig;
  18. import com.softwaremill.session.SessionEncoder;
  19. import com.softwaremill.session.SessionManager;
  20. import com.softwaremill.session.SetSessionTransport;
  21. import com.softwaremill.session.javadsl.HttpSessionAwareDirectives;
  22. import com.softwaremill.session.javadsl.InMemoryRefreshTokenStorage;
  23. import org.slf4j.Logger;
  24. import org.slf4j.LoggerFactory;
  25. import java.io.IOException;
  26. import java.util.concurrent.CompletionStage;
  27. import static com.softwaremill.session.javadsl.SessionTransports.CookieST;
  28. public class SessionInvalidationJava extends HttpSessionAwareDirectives<MyJavaSession> {
  29. private static final Logger LOGGER = LoggerFactory.getLogger(SessionInvalidationJava.class);
  30. private static final String SECRET = "c05ll3lesrinf39t7mc5h6un6r0c69lgfno69dsak3vabeqamouq4328cuaekros401ajdpkh60rrtpd8ro24rbuqmgtnd1ebag6ljnb65i8a55d482ok7o0nch0bfbe";
  31. private static final SessionEncoder<MyJavaSession> BASIC_ENCODER = new BasicSessionEncoder<>(MyJavaSession.getSerializer());
  32. // in-memory refresh token storage
  33. private static final RefreshTokenStorage<MyJavaSession> REFRESH_TOKEN_STORAGE = new InMemoryRefreshTokenStorage<MyJavaSession>() {
  34. @Override
  35. public void log(String msg) {
  36. LOGGER.info(msg);
  37. }
  38. };
  39. private Refreshable<MyJavaSession> refreshable;
  40. private SetSessionTransport sessionTransport;
  41. public SessionInvalidationJava(MessageDispatcher dispatcher) {
  42. super(new SessionManager<>(
  43. SessionConfig.defaultConfig(SECRET),
  44. BASIC_ENCODER
  45. )
  46. );
  47. // use Refreshable for sessions, which needs to be refreshed or OneOff otherwise
  48. // using Refreshable, a refresh token is set in form of a cookie or a custom header
  49. refreshable = new Refreshable<>(getSessionManager(), REFRESH_TOKEN_STORAGE, dispatcher);
  50. // set the session transport - based on Cookies (or Headers)
  51. sessionTransport = CookieST;
  52. }
  53. public static void main(String[] args) throws IOException {
  54. // ** akka-http boiler plate **
  55. ActorSystem system = ActorSystem.create("example");
  56. final ActorMaterializer materializer = ActorMaterializer.create(system);
  57. final Http http = Http.get(system);
  58. // ** akka-http-session setup **
  59. MessageDispatcher dispatcher = system.dispatchers().lookup("akka.actor.default-dispatcher");
  60. final SessionInvalidationJava app = new SessionInvalidationJava(dispatcher);
  61. // ** akka-http boiler plate continued **
  62. final Flow<HttpRequest, HttpResponse, NotUsed> routes = app.createRoutes().flow(system, materializer);
  63. final CompletionStage<ServerBinding> binding = http.bindAndHandle(routes, ConnectHttp.toHost("localhost", 8080), materializer);
  64. System.out.println("Server started, press enter to stop");
  65. System.in.read();
  66. binding
  67. .thenCompose(ServerBinding::unbind)
  68. .thenAccept(unbound -> system.terminate());
  69. }
  70. private Route createRoutes() {
  71. CheckHeader<MyJavaSession> checkHeader = new CheckHeader<>(getSessionManager());
  72. return
  73. route(
  74. randomTokenCsrfProtection(checkHeader, () ->
  75. route(
  76. path("logout", () ->
  77. post(() ->
  78. requiredSession(refreshable, sessionTransport, session ->
  79. invalidateSession(refreshable, sessionTransport, () ->
  80. extractRequestContext(ctx -> {
  81. LOGGER.info("Logging out {}", session.getUsername());
  82. return onSuccess(() -> ctx.completeWith(HttpResponse.create()), routeResult ->
  83. complete("ok")
  84. );
  85. }
  86. )
  87. )
  88. )
  89. )
  90. )
  91. )
  92. )
  93. );
  94. }
  95. }