如何让servlet容器从查询字符串而不是URL中读取JSESSIONID

时间:2011-08-26 23:30:15

标签: java servlets kml google-earth jsessionid

我需要能够通过将JSESSIONID指定为url的查询字符串的参数而不是URL本身的一部分来维护会话。

换句话说,我需要维持这样的会议

http://myserver.com?jsessionid=A463B23BC4F2342FA

而不是

http://myserver.com;jsessionid=A463B23BC4F2342FA

对于servlet容器,我正在使用tomcat 6.0和weblogic 10.3

原因:

我正在创建一个Google地球网络链接,要求我为客户提出的请求保留会话。 Google地球不支持Cookie,似乎无法更改用于发出请求的网址。我只能通过在服务器响应中向kml添加以下内容来告诉它在后续请求中附加查询字符串参数

<NetworkLinkControl>
    <cookie>JSESSIONID=A463B23BC4F2342FA</cookie>
</NetworkLinkControl>

2 个答案:

答案 0 :(得分:2)

不可能。我会在您身边创建filter,只要网址在查询字符串中显示JSESSIONID,就会将请求重定向到正确的网址。

基本启动示例:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    if ("GET".equals(request.getMethod()) && request.getParameter("JSESSIONID") != null) {
        response.sendRedirect(request.getRequestURL().append(";JSESSIONID=")
            .append(request.getParameter("JSESSIONID")).toString());
    } else {
        chain.doFilter(request, response);
    }
}

将此映射到URL模式,该模式涵盖可能由该网站发起的请求。或者,如果没有,只需/*

答案 1 :(得分:0)

我们为此创建了自定义Tomcat Valve。它非常简单,但特定于Tomcat。