Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / October 2006

Tip: Looking for answers? Try searching our database.

servlet, how to get request's timestamp and timezone?

Thread view: 
John_Woo - 23 Oct 2006 12:54 GMT
Hi,

I have a web app which needs to log request's info, including its'
timestamp/timezone.

Can anyone have idea (what can be used from 3rd-party-lib, is only
common one, like apache)?

--
Thanks lots
John
Toronto
Andrea Desole - 23 Oct 2006 13:19 GMT
> Hi,
>
[quoted text clipped - 3 lines]
> Can anyone have idea (what can be used from 3rd-party-lib, is only
> common one, like apache)?

for the timestamp you can use the Date request header. It's not
mandatory, but it should be used often.

For the timezone you can take the ip address of the request and then use
one of those services that map the ip address to the location. If the
timezone is not directly available you can get it from the longitude.

Weird requirements you have
Rogan Dawes - 23 Oct 2006 14:24 GMT
>> Hi,
>>
[quoted text clipped - 12 lines]
>
> Weird requirements you have

Yeah, weird is right.

I don't think that the HTTP RFC actually defines a Date *request*
header, in fact. I've only ever seen it in the *response*, placed there
by the server.

The request (using IE6):

GET http://google.com:80/ HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET
CLR 1.1.4322; .NET CLR 2.0.50727)
Host: google.com
Proxy-Connection: Keep-Alive

The response:

HTTP/1.0 302 Found
Date: Mon, 23 Oct 2006 13:18:43 GMT
Content-Type: text/html
Cache-Control: private
Server: GWS/2.1
Location: http://www.google.com/

Note, no Date header in the request.

So, to answer the OP's question, use your own Date (new Date()) to get
the time of the request (to within a VERY close approximation of the
actual time it was received - I'm talking a few milliseconds, anyway).

And if you *REALLY* need to figure out the time zone of the caller,
probably IP geolocation is your only way of getting a reasonable
approximation. But that is a very strange thing to want to do,
especially for EVERY request. That is the sort of thing that you can get
through post-processing your logs, which will significantly improve your
user's experience with your service.

Rogan
Andrea Desole - 23 Oct 2006 15:02 GMT
> Yeah, weird is right.
>
[quoted text clipped - 13 lines]
> Host: google.com
> Proxy-Connection: Keep-Alive

I see. I looked around a bit, and I found this:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18

<quote>
Clients SHOULD only send a Date header field in messages that include an
entity-body, as in the case of the PUT and POST requests, and even then
it is optional. A client without a clock MUST NOT send a Date header
field in a request.
</quote>

So it makes sense that in this example there is no Date header, because
it's a get.
Simon Brooke - 23 Oct 2006 14:11 GMT
> I have a web app which needs to log request's info, including its'
> timestamp/timezone.

RFC 2616 does not require or even suggest that requests should pass either
a timestamp or a timezone, so you can't normally get get this information
from the client. So the best you can do is log the time you receive the
request, which is trivial.

The following RFC 2616 headers should (if present) contain date information

                     | If-Modified-Since        ; Section 14.25
                     | If-Unmodified-Since      ; Section 14.28

To access these, you use

javax.servlet.http.HttpServletRequest
public long getDateHeader(java.lang.String name)

"Returns the value of the specified request header as a long value that
represents a Date object. Use this method with headers that contain dates,
such as If-Modified-Since.
The date is returned as the number of milliseconds since January 1, 1970
GMT. The header name is case insensitive.
If the request did not have a header of the specified name, this method
returns -1. If the header can't be converted to a date, the method throws
an IllegalArgumentException.
Parameters:
name - a String specifying the name of the header
Returns:
a long value representing the date specified in the header expressed as the
number of milliseconds since January 1, 1970 GMT, or -1 if the named
header was not included with the reqest
Throws:
java.lang.IllegalArgumentException - If the header value can't be converted
to a date"
Signature

simon@jasmine.org.uk (Simon Brooke) http://www.jasmine.org.uk/~simon/
       ;; If any council in the country has anything to say to cyclists
       ;; about cycle paths, it should be: "We are terribly, terribly sorry."
                                                       - Zoe Williams, The Guardian, 13th Sept 2006



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.