Микро-фреймворк Spark - сохранять сеансы в базе данных?

Как настроить РСУБД (MySQL) в качестве хранилища сеансов для Spark Framework (микро веб-фреймворк Java, доступный по адресу http://sparkjava.com/)?

Причина, по которой я спрашиваю об этом, заключается в том, что я хочу, чтобы пользовательские сеансы оставались действительными, если необходимо перезапустить причал, на котором работает Spark.


person usario    schedule 20.03.2015    source источник


Ответы (2)


на самом деле есть возможность хранить сеансы в базе данных. Я использую Ebean ORM, но вы можете сделать это с любым другим ORM, а также с чистым SQL.

Предположим, что у нас есть класс User и класс UserSession.

Что вам нужно сделать, так это проверить, есть ли активный сеанс. Если он уже существует и не привязан к пользователю - переходим к аутентификации. Если его нет - проверяем, существует ли JSESSIONID cookie и есть ли запись в таблице UserSession. Если есть такой сеанс, мы извлекаем пользователя, создаем новый сеанс и привязываем к нему пользователя.

Два приведенных ниже списка классов говорят сами за себя. Вызывайте User.getAuthenticatedUser() каждый раз, когда кто-то пытается получить доступ к URI для аутентифицированных пользователей. Позвоните User.addAuthenticatedUser(req, user) при успешной попытке входа в систему.

Класс пользователя:

@Data
@Entity
@Table(name = "users")
public class User {
    private static final String USER_SESSION_ID = "sessionId";

    @Id
    Long id;

    String login;
    String password;
    String email;

    Integer role;

    public static User authUser(User user) {
        return Ebean.find(User.class).where()
                .eq("login", user.login)
                .eq("password", user.password)
                .findUnique();
    }

    public static void addAuthenticatedUser(Request req, User u) {
        Session session = req.session();
        Ebean.save(new UserSession(u, session.id()));
        req.session().attribute(USER_SESSION_ID, u);
    }

    public static User getAuthenticatedUser(Request req, Response res) {
        User user = null;
        Session session = req.session(false);
        if (session == null) {
            UserSession userSession = UserSession.getSession(req.cookies().get("JSESSIONID"));
            if (userSession != null) {
                user = userSession.getUser();
                userSession.delete();
                addAuthenticatedUser(req, user);
            }
        } else {
            user = session.attribute(USER_SESSION_ID);
        }

        // Redirect to login form
        if (user == null) {
            res.redirect("/login");
            halt();
        }
        return user;
    }
}

Класс UserSession:

@Data
@Entity
@Table(name = "sessions")
public class UserSession {

    @ManyToOne(fetch = EAGER)
    @JoinColumn(name = "uid")
    private User user;
    private String session;
    private Timestamp taken;

    public UserSession(User u, String sessionId) {
        user = u;
        session = sessionId;
        taken = new Timestamp(System.currentTimeMillis());
    }

    public static UserSession getSession(String session) {
        return Ebean.find(UserSession.class).where().eq("session", session).findUnique();
    }

    public void delete() {
        SqlUpdate deleteQuery = Ebean.createSqlUpdate("DELETE FROM sessions WHERE uid = :uid AND session = :session");
        deleteQuery.setParameter("uid", user.id);
        deleteQuery.setParameter("session", session);
        deleteQuery.execute();
    }
}
person Клаус Шварц    schedule 25.12.2015

API сеанса Spark представляет собой оболочку вокруг объекта HttpSession сервлета. Нет возможности настроить базу данных для хранения сеанса. Как хранятся сеансы, зависит от контейнера сервлета.

person usario    schedule 22.03.2015