gpt4 book ai didi

java - Spark 微框架 - 在数据库中保存 session ?

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:42 25 4
gpt4 key购买 nike

如何将 RDBMS (MySQL) 配置为 Spark 框架(Java 微型网络框架,可在 http://sparkjava.com/ 获得)的 session 存储?

我问这个的原因是,如果必须重新启动运行 Spark 的 jetty ,我希望用户 session 保持有效。

最佳答案

实际上有一个选项可以将 session 存储在数据库中。我使用 Ebean ORM,但您可以使用任何其他 ORM 以及纯 SQL 来完成。

假设我们有 User 类和 UserSession 类。

您应该做的是检查是否有 Activity session 。如果它已经存在并且没有用户绑定(bind)——我们传递给身份验证。如果它不存在——我们检查 JSESSIONID cookie 是否存在并且在 UserSession 表中有记录。如果有这样的 session ,我们检索一个用户,创建新 session 并将用户绑定(bind)到它。

下面的两个类列表是不言自明的。每次有人尝试访问经过身份验证的用户的 URI 时调用 User.getAuthenticatedUser()。在成功登录尝试时调用 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;
}
}

用户 session 类:

@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();
}
}

关于java - Spark 微框架 - 在数据库中保存 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29174390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com