2012-04-28 81 views
1

我的设置如下如何避免创建会话?

  • 主应用程序的servlet访问下/对myApp/mainServlet/
  • ,增加了安全性头(用户名,密码),以SOAP调用从未来的一个小“手工制作”肥皂代理客户
  • 一个Flex客户端,通过这种肥皂代理

Flex客户端已经被设置时,会话ID会谈主要的servlet(通过BlazeDS的接口),并发送一些SOAP调用给第三方它首先与t谈话他主要的servlet,它返回一个HTTP头,如“Set-Cookie:”JSESSION:某事; Path =/myApp“,然后将这个cookie发送到服务器,以通知客户端与哪个会话相关联

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

我不想要会话cookie从肥皂代理回来了,我已经验证问题将通过讲述一个Apache前端去除所有“设置Cookie”头从SOAP代理来这样做来解决。不幸的是(由于一些设置限制),这不是我可以投入生产的一种方式,所以我需要以编程方式修复它。

我怎样才能让这个servlet不尝试设置任何会话ID?我相信我所看到的告诉码头(应用服务器)不发送会话ID的方法,但是,这也将影响主servlet的这样做,以及能力,也无法移植。

代理Servlet是一个非常基本的春天控制器(只是实现接口),所以基本上只是一个裸骨的servlet。

回答

2

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

编辑来完成:这是很好的了解,这将删除所有饼干,因为它们在相同的标题全部设置。

我建议你不这样做,在你的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); 
    } 
} 

该解决方案通过在this article灵感randomcoder。

+0

感谢您的回答,基里尔!顺便说一句 - 你是否暗示说会话总是在Java Servlet容器中创建的?我在问,因为我不确定规格说什么。谁负责进行会议? – oligofren 2012-04-29 08:37:18

+1

@oligofren您可以使用'responce.getSession()'创建会话。你说你有一个“SOAP代理”,它是如何代理的,以及在哪里? SOAP响应来自的实际位置是否可以设置cookie? – jmruc 2012-04-29 09:11:07

+0

好点!我从来没有想到,但是:是的,它重定向到Axis服务(在Glassfish上运行),当然可以设置会话ID。一些试验用裸露的骨头的servlet(在http://www.sonatype.com/books/mvnex-book/mvnex-examples.zip CH-简单的Web /简单Web应用程序代码)后,我现在可以看到一个基本的servlet没有返回一个JSESSIONID - 除非我做了一个getSession()。所以你确实是对的 - 会话cookie来自服务器,我代理请求! – oligofren 2012-04-29 10:01:49