[jcifs] Null Pointer Exception on using NTLM Authenticaion wi th jcifs 0.7 .0 b3 w/Tomcat 4.1.12

Michael B. Allen miallen at eskimo.com
Sat Sep 28 05:47:13 EST 2002


On Fri, 27 Sep 2002 07:27:22 -0400
"Glass, Eric" <eric.glass at capitalone.com> wrote:

> > Err, so if cookies are disabled you can't store objects in the
> > HttpSession? That doesn't seem right.
> > 
> The servlet spec discusses 3 methods of maintaining the session:
> 
> 1. The JSESSIONID Cookie (the most common, and the only method a servlet
> container is required to support)
> 
> 2. SSL sessions (SSL provides a mechanism for tracking client requests, so
> the spec suggests that this would be an easy way to support sessions over
> HTTPS).
> 
> 3. URL rewriting, supported by HttpServletRequest.encodeURL and
> .encodeRedirectURL.  This is not strictly required by the spec, but is
> fairly universally supported by real-world containers.  This involves
> rewriting a URL such as "http:/somehost/example.jsp" as a path parameter
> named "jsessionid" like "http://somehost/example.jsp;jsessionid=1234".
> 
> According to the Javadoc for HttpServletRequest.encodeURL,
> 
> "For robust session tracking, all URLs emitted by a servlet should be run
> through this method. Otherwise, URL rewriting cannot be used with browsers
> which do not support cookies."
> 
> However, there isn't any real way to do this in the NTLM filter, since there
> isn't anything to rewrite.  What happens is:
> 
> 1.  Client connects and requests the resource.
> 
> 2.  The servlet container creates a new HttpSession object on demand and
> stores the NtlmHttpSession object in it.  The filter sends the 401 response
> with the type 1 message, and the servlet container adds the JSESSIONID
> set-cookie response header.
> 
> 2.  Client replies with the type 2 response, but has declined the cookie, so
> doesn't send the cookie request header.
> 
> 3.  The servlet container determines that this is a new session (since it
> received neither a cookie or a rewritten request) and creates a new session
> when the NtlmHttpFilter calls request.getSession().
> 
> 4.  When the filter attempts to retrieve the NtlmHttpSession object from the
> HttpSession, it gets a null and throws a NullPointerException on line 162.
> 
> 
> I can't think of any easy way to finagle the filter to support URL
> rewriting; I suppose you could do something like:

Well,  maybe I don't need to. What is the preferred way to uniqely identify
a  session? I could just keep a static Hashtable of NtlmHttpSession objects
keyed by something unique about the session? 

> 1.  When the initial request comes in, access the session and check
> session.isNew().  If the session is not new, proceed normally.

This could definately be usefull.

> 2.  If the session is new, we can't determine reliably whether the client
> supports cookies (since we haven't sent them one yet); redirect the client
> to an encoded URL:
> 
> 	String encoded =
> response.encodeRedirectURL(request.getRequestURL().toString());
> 	response.sendRedirect(encoded);

Funny  you should mention this because I think I will need to do a redirect
for  something  a  little  unrelated.  When  a  user wants to access an SMB
resource  (e.g. a file somewhere) using the credentials negotiated via NTLM
I  have  to  get hashes for *both* the server authenticating the client and
the  server  hosting  the requested resource. If they are separate requests
this  doesn't  occur  but  if  they are authenticating and accessing an SMB
resource  in  the  same  request  I need to do two NTLM HTTP Authentication
negotiations.  I  was  thinking  a redirect might do the trick? If I send a
redirect will that close the session first? Can I reliably request that the
client  re-access  the same resource so I can do the negotiation twice with
two different challenges? 

> 3.  When the client reconnects, the session should be established.  Since
> they are accessing the resource via the encoded URL, the subsequent type 1
> and type 3 requests should contain the encoded session ID as well.

So this is the uniqe bit of information I need.

-- 
A  program should be written to model the concepts of the task it
performs rather than the physical world or a process because this
maximizes  the  potential  for it to be applied to tasks that are
conceptually  similar and more importantly to tasks that have not
yet been conceived. 



More information about the jcifs mailing list