访问servlet外部的会话变量

Rav*_*avi 5 java session servlets

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

我想做的就是这样

从proj_recs中选择*,其中user_id = user_id(来自会话)

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

Servlet的

    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;
        }
}
Run Code Online (Sandbox Code Playgroud)

在数据层包中

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

小智 2

您正在寻找的解决方案是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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public void dataLayerMethod(ExistingParameters parameters) {
    User user = MyThreadLocal.get();
}
Run Code Online (Sandbox Code Playgroud)

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

Thread Local 一开始有点令人困惑,但是一旦阅读本文,您很快就会熟悉。