我是利用struts2.1和Hibernate3做的一个项目,里面有一个过滤器,本想如果用户没有登录,则当用户访问其他的某个页面时候被过滤器拦截又跳转到登录页面。
  Action中是这样 利用ActionContext.getContext().getSession().put("user",getUsername()) 来保存用户session的,可是在过滤器中利用 if(ActionContext.getContext().getSession().get("user") != null)来检测是否保存有session 程序就会提示说空指针异常(编译没问题)。在过滤器中可以利用request.getSession()来获取HttpSession,可是在action中利不能用request.getSession来保存用户信息。
  请问该怎么做哩?请给个思路。

解决方案 »

  1.   

    在action中为什么不直接用request.getSession()呢?
    ActionContext.getContext().getSession().put("user",getUsername()) 
    其实它是一个HashMap,在filter中,ActionContext.getContext()能不返回一个null吗?
    filter根本无法获取action的请求上下文信息呀!
    对一个null对象调用它的方法那么程序肯定给你一个java.lang.NullPointerException呀!
    ActionContext.getContext()只有在action中获取才不会是null,所以你在action中要用
    request.getSession,然后在filter中也是一样用request.getSession()来获取session。
    ActionContext.getContext().getSession().put("user",getUsername()) 用它来保存
    登录用户是不合理的。因为它不是HttpSession
      

  2.   

    可是在action中利不能用request.getSession来保存用户信息???import javax.servlet.http.HttpSession;
    import org.apache.struts2.ServletActionContext;
    @Override
    public String execute() {    
    HttpServletRequest request = ServletActionContext.getRequest();     
    HttpSession session = request.getSession();
    ......
    }
      

  3.   

    因为你这样得到的是一个 HashMap . 直接 get("user") 假如没有的话是要报空指针,你可以用 containsKey("user") 来判断是不是session里有 "user" 这个值了.
      

  4.   

    假如你用的是过滤器.默认 doFilter 就已经会传一个 request 给你了,就在参数里.
    直接 request.getSession() 能得到 HttpSession .
      

  5.   

    直接用request.getSession()。setAttribute()