From 71ac2bfc459000763dc46bd7194af2d13fc8fa14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Panzer?= Date: Mon, 22 Apr 2019 20:30:06 +0200 Subject: [PATCH] support for Java9+ (#906) * initial java9+ support * restore session management, updated for jetty 9.4 * Session actually implements EntityManager * reusable method for setting the timeout --- .gitignore | 1 + pom.xml | 111 ++++++++++-------- .../com/commafeed/CommaFeedApplication.java | 3 +- .../com/commafeed/CommaFeedConfiguration.java | 14 +-- .../com/commafeed/backend/dao/FeedDAO.java | 6 +- .../backend/dao/FeedEntryStatusDAO.java | 39 +++--- .../backend/dao/FeedSubscriptionDAO.java | 8 +- .../com/commafeed/backend/dao/GenericDAO.java | 16 ++- .../backend/model/FeedEntryContent.java | 6 +- .../commafeed/backend/model/UserSettings.java | 6 +- .../commafeed/backend/opml/OPMLExporter.java | 9 +- .../session/SessionHandlerFactory.java | 42 +++++++ .../session/SessionManagerFactory.java | 45 ------- 13 files changed, 159 insertions(+), 147 deletions(-) create mode 100644 src/main/java/com/commafeed/frontend/session/SessionHandlerFactory.java delete mode 100644 src/main/java/com/commafeed/frontend/session/SessionManagerFactory.java diff --git a/.gitignore b/.gitignore index 00238f85..884ff8da 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ config.yml # build directory target +target-ide # log files log diff --git a/pom.xml b/pom.xml index 322b1814..a26e623a 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 @@ -11,9 +12,9 @@ UTF-8 1.8 - 0.9.1 - 4.0 - 4.0.2 + 1.3.9 + 4.2.2 + 4.2.1 1.5.0 @@ -32,43 +33,11 @@ - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - com.github.eirslett - frontend-maven-plugin - [0.0.22,) - - npm - gulp - bower - - - - - false - - - - - - - - - org.apache.maven.plugins maven-compiler-plugin - 3.1 + 3.8.0 ${java.version} ${java.version} @@ -116,8 +85,10 @@ - - + + com.commafeed.CommaFeedApplication @@ -128,7 +99,7 @@ com.github.kongchen swagger-maven-plugin - 3.1.1 + 3.1.7 @@ -202,7 +173,7 @@ org.apache.maven.plugins maven-jar-plugin - 2.6 + 3.1.1 @@ -214,11 +185,57 @@ + + + only-eclipse + + + m2e.version + + + + target-ide + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + com.github.eirslett + frontend-maven-plugin + [0.0.22,) + + npm + gulp + bower + + + + + false + + + + + + + + + + + + + org.projectlombok lombok - 1.16.4 + 1.18.6 provided @@ -284,6 +301,11 @@ metrics-graphite 3.1.2 + + javax.xml.bind + jaxb-api + 2.3.0 + org.apache.httpcomponents @@ -316,11 +338,6 @@ ${querydsl.version} - - com.google.guava - guava - 18.0 - commons-io commons-io diff --git a/src/main/java/com/commafeed/CommaFeedApplication.java b/src/main/java/com/commafeed/CommaFeedApplication.java index decb0fc1..551b75a4 100644 --- a/src/main/java/com/commafeed/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/CommaFeedApplication.java @@ -13,7 +13,6 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import org.eclipse.jetty.server.session.SessionHandler; import org.hibernate.cfg.AvailableSettings; import com.commafeed.backend.feed.FeedRefreshTaskGiver; @@ -111,7 +110,7 @@ public class CommaFeedApplication extends Application { Injector injector = Guice.createInjector(new CommaFeedModule(hibernateBundle.getSessionFactory(), config, environment.metrics())); // session management - environment.servlets().setSessionHandler(new SessionHandler(config.getSessionManagerFactory().build())); + environment.servlets().setSessionHandler(config.getSessionHandlerFactory().build()); // support for "@SecurityCheck User user" injection environment.jersey().register(new SecurityCheckFactoryProvider.Binder(injector.getInstance(UserService.class))); diff --git a/src/main/java/com/commafeed/CommaFeedConfiguration.java b/src/main/java/com/commafeed/CommaFeedConfiguration.java index a18543c2..2eb75bc7 100644 --- a/src/main/java/com/commafeed/CommaFeedConfiguration.java +++ b/src/main/java/com/commafeed/CommaFeedConfiguration.java @@ -1,8 +1,5 @@ package com.commafeed; -import io.dropwizard.Configuration; -import io.dropwizard.db.DataSourceFactory; - import java.util.Date; import java.util.ResourceBundle; @@ -10,15 +7,17 @@ import javax.validation.Valid; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import lombok.Getter; - import org.apache.commons.lang3.time.DateUtils; import org.hibernate.validator.constraints.NotBlank; import com.commafeed.backend.cache.RedisPoolFactory; -import com.commafeed.frontend.session.SessionManagerFactory; +import com.commafeed.frontend.session.SessionHandlerFactory; import com.fasterxml.jackson.annotation.JsonProperty; +import io.dropwizard.Configuration; +import io.dropwizard.db.DataSourceFactory; +import lombok.Getter; + @Getter public class CommaFeedConfiguration extends Configuration { @@ -45,7 +44,7 @@ public class CommaFeedConfiguration extends Configuration { @Valid @NotNull @JsonProperty("session") - private SessionManagerFactory sessionManagerFactory = new SessionManagerFactory(); + private SessionHandlerFactory SessionHandlerFactory = new SessionHandlerFactory(); @Valid @NotNull @@ -138,7 +137,6 @@ public class CommaFeedConfiguration extends Configuration { @Valid private CacheType cache; - @NotNull @Valid private String announcement; diff --git a/src/main/java/com/commafeed/backend/dao/FeedDAO.java b/src/main/java/com/commafeed/backend/dao/FeedDAO.java index 67f86cb8..a1a2a266 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedDAO.java @@ -17,7 +17,6 @@ import com.commafeed.backend.model.QUser; import com.google.common.collect.Iterables; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.JPQLQuery; -import com.querydsl.jpa.hibernate.HibernateQuery; @Singleton public class FeedDAO extends GenericDAO { @@ -30,7 +29,7 @@ public class FeedDAO extends GenericDAO { } public List findNextUpdatable(int count, Date lastLoginThreshold) { - HibernateQuery query = query().selectFrom(feed); + JPQLQuery query = query().selectFrom(feed); query.where(feed.disabledUntil.isNull().or(feed.disabledUntil.lt(new Date()))); if (lastLoginThreshold != null) { @@ -60,7 +59,6 @@ public class FeedDAO extends GenericDAO { public List findWithoutSubscriptions(int max) { QFeedSubscription sub = QFeedSubscription.feedSubscription; - return query().selectFrom(feed).where(JPAExpressions.selectOne().from(sub).where(sub.feed.eq(feed)).notExists()).limit(max) - .fetch(); + return query().selectFrom(feed).where(JPAExpressions.selectOne().from(sub).where(sub.feed.eq(feed)).notExists()).limit(max).fetch(); } } diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 2973393f..0a010f22 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -33,7 +33,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Ordering; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.Tuple; -import com.querydsl.jpa.hibernate.HibernateQuery; +import com.querydsl.jpa.impl.JPAQuery; @Singleton public class FeedEntryStatusDAO extends GenericDAO { @@ -67,7 +67,7 @@ public class FeedEntryStatusDAO extends GenericDAO { }; private static final Comparator STATUS_COMPARATOR_ASC = Ordering.from(STATUS_COMPARATOR_DESC).reverse(); - + private static final Comparator STATUS_COMPARATOR_ABC = new Comparator() { @Override public int compare(FeedEntryStatus o1, FeedEntryStatus o2) { @@ -77,9 +77,8 @@ public class FeedEntryStatusDAO extends GenericDAO { return builder.toComparison(); } }; - - private static final Comparator STATUS_COMPARATOR_ZYX = Ordering.from(STATUS_COMPARATOR_ABC).reverse(); + private static final Comparator STATUS_COMPARATOR_ZYX = Ordering.from(STATUS_COMPARATOR_ABC).reverse(); public FeedEntryStatus getStatus(User user, FeedSubscription sub, FeedEntry entry) { List statuses = query().selectFrom(status).where(status.entry.eq(entry), status.subscription.eq(sub)).fetch(); @@ -107,26 +106,23 @@ public class FeedEntryStatusDAO extends GenericDAO { } public List findStarred(User user, Date newerThan, int offset, int limit, ReadingOrder order, boolean includeContent) { - HibernateQuery query = query().selectFrom(status).where(status.user.eq(user), status.starred.isTrue()); + JPAQuery query = query().selectFrom(status).where(status.user.eq(user), status.starred.isTrue()); if (newerThan != null) { query.where(status.entryInserted.gt(newerThan)); } if (order == ReadingOrder.asc) { query.orderBy(status.entryUpdated.asc(), status.id.asc()); - } else if (order == ReadingOrder.desc){ + } else if (order == ReadingOrder.desc) { query.orderBy(status.entryUpdated.desc(), status.id.desc()); } else if (order == ReadingOrder.abc) { query.orderBy(status.entry.content.title.asc(), status.id.desc()); - } else { //order == ReadingOrder.xyz + } else { // order == ReadingOrder.xyz query.orderBy(status.entry.content.title.desc(), status.id.desc()); } query.offset(offset).limit(limit); - int timeout = config.getApplicationSettings().getQueryTimeout(); - if (timeout > 0) { - query.setTimeout(timeout / 1000); - } + setTimeout(query, config.getApplicationSettings().getQueryTimeout()); List statuses = query.fetch(); for (FeedEntryStatus status : statuses) { @@ -136,10 +132,10 @@ public class FeedEntryStatusDAO extends GenericDAO { return lazyLoadContent(includeContent, statuses); } - private HibernateQuery buildQuery(User user, FeedSubscription sub, boolean unreadOnly, List keywords, + private JPAQuery buildQuery(User user, FeedSubscription sub, boolean unreadOnly, List keywords, Date newerThan, int offset, int limit, ReadingOrder order, FeedEntryStatus last, String tag) { - HibernateQuery query = query().selectFrom(entry).where(entry.feed.eq(sub.getFeed())); + JPAQuery query = query().selectFrom(entry).where(entry.feed.eq(sub.getFeed())); if (CollectionUtils.isNotEmpty(keywords)) { query.join(entry.content, content); @@ -187,14 +183,14 @@ public class FeedEntryStatusDAO extends GenericDAO { } else if (order == ReadingOrder.abc) { query.join(entry.content, content); query.where(content.title.lt(last.getEntry().getContent().getTitle())); - } else { //order == ReadingOrder.zyx + } else { // order == ReadingOrder.zyx query.join(entry.content, content); query.where(content.title.gt(last.getEntry().getContent().getTitle())); } } else if (order != null && (order == ReadingOrder.abc || order == ReadingOrder.zyx)) { query.join(entry.content, content); } - + if (order != null) { if (order == ReadingOrder.asc) { query.orderBy(entry.updated.asc(), entry.id.asc()); @@ -202,7 +198,7 @@ public class FeedEntryStatusDAO extends GenericDAO { query.orderBy(entry.updated.desc(), entry.id.desc()); } else if (order == ReadingOrder.abc) { query.orderBy(content.title.asc(), entry.id.asc()); - } else { //order == ReadingOrder.zyx + } else { // order == ReadingOrder.zyx query.orderBy(content.title.desc(), entry.id.desc()); } } @@ -212,10 +208,7 @@ public class FeedEntryStatusDAO extends GenericDAO { if (limit > -1) { query.limit(limit); } - int timeout = config.getApplicationSettings().getQueryTimeout(); - if (timeout > 0) { - query.setTimeout(timeout / 1000); - } + setTimeout(query, config.getApplicationSettings().getQueryTimeout()); return query; } @@ -223,7 +216,7 @@ public class FeedEntryStatusDAO extends GenericDAO { List keywords, Date newerThan, int offset, int limit, ReadingOrder order, boolean includeContent, boolean onlyIds, String tag) { int capacity = offset + limit; - + Comparator comparator; if (order == ReadingOrder.desc) { comparator = STATUS_COMPARATOR_DESC; @@ -238,7 +231,7 @@ public class FeedEntryStatusDAO extends GenericDAO { FixedSizeSortedSet set = new FixedSizeSortedSet(capacity, comparator); for (FeedSubscription sub : subs) { FeedEntryStatus last = (order != null && set.isFull()) ? set.last() : null; - HibernateQuery query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag); + JPAQuery query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag); List tuples = query.select(entry.id, entry.updated, status.id, entry.content.title).fetch(); for (Tuple tuple : tuples) { @@ -291,7 +284,7 @@ public class FeedEntryStatusDAO extends GenericDAO { public UnreadCount getUnreadCount(User user, FeedSubscription subscription) { UnreadCount uc = null; - HibernateQuery query = buildQuery(user, subscription, true, null, null, -1, -1, null, null, null); + JPAQuery query = buildQuery(user, subscription, true, null, null, -1, -1, null, null, null); List tuples = query.select(entry.count(), entry.updated.max()).fetch(); for (Tuple tuple : tuples) { Long count = tuple.get(entry.count()); diff --git a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java index bfdc39e0..180a83c7 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java @@ -16,7 +16,7 @@ import com.commafeed.backend.model.Models; import com.commafeed.backend.model.QFeedSubscription; import com.commafeed.backend.model.User; import com.google.common.collect.Iterables; -import com.querydsl.jpa.hibernate.HibernateQuery; +import com.querydsl.jpa.JPQLQuery; @Singleton public class FeedSubscriptionDAO extends GenericDAO { @@ -44,13 +44,13 @@ public class FeedSubscriptionDAO extends GenericDAO { } public List findAll(User user) { - List subs = query().selectFrom(sub).where(sub.user.eq(user)).leftJoin(sub.feed).fetchJoin() - .leftJoin(sub.category).fetchJoin().fetch(); + List subs = query().selectFrom(sub).where(sub.user.eq(user)).leftJoin(sub.feed).fetchJoin().leftJoin(sub.category) + .fetchJoin().fetch(); return initRelations(subs); } public List findByCategory(User user, FeedCategory category) { - HibernateQuery query = query().selectFrom(sub).where(sub.user.eq(user)); + JPQLQuery query = query().selectFrom(sub).where(sub.user.eq(user)); if (category == null) { query.where(sub.category.isNull()); } else { diff --git a/src/main/java/com/commafeed/backend/dao/GenericDAO.java b/src/main/java/com/commafeed/backend/dao/GenericDAO.java index 713938d5..4096dff6 100644 --- a/src/main/java/com/commafeed/backend/dao/GenericDAO.java +++ b/src/main/java/com/commafeed/backend/dao/GenericDAO.java @@ -3,22 +3,24 @@ package com.commafeed.backend.dao; import java.util.Collection; import org.hibernate.SessionFactory; +import org.hibernate.annotations.QueryHints; import com.commafeed.backend.model.AbstractModel; -import com.querydsl.jpa.hibernate.HibernateQueryFactory; +import com.querydsl.jpa.impl.JPAQuery; +import com.querydsl.jpa.impl.JPAQueryFactory; import io.dropwizard.hibernate.AbstractDAO; public abstract class GenericDAO extends AbstractDAO { - private HibernateQueryFactory factory; + private JPAQueryFactory factory; protected GenericDAO(SessionFactory sessionFactory) { super(sessionFactory); - this.factory = new HibernateQueryFactory(() -> currentSession()); + this.factory = new JPAQueryFactory(() -> currentSession()); } - protected HibernateQueryFactory query() { + protected JPAQueryFactory query() { return factory; } @@ -49,4 +51,10 @@ public abstract class GenericDAO extends AbstractDAO return objects.size(); } + protected void setTimeout(JPAQuery query, int timeoutMs) { + if (timeoutMs > 0) { + query.setHint(QueryHints.TIMEOUT_JPA, timeoutMs); + } + } + } diff --git a/src/main/java/com/commafeed/backend/model/FeedEntryContent.java b/src/main/java/com/commafeed/backend/model/FeedEntryContent.java index 7b036d20..34ae0c69 100644 --- a/src/main/java/com/commafeed/backend/model/FeedEntryContent.java +++ b/src/main/java/com/commafeed/backend/model/FeedEntryContent.java @@ -8,11 +8,11 @@ import javax.persistence.Lob; import javax.persistence.OneToMany; import javax.persistence.Table; +import org.hibernate.annotations.Type; + import lombok.Getter; import lombok.Setter; -import org.hibernate.annotations.Type; - @Entity @Table(name = "FEEDENTRYCONTENTS") @SuppressWarnings("serial") @@ -28,7 +28,7 @@ public class FeedEntryContent extends AbstractModel { @Lob @Column(length = Integer.MAX_VALUE) - @Type(type = "org.hibernate.type.StringClobType") + @Type(type = "org.hibernate.type.TextType") private String content; @Column(length = 40) diff --git a/src/main/java/com/commafeed/backend/model/UserSettings.java b/src/main/java/com/commafeed/backend/model/UserSettings.java index 48a8b653..7f9ebd0e 100644 --- a/src/main/java/com/commafeed/backend/model/UserSettings.java +++ b/src/main/java/com/commafeed/backend/model/UserSettings.java @@ -10,11 +10,11 @@ import javax.persistence.Lob; import javax.persistence.OneToOne; import javax.persistence.Table; +import org.hibernate.annotations.Type; + import lombok.Getter; import lombok.Setter; -import org.hibernate.annotations.Type; - @Entity @Table(name = "USERSETTINGS") @SuppressWarnings("serial") @@ -61,7 +61,7 @@ public class UserSettings extends AbstractModel { @Lob @Column(length = Integer.MAX_VALUE) - @Type(type = "org.hibernate.type.StringClobType") + @Type(type = "org.hibernate.type.TextType") private String customCss; @Column(name = "scroll_speed") diff --git a/src/main/java/com/commafeed/backend/opml/OPMLExporter.java b/src/main/java/com/commafeed/backend/opml/OPMLExporter.java index 8dc733e5..112746da 100644 --- a/src/main/java/com/commafeed/backend/opml/OPMLExporter.java +++ b/src/main/java/com/commafeed/backend/opml/OPMLExporter.java @@ -8,18 +8,19 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; -import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.ObjectUtils; import com.commafeed.backend.dao.FeedCategoryDAO; import com.commafeed.backend.dao.FeedSubscriptionDAO; import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.User; -import com.google.common.base.MoreObjects; import com.rometools.opml.feed.opml.Attribute; import com.rometools.opml.feed.opml.Opml; import com.rometools.opml.feed.opml.Outline; +import lombok.RequiredArgsConstructor; + @RequiredArgsConstructor(onConstructor = @__({ @Inject })) @Singleton public class OPMLExporter { @@ -35,11 +36,11 @@ public class OPMLExporter { List categories = feedCategoryDAO.findAll(user); Collections.sort(categories, - (e1, e2) -> MoreObjects.firstNonNull(e1.getPosition(), 0) - MoreObjects.firstNonNull(e2.getPosition(), 0)); + (e1, e2) -> ObjectUtils.firstNonNull(e1.getPosition(), 0) - ObjectUtils.firstNonNull(e2.getPosition(), 0)); List subscriptions = feedSubscriptionDAO.findAll(user); Collections.sort(subscriptions, - (e1, e2) -> MoreObjects.firstNonNull(e1.getPosition(), 0) - MoreObjects.firstNonNull(e2.getPosition(), 0)); + (e1, e2) -> ObjectUtils.firstNonNull(e1.getPosition(), 0) - ObjectUtils.firstNonNull(e2.getPosition(), 0)); // export root categories for (FeedCategory cat : categories.stream().filter(c -> c.getParent() == null).collect(Collectors.toList())) { diff --git a/src/main/java/com/commafeed/frontend/session/SessionHandlerFactory.java b/src/main/java/com/commafeed/frontend/session/SessionHandlerFactory.java new file mode 100644 index 00000000..722aad37 --- /dev/null +++ b/src/main/java/com/commafeed/frontend/session/SessionHandlerFactory.java @@ -0,0 +1,42 @@ +package com.commafeed.frontend.session; + +import java.io.File; + +import javax.servlet.SessionTrackingMode; + +import org.eclipse.jetty.server.session.DefaultSessionCache; +import org.eclipse.jetty.server.session.FileSessionDataStore; +import org.eclipse.jetty.server.session.SessionCache; +import org.eclipse.jetty.server.session.SessionHandler; + +import com.google.common.collect.ImmutableSet; + +import io.dropwizard.util.Duration; + +public class SessionHandlerFactory { + + private String path = "sessions"; + private Duration cookieRefreshAge = Duration.days(1); + private Duration maxInactiveInterval = Duration.days(30); + private Duration savePeriod = Duration.minutes(5); + + public SessionHandler build() { + SessionHandler sessionHandler = new SessionHandler(); + SessionCache sessionCache = new DefaultSessionCache(sessionHandler); + sessionHandler.setSessionCache(sessionCache); + FileSessionDataStore dataStore = new FileSessionDataStore(); + sessionCache.setSessionDataStore(dataStore); + + sessionHandler.setHttpOnly(true); + sessionHandler.setSessionTrackingModes(ImmutableSet.of(SessionTrackingMode.COOKIE)); + sessionHandler.setMaxInactiveInterval((int) maxInactiveInterval.toSeconds()); + sessionHandler.setRefreshCookieAge((int) cookieRefreshAge.toSeconds()); + + dataStore.setDeleteUnrestorableFiles(true); + dataStore.setStoreDir(new File(path)); + dataStore.setSavePeriodSec((int) savePeriod.toSeconds()); + + return sessionHandler; + } + +} diff --git a/src/main/java/com/commafeed/frontend/session/SessionManagerFactory.java b/src/main/java/com/commafeed/frontend/session/SessionManagerFactory.java deleted file mode 100644 index 4d52b150..00000000 --- a/src/main/java/com/commafeed/frontend/session/SessionManagerFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.commafeed.frontend.session; - -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; - } - -}