登录时把用户信息放到session中了,ActionContext.getContext().getSession().put("user", user1);
然后有一个控制权限的filter和一个文件上传的servlet,现在问题出现了。在filter用下面的方法取user能取到
HttpSession session = ((HttpServletRequest)req).getSession();
User user = (User)session.getAttribute("user");
但是在上传文件那个servlet里去user取到的是空,用的方法是
 HttpSession session = request.getSession();
User user = (User)session.getAttribute("user");
断点一步一步跟的,就是取不到。最后我在struts里登录的代码改了一下改成下面的
ActionContext.getContext().getSession().put("user", user1);
ServletActionContext.getRequest().getSession().setAttribute("user", user1);
断点跟了 还是取不到,但在filter里能取到啊,而且在servlet和filter中取到的session都不是一个值,我也试着getSession(false)了,但是这样就空指针了。。求助。。谁能告诉我why,据说csdn高手很多滴。。

解决方案 »

  1.   

    在你的filter里面,你有没有doChain()??所request和response继承往下转发?
      

  2.   

    涉及到的代码比较多 就不贴了很低级的错误我应该不会犯的。现在排查到了一下。
    首先我重新写了个servlet,登录后用url请求这个servlet没问题,能取到,
    然后我把上传文件的页面的表单改了一下 改成普通表单请求这个上传文件的servlet,也能取到 
    最后我改成上传文件的表单,文件上传上去了,又悲剧了。
    怎么回事?
      

  3.   

    不是上传的问题 session和表单有关系吗?我想不通
      

  4.   

    跟上传可能会有关系的
    比如有的带Flash的上传文件插件,浏览器会为Flash新开一个Session,新开的Session里自然就没有登录信息了。这种时候必须通过别的途径指明登录用户身份
      

  5.   

    楼主考虑下:
    1 网页如果使用了iframe/frameset技术,session就容易出问题。
    2 上传的时候,form的编码方式是不一样的,Server端解析的时候,很难说不出问题。
    3 如果禁用了Cookie,则Session要靠URL重写来实现,如果同时又是上传,则更难说不出问题。
      

  6.   

    说的很有道理,我确实用了jquery的插件uploadify做的上传,今天换用struts2替代原来的servlet了,仍然取不到session里的值,经断点跟和别的session不是同一个。后来想了一个折中的方法,从页面上取到session中的用户名,上传时候把用户名当做参数也传到action中,然后到数据库中查用户再使用。。
      

  7.   

    解决了。正如七楼说的是用了带flash的上传插件,重开了一个session,不然不会取到的session的id都不一样,所以我用了别的办法拿用户信息。不过不知道为什么flash重开session。
      

  8.   


    这个取决于浏览器,对于uploadify,好像IE就不会重开session,火狐就会