configurable session manager

This commit is contained in:
Athou
2014-08-18 13:09:54 +02:00
parent 0cec8af074
commit ea68dbc56f
3 changed files with 57 additions and 44 deletions

View File

@@ -9,13 +9,8 @@ import io.dropwizard.migrations.MigrationsBundle;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import java.io.File;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import javax.servlet.SessionTrackingMode;
import org.eclipse.jetty.server.session.HashSessionManager;
import org.eclipse.jetty.server.session.SessionHandler;
import com.commafeed.backend.feed.FeedRefreshTaskGiver;
@@ -50,7 +45,6 @@ import com.commafeed.frontend.servlet.AnalyticsServlet;
import com.commafeed.frontend.servlet.CustomCssServlet;
import com.commafeed.frontend.servlet.LogoutServlet;
import com.commafeed.frontend.servlet.NextUnreadServlet;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.wordnik.swagger.config.ConfigFactory;
@@ -102,22 +96,7 @@ public class CommaFeedApplication extends Application<CommaFeedConfiguration> {
Injector injector = Guice.createInjector(new CommaFeedModule(hibernateBundle.getSessionFactory(), config, environment.metrics()));
// Auth/session management
HashSessionManager sessionManager = new HashSessionManager();
sessionManager.setSessionTrackingModes(ImmutableSet.of(SessionTrackingMode.COOKIE));
sessionManager.setHttpOnly(true);
sessionManager.getSessionCookieConfig().setHttpOnly(true);
sessionManager.setStoreDirectory(new File("sessions"));
sessionManager.getSessionCookieConfig().setMaxAge((int) TimeUnit.DAYS.toSeconds(30));
sessionManager.setMaxInactiveInterval((int) TimeUnit.DAYS.toSeconds(30));
sessionManager.setDeleteUnrestorableSessions(true);
sessionManager.setIdleSavePeriod((int) TimeUnit.HOURS.toSeconds(2));
sessionManager.setRefreshCookieAge((int) TimeUnit.DAYS.toSeconds(1));
sessionManager.setSavePeriod((int) TimeUnit.MINUTES.toSeconds(5));
sessionManager.setScavengePeriod((int) TimeUnit.MINUTES.toSeconds(5));
environment.servlets().setSessionHandler(new SessionHandler(sessionManager));
environment.servlets().setSessionHandler(new SessionHandler(config.getSessionManagerFactory().build()));
environment.jersey().register(new SecurityCheckUserServiceProvider(injector.getInstance(UserService.class)));
environment.jersey().register(SecurityCheckProvider.class);
environment.jersey().register(HttpSessionProvider.class);
@@ -138,17 +117,19 @@ public class CommaFeedApplication extends Application<CommaFeedConfiguration> {
environment.servlets().addServlet("customCss", injector.getInstance(CustomCssServlet.class)).addMapping("/custom_css.css");
environment.servlets().addServlet("analytics.js", injector.getInstance(AnalyticsServlet.class)).addMapping("/analytics.js");
// Tasks
// Scheduled tasks
SchedulingService schedulingService = new SchedulingService();
schedulingService.register(injector.getInstance(OldStatusesCleanupTask.class));
schedulingService.register(injector.getInstance(OrphansCleanupTask.class));
environment.lifecycle().manage(schedulingService);
// Managed objects
// database init/changelogs
environment.lifecycle().manage(injector.getInstance(StartupService.class));
// background feed fetching
environment.lifecycle().manage(injector.getInstance(FeedRefreshTaskGiver.class));
environment.lifecycle().manage(injector.getInstance(FeedRefreshWorker.class));
environment.lifecycle().manage(injector.getInstance(FeedRefreshUpdater.class));
environment.lifecycle().manage(schedulingService);
// Swagger
environment.jersey().register(new ApiListingResourceJSON());

View File

@@ -15,6 +15,7 @@ import lombok.Getter;
import org.apache.commons.lang.time.DateUtils;
import org.hibernate.validator.constraints.NotBlank;
import com.commafeed.frontend.SessionManagerFactory;
import com.fasterxml.jackson.annotation.JsonProperty;
@Getter
@@ -34,6 +35,11 @@ public class CommaFeedConfiguration extends Configuration {
@NotNull
@JsonProperty("database")
private DataSourceFactory database = new DataSourceFactory();
@Valid
@NotNull
@JsonProperty("session")
private SessionManagerFactory sessionManagerFactory = new SessionManagerFactory();
@Valid
@NotNull
@@ -50,80 +56,61 @@ public class CommaFeedConfiguration extends Configuration {
@Getter
public static class ApplicationSettings {
@JsonProperty
@NotNull
@NotBlank
private String contextPath;
@JsonProperty
@NotNull
@NotBlank
private String publicUrl;
@JsonProperty
@NotNull
private boolean allowRegistrations;
@JsonProperty
private String googleAnalyticsTrackingCode;
@JsonProperty
@NotNull
@Min(1)
private int backgroundThreads;
@JsonProperty
@NotNull
@Min(1)
private int databaseUpdateThreads;
@JsonProperty
private String smtpHost;
@JsonProperty
private int smtpPort;
@JsonProperty
private boolean smtpTls;
@JsonProperty
private String smtpUserName;
@JsonProperty
private String smtpPassword;
@JsonProperty
@NotNull
private boolean heavyLoad;
@JsonProperty
@NotNull
private boolean pubsubhubbub;
@JsonProperty
@NotNull
private boolean imageProxyEnabled;
@JsonProperty
@NotNull
@Min(0)
private int queryTimeout;
@JsonProperty
@NotNull
@Min(0)
private int keepStatusDays;
@JsonProperty
@NotNull
@Min(0)
private int refreshIntervalMinutes;
@JsonProperty
@NotNull
private CacheType cache;
@JsonProperty
@NotNull
private String announcement;

View File

@@ -0,0 +1,45 @@
package com.commafeed.frontend;
import io.dropwizard.util.Duration;
import java.io.File;
import java.io.IOException;
import javax.servlet.SessionTrackingMode;
import lombok.Getter;
import org.eclipse.jetty.server.SessionManager;
import org.eclipse.jetty.server.session.HashSessionManager;
import com.google.common.collect.ImmutableSet;
@Getter
public class SessionManagerFactory {
private String path = "sessions";
private Duration cookieMaxAge = Duration.days(30);
private Duration cookieRefreshAge = Duration.days(1);
private Duration maxInactiveInterval = Duration.days(30);
private Duration idleSavePeriod = Duration.hours(2);
private Duration savePeriod = Duration.minutes(5);
private Duration scavengePeriod = Duration.minutes(5);
public SessionManager build() throws IOException {
HashSessionManager manager = new HashSessionManager();
manager.setSessionTrackingModes(ImmutableSet.of(SessionTrackingMode.COOKIE));
manager.setHttpOnly(true);
manager.getSessionCookieConfig().setHttpOnly(true);
manager.setDeleteUnrestorableSessions(true);
manager.setStoreDirectory(new File(getPath()));
manager.getSessionCookieConfig().setMaxAge((int) cookieMaxAge.toSeconds());
manager.setRefreshCookieAge((int) cookieRefreshAge.toSeconds());
manager.setMaxInactiveInterval((int) maxInactiveInterval.toSeconds());
manager.setIdleSavePeriod((int) idleSavePeriod.toSeconds());
manager.setSavePeriod((int) savePeriod.toSeconds());
manager.setScavengePeriod((int) scavengePeriod.toSeconds());
return manager;
}
}