1

我的设置如下

  • 在 /myApp/mainServlet/ 下可访问的主应用程序 servlet
  • 一个“手工制作”的小肥皂代理,为来自客户端的肥皂调用添加安全标头(用户名、密码)
  • 一个与主 servlet 对话(通过 BlazeDS 接口)的 Flex 客户端,并通过这个soap代理向第三方发送一些soap调用

flex 客户端有一个会话 id,它在它第一次与主 servlet 对话时设置,它返回一个 HTTP 标头,例如“Set-Cookie:”JSESSION:something; Path=/myApp”。然后这个 cookie 被发送到服务器,以告知客户端关联到哪个会话。

问题是小肥皂代理返回一个带有会话 id 的 cookie(对于通过它进行的每个调用)——然后 Flex 客户端在与主 servlet 通信时使用这些 cookie。这些其他会话 ID 对它来说是未知的,然后当然没有任何作用......

我不希望从soap代理返回会话cookie,并且我已经验证通过告诉Apache前端剥离来自soap代理的所有“Set-Cookie”标头来解决问题。不幸的是(由于一些设置限制),这不是我可以投入生产的方式,所以我需要以编程方式修复它。

如何使 servlet 不尝试设置任何会话 ID?我相信我已经看到了告诉 Jetty(应用程序服务器)不要发送会话 id 的方法,但这也会影响主 servlet 这样做的能力,并且也不可移植。

代理 servlet 是一个非常基本的 Spring Controller(只是实现接口),所以基本上只是一个简单的 servlet。

4

1 回答 1

3

删除 cookie 可以通过res.setHeader("Set-Cookie", null);

编辑:很高兴知道,这会删除所有cookie,因为它们都设置在同一个标​​题中。

我建议您不要在您的 servlet 中执行此操作,过滤器更好,因为它的侵入性较小,例如:

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

    try
    {
        chain.doFilter(request, res);
    }
    finally 
    {
        res.setHeader("Set-Cookie", null);
    }
}

此解决方案的灵感来自 randomcoder 上的这篇文章

于 2012-04-28T21:12:40.303 回答