gpt4 book ai didi

java - 在 servlet 外部访问 session 变量

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:15 24 4
gpt4 key购买 nike

我正在开发一个 java webapp,我需要根据用户登录 ID 从数据库中访问记录。我在成功登录后在 session 变量中设置登录详细信息。

我想做的是这样的

Select * from proj_recs where user_id= user_id (from session)

现在我将用户名作为参数传递,但我认为这不是一个好的做法。有没有更好的方法来访问 servlet 之外的 session 变量?

小服务程序

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub

User user = (User) request.getSession().getAttribute("userInfo");

System.out.println(user);

if(user != null){
Gson gson = new Gson();
returnJsonResponse(response,gson.toJson(user));
return;
}
}

在数据层封装

public Accrual getAccruals(String accrualID,String userid) throws AccrualNotFoundException{

String sql = Select * from db_acc where acc_id= accrualID and user_id=userid;

}

问题是我必须用 userid 修改我的所有方法。有没有一种方法可以将用户详细信息设置到某个静态类中,并在不修改方法签名的情况下访问应用程序中我想要的详细信息?但我相信静态类在不同的用户请求之间共享。

最佳答案

您正在寻找的解决方案是 Thread Local(谷歌搜索)。它允许您使用静态方法访问特定于线程的数据。

您可以开始阅读http://veerasundar.com/blog/2010/11/java-thread-local-how-to-use-and-code-sample/ .使用那里的示例,您需要创建:

public class MyThreadLocal {

public static final ThreadLocal userThreadLocal = new ThreadLocal();

public static void set(User user) {
userThreadLocal.set(user);
}

public static void unset() {
userThreadLocal.remove();
}

public static User get() {
return userThreadLocal.get();
}
}

在您的 servlet 中,执行此操作:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user = (User) request.getSession().getAttribute("userInfo");
MyThreadLocal.set(user);
try {
// call data layer
} finally {
MyThreadLocal.unset();
}
}

在您的数据层中,您可以通过执行以下操作来检索用户:

public void dataLayerMethod(ExistingParameters parameters) {
User user = MyThreadLocal.get();
}

请注意,您不需要更改数据层的方法签名。

Thread Local 一开始有点迷糊,但是看完文章你会很快熟悉。

关于java - 在 servlet 外部访问 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24329474/

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