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 一开始有点令人困惑,但是一旦阅读本文,您很快就会熟悉。