views:

169

answers:

4

Can I access session object from within a function where request object is not present?

I know in Java we access session like this:

HttpSession session = request.getSession(true);

But what if we want to access session when request object is not present?

Is it possible? is there an alternate way to get session object?

Edit

I have a servlet

public class ABC extends HttpServlet
{
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
    {
             ..........
             ...........
        myFun1(x,y,z);  
    }

      private void myFun1(int x, int y,long z)
      {
            .........
            myFun2(a,b);    
       }

      private void myFun2(int a,String b)
      {
            .........

            //      Need Session here
       }

}
+4  A: 

It depends what you mean by "when request object is not present". You could have a thread-local variable which sets the "current request for this thread" early in the servlet or whatever you're running (you haven't made it clear). Then you could get at "the current request in this thread" from anywhere, and get the session that way. (Or along the same lines, you could set the current session instead of the current request in the thread-local variable.)

It's not terribly pretty though, and you have problems if you want to do something on a different thread. Passing the request or session down as a dependency is generally cleaner.

Jon Skeet
+1  A: 

passing request object is the solution,

public class ABC extends HttpServlet
{
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
    {
             ..........
             ...........
        myFun1(x,y,z,req);  
    }

      private void myFun1(int x, int y,long z,HttpServletRequest req)
      {
            .........
            myFun2(a,b,req);    
       }

      private void myFun2(int a,String b,HttpServletRequest req)
      {
            .........

            //      Need Session here
       }

}
sohilv
Huhh? Did you actually look at his code?
Willi
+4  A: 

Generally speaking though, if you want to access the http session from a place where the request object is not available then you may have design problems in your application and you need to rethink about concerns, layering etc.

cherouvim
+1  A: 

If you implement JSF technology in to your application you can access everything by calling;

FacesContext.getCurrentInstance();

Because this is a singleton instance retrieved, you can access it anywhere in your presentation layer.

However, implementing JSF is probably slightly overkill just for this purpose as you'll probably have to make a lot of changes in your configuration and presentation layers to accommodate for it.

That said, if you do decide to go down that road, you can also think about using MyFaces, which is a fantastic API for those using JSF in their applications.

Alasdair
It doesn't return a singleton. It returns a threadlocal reference.
BalusC
Thank you Balus, I was trying to keep it simple but you are totally right.
Alasdair