簡體   English   中英

Spark Micro Framework-將會話保存在數據庫中嗎?

[英]Spark micro framework - save sessions in database?

如何將RDBMS(MySQL)配置為Spark框架(可從http://sparkjava.com/獲得的Java micro Web框架)的會話存儲?

我這樣做的原因是,如果必須重新啟動運行Spark的碼頭,我希望用戶會話保持有效。

實際上,有一個選項可以將會話存儲在數據庫中。 我使用Ebean ORM,但是您可以將其與任何其他ORM以及純SQL一起使用。

假設我們有User類和UserSession類。

您應該做的是檢查是否有活動的會話。 如果已經存在並且沒有用戶綁定-我們將轉到身份驗證。 如果不存在-我們檢查JSESSIONID cookie是否存在,並在UserSession表中有一條記錄。 如果存在這樣的會話,我們將檢索一個用戶,創建一個新會話並將用戶綁定到該會話。

下面的兩個類列表很容易解釋。 每當有人嘗試訪問經過身份驗證的用戶的URI時,請調用User.getAuthenticatedUser() 嘗試成功登錄時User.addAuthenticatedUser(req, user)調用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();
    }
}

spark會話API是Servlet HttpSession對象的包裝。 沒有為會話存儲配置數據庫的選項。 會話的存儲方式取決於servlet容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM