使HttpSession对象为null

时间:2017-08-19 13:54:08

标签: java spring spring-mvc

我使用Spring web mvc,rest api和前端作为angular 2.我在Spring使用HttpSession创建会话,它在会话中设置对象,但是当我检索session属性时,它返回null。以下是我的代码。任何帮助将不胜感激。

@RequestMapping(value="/getSession", method=RequestMethod.GET)
    public @ResponseBody User getSession(HttpSession session,HttpServletRequest req){
        // session = req.getSession(false);
        User user=(User) session.getAttribute("name");
        System.out.println("name "+user.getName());
        System.out.println("surname "+user.getSurname());
        System.out.println("address "+user.getAddress());
        if(user!= null)
            return user;
        else
            return null;
    }

    @RequestMapping(value="userFormData.html",method = RequestMethod.POST)
    public String setUserForm(@ModelAttribute User user, HttpServletRequest ht, HttpSession session){
        HttpSession se = ht.getSession(true);
        se.setAttribute("name", user);
        String str="Vikram";
        System.out.println("Name "+str);
        List<Address> ad= user.getAddress();
        System.out.println("User");
        User user1=(User)se.getAttribute("name");
        System.out.println("SESSION :"+user1.getName());
        System.out.println("SESSION END :"+user1.getSurname());
        System.out.println(ad.size());
        return "user";
    }

2 个答案:

答案 0 :(得分:0)

实现您尝试执行的操作的最佳方法是使用会话范围的bean。这将允许您创建可以存储状态的组件,顾名思义,只要会话处于活动状态,就会保留该状态。有关更多详细信息,请参阅Spring的documentation

答案 1 :(得分:0)

我在Restful服务应用程序上维护会话的方法。

RESTful服务是无状态的,因此在每个请求中,我们需要将一些唯一标识符作为标题的一部分发送到服务器。

客户端

  • 在客户端维护授权令牌(密钥 - 公共密钥,值 - 标识客户端的唯一值),此授权令牌应作为服务器初始响应的一部分接收
  • 理想授权令牌应包含有关用户和会话有效性的信息,令牌中的值应加密
  • Token值最初应该从服务器获取,你可以使用你选择的算法,但它应该是服务器生成的令牌
  • 在每个RESTful服务调用中,将此标记添加为请求标头的一部分,以便让服务器端识别用户

服务器端

  • 收到对RESTful服务的任何请求后,验证是否拥有有效令牌的请求。如果令牌有验证,否则创建一个新的并将其作为响应的一部分发送回来

  • 如果令牌有效,那么恢复用户会话有多种方式(会话Bean,使用Map缓存,HttpSession,DB持久性),使用这些方法中的任何一种来获取应该传递的会话获取用户会话的唯一键

  • 用于存储和检索用户会话的密钥应该是唯一的,并且需要在所有RESTful服务调用中作为Request标头的一部分接收,因为RESTful是无状态的

    < / LI>

通常,在RESTful应用程序中维护Session并不是一个好的设计,因为RESTful被设计为无状态。

除了对超媒体的一般理解之外,REST客户端不需要了解如何与任何特定应用程序或服务器进行交互。

基于休息的架构使用无状态协议进行通信。在无状态协议中,客户端或服务器不保留任何信息。如果您是根据REST设计Web服务,那么您应该考虑这一点,即不维护会话。

希望它有帮助!