package com.util;import java.util.HashMap; import java.util.Map;import javax.servlet.http.HttpServletRequest;public class actioncontext implements java.io.Serializable { static ThreadLocal<actioncontext> actionContext = new ThreadLocal<actioncontext>(); static Map<String, Object> context = new HashMap<String, Object>(); static actioncontext ac = new actioncontext();
public Object get(String key) { return context.get(key); }
public void put(String key, Object value) { context.put(key, value); } public actioncontext getcontext(){ return (actioncontext)actionContext.get(); } public void putcontext(actioncontext action){ actionContext.set(action); } public static actioncontext getInstance(){ if(ac == null ){ ac = new actioncontext(); } return ac; } public void setRequest(HttpServletRequest request){ ac.put("request",request); } } package com.util;import javax.servlet.http.HttpServletRequest;public class ReqUtil { public static void setRequest(HttpServletRequest request) { actioncontext ac = actioncontext.getInstance(); ac.setRequest(request); ac.putcontext(ac); }
public static HttpServletRequest getRequest(){ return (HttpServletRequest)actioncontext.getInstance().getcontext().get("request"); } }//测试 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ReqUtil.setRequest(request);
response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass());
out.println(", using the GET method"); out.print(ReqUtil.getRequest().getParameter("ac")); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); }原理是struts2的servletActionContext 一样
取的时候request.getSession().getAttribute("user");
但是如果我存放一个静态对象的话假如 是 存放到user对象 ,static是全局可以更改的, 他们取的时候,肯定是取到最后登录的那个人如果 是存放list 里面 的话, 我没有参数,怎么取到list里面对应位置的 user 对象呢~
“假如 是 存放到user对象 ,static是全局可以更改的, 他们取的时候,肯定是取到最后登录的那个人”
放到静态对象里 肯定不行。
取的时候时候不传request,那他怎么取session?
关键 servlet中,有没有方法在不使用 request的情况下,得到session呢?
* 获取和设置当前用户信息的工具类。
*/
public final class CurrentUser extends ThreadLocal<UserInfo> { /**
* 单例
*/
private static final CurrentUser SINGLETON = new CurrentUser(); /**
* 不需要实例化
*/
private CurrentUser() {
} /**
* 获取当前用户信息。
*
* @return 当前用户信息
*/
public static UserInfo getUser() {
return SINGLETON.get();
} /**
* 设置当前用户信息
*
* @param user
* 当前用户信息
*/
public static void setUser(UserInfo user) {
SINGLETON.set(user);
}}/**
* 过滤器,用以将session中的UserInfo放入CurrentUser的ThreadLocal中。
*/
public class CurrentUserFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException {
} public void destroy() {
} public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
// 初始化当前线程本地内容
UserInfo userInfo = ((HttpServletRequest) request).getSession().getAttribute("userInfo");
CurrentUser.setUser(userInfo); // 让过滤器链表中的其他过滤器继续处理
chain.doFilter(request, response);
} finally {
// 移除当前线程本地内容
CurrentUser.setUser(userInfo);
}
}
}
} finally {
// 移除当前线程本地内容
CurrentUser.setUser(null);
}
package com.util;import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;public class actioncontext implements java.io.Serializable {
static ThreadLocal<actioncontext> actionContext = new ThreadLocal<actioncontext>();
static Map<String, Object> context = new HashMap<String, Object>();
static actioncontext ac = new actioncontext();
public Object get(String key) {
return context.get(key);
}
public void put(String key, Object value) {
context.put(key, value);
}
public actioncontext getcontext(){
return (actioncontext)actionContext.get();
}
public void putcontext(actioncontext action){
actionContext.set(action);
}
public static actioncontext getInstance(){
if(ac == null ){
ac = new actioncontext();
}
return ac;
}
public void setRequest(HttpServletRequest request){
ac.put("request",request);
}
}
package com.util;import javax.servlet.http.HttpServletRequest;public class ReqUtil {
public static void setRequest(HttpServletRequest request) {
actioncontext ac = actioncontext.getInstance();
ac.setRequest(request);
ac.putcontext(ac);
}
public static HttpServletRequest getRequest(){
return (HttpServletRequest)actioncontext.getInstance().getcontext().get("request");
}
}//测试
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ReqUtil.setRequest(request);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.print(ReqUtil.getRequest().getParameter("ac"));
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}原理是struts2的servletActionContext 一样