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

Discussion in 'Java' started by John_Woo, Oct 23, 2006.

  1. John_Woo

    John_Woo Guest

    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
    John_Woo, Oct 23, 2006
    #1
    1. Advertising

  2. John_Woo wrote:
    > 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)?


    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
    Andrea Desole, Oct 23, 2006
    #2
    1. Advertising

  3. John_Woo

    Simon Brooke Guest

    in message <>,
    John_Woo ('') wrote:

    > 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"
    --
    (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
    Simon Brooke, Oct 23, 2006
    #3
  4. John_Woo

    Rogan Dawes Guest

    Andrea Desole wrote:
    > John_Woo wrote:
    >> 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)?

    >
    > 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


    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
    Rogan Dawes, Oct 23, 2006
    #4
  5. Rogan Dawes wrote:
    >
    > 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


    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.
    Andrea Desole, Oct 23, 2006
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. circuit_breaker
    Replies:
    2
    Views:
    1,989
    Jack Jia
    Apr 4, 2004
  2. asaf
    Replies:
    3
    Views:
    6,137
    =?ISO-8859-1?Q?Arne_Vajh=F8j?=
    Sep 11, 2006
  3. Replies:
    4
    Views:
    1,233
    Greg R. Broderick
    Sep 23, 2006
  4. axrock
    Replies:
    8
    Views:
    939
    Roedy Green
    Mar 25, 2009
  5. Ami
    Replies:
    5
    Views:
    267
Loading...

Share This Page