java 普通类获取session_如何在Java的普通类中获取Session以及request对象
展開全部
你是指你的 web 項(xiàng)目中使用到一個(gè)工具性的類,它的e69da5e6ba9062616964757a686964616f31333337613865形參中沒有 HttpRequest 或 HttpSession 參數(shù)?
如果是這樣的話,我們需要使用一個(gè) ThreadLocal 變量,我們把當(dāng)前 ?request 的變量綁定到里面,在一個(gè) request 請(qǐng)求的生命周期內(nèi)我們?cè)诜椒ㄕ{(diào)用的各個(gè)更深的層次中都可以直接使用它而不需要在每個(gè)方法中都傳遞這個(gè) request 參數(shù),保存在某個(gè)地方就容易導(dǎo)致因?yàn)槎鄠€(gè)請(qǐng)求共用同一個(gè)實(shí)例而出問題,所有 context 相關(guān)的變量不保存在任何業(yè)務(wù)類相關(guān)并且可能被多線程共用的對(duì)象實(shí)例中才是保證不會(huì)出現(xiàn)線程安全問題的途徑。
例如,這個(gè)例子中我們只要把 web.xml 中配置好 ContextFilter 后它就會(huì)自動(dòng)在請(qǐng)求開始時(shí)綁定一個(gè) context,結(jié)束后自動(dòng)銷毀,在這中間的任何時(shí)刻我們都可以通過 MyWebContext.getCurrentContext() 得到我們的 HttpServletRequest 實(shí)例和其它相關(guān)的 context 變量://?MyWebContext?記錄當(dāng)前?Request?的所有?context?變量。因?yàn)?servlet?是一個(gè)請(qǐng)求綁定一個(gè)線程的,我們用?ThreadLocal?不會(huì)有線程安全問題。
class?MyWebContext?{
private?static?final?ThreadLocal?contexts?=?new?ThreadLocal();
//?拿出當(dāng)前線程綁定的?context
public?static?MyWebContext?getCurrentContext()?{
return?(MyWebContext)?contexts.get();
}
public?static?MyWebContext?createContext()?{
return?new?MyWebContext();
}
//?綁定一個(gè)?context?到當(dāng)前線程
public?static?void?setContext(MyWebContext?context)?{
contexts.set(context);
}
public?static?void?clearContext()?{
contexts.set(null);
}
private?HttpRequest?request;
public?void?setRequest(HttpRequest?request)?{
this.request?=?request;
}
public?HttpRequest?getRequest()?{
return?this.request;
}
}
class?ContextFilter?implements?Filter?{
public?void?doFilter(ServletRequest,?SerlvetResponse,?FilterChain?chain)?{
//?創(chuàng)建并綁定我們的?context
MyWebContext?context?=?MyWebContext.createContext();
context.setRequest(request);
MyWebContext.setContext(context);
try?{
chain.doFilter(request,?response);
}?finally?{
//?銷毀?context
MyWebContext.clearContext();
}
}
}
class?MyToolClassWithoutRequestParameter?{
public?static?String?getFileUploadPath()?{
//?其它方法只要它是工作在?servlet?請(qǐng)求調(diào)用鍵中間的某個(gè)時(shí)刻,它就肯定能拿到?Filter?綁定進(jìn)去的?Request,這樣我們就不必要在每次方法調(diào)用中都額外地傳遞一個(gè)?HttpRequest?參數(shù),當(dāng)調(diào)用層次很深時(shí)這能明顯減少復(fù)雜性。
MyWebContext?contex?=?MyWebContext.getCurrentContext();
HttpRequest?request?=?context.getRequest();
HttpServletContext?servletContext?=?...;
HttpSession?session?=?request.getSession(false);
...
}
}
總結(jié)
以上是生活随笔為你收集整理的java 普通类获取session_如何在Java的普通类中获取Session以及request对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq运动怎么不显示手机型号
- 下一篇: java中的asList_Java Ar