如何使用球衣将会话绑定到用户对象

How to bind the session to the User object using jersey

我正在尝试创建登录功能,我想在会话中保存特定数据以供用户将来的请求使用,这可能吗?

在 loginUser 中,即使用户已经登录,第一个 if 始终为 false 在 updatePassword 中也一样。

我需要从函数 loginUserToSession 中保存属性。知道为什么它不起作用吗?

这是我的代码

资源

    @Path("/logIn")
    @Singleton
    public class UserResource extends baseResource<UserDao, UserEntity>
    {
        @Path("/authenticateUser")
        @GET
        @UnitOfWork
        public String loginUser(@Context HttpServletRequest req @QueryParam("callback") String callback, @QueryParam("loginInfo") LoginInfo loginInfo) throws JsonProcessingException
        {
            if(SessionManager.isUserConnected(req))
            {
                return ResourceResponse.getResourceJsonString("null", callback, "true", ErrorMessageEnum.SUCCESS);
            }
            String userName = loginInfo.username;
            String plainTextPassword = loginInfo.password;
            UserEntity user = objectDao.logIn(userName, plainTextPassword);
            if(user != null)
            {
                SessionManager.loginUserToSession(req, user.getUserId(), userName);
                return ResourceResponse.getResourceJsonString(user.getUserStatus(), callback, "true", ErrorMessageEnum.SUCCESS);
            }
            return ResourceResponse.getResourceJsonString("null", callback, "false", ErrorMessageEnum.LOGIN_FAILED);
        }

    @Path("/updatePassword")
    @GET
    @UnitOfWork
    public String updatePassword(@Context HttpServletRequest req, @QueryParam("callback") String callback, @QueryParam("oldPwd") String oldPwd, @QueryParam("newPwd") String newPwd) throws JsonProcessingException
    {
        if(SessionManager.isUserConnected(req))
        {
            short userId = SessionManager.getUserId(req);
            ObjectDaoResponse res = objectDao.updatePassword(userId, oldPwd, newPwd);
            return ResourceResponse.getResourceJsonString(res.getObjectJsonString(), callback, res.getSuccess(), res.getCode());
        }
        else
        {
            return ResourceResponse.getResourceFailResponseString(callback, ErrorMessageEnum.USER_NOT_CONNECTED); 
        }
    }
}

SessionManager.java

    public static void loginUserToSession(HttpServletRequest req, short userId, String userName)
    {
        if(req == null)
        {
            return;
        }
        HttpSession session = req.getSession(true);
        session.setAttribute(ATTRIBUTE_USER_NAME, userName);
        session.setAttribute(ATTRIBUTE_USER_ID, userId);
        session.setAttribute(ATTRIBUTE_USER_CONNECTED, true);
    }

    public static boolean isUserConnected(HttpServletRequest req)
    {

        if(req == null)
        {
            return false;
        }
        HttpSession session = req.getSession(false);
        if(session != null)
        {
            boolean userConnected = (boolean) session.getAttribute(ATTRIBUTE_USER_CONNECTED);
            if(userConnected)
            {
                 return userConnected;
            }
            System.out.Println("session.getAttribute(ATTRIBUTE_USER_CONNECTED)== null");
        }
        return false;
    }

请像这样换成资源

public String loginUser(@Context HttpServletRequest req @QueryParam("callback") String callback, @QueryParam("loginInfo") LoginInfo loginInfo) throws JsonProcessingException
        {
            if(SessionManager.isUserConnected(req))
            {
                return ResourceResponse.getResourceJsonString("null", callback, "true", ErrorMessageEnum.SUCCESS);
            }else{
            String userName = loginInfo.username;
            String plainTextPassword = loginInfo.password;
            UserEntity user = objectDao.logIn(userName, plainTextPassword);
            if(user != null)
            {
                SessionManager.loginUserToSession(req, user.getUserId(), userName);
                return ResourceResponse.getResourceJsonString(user.getUserStatus(), callback, "true", ErrorMessageEnum.SUCCESS);
            }
          }
        }

以上是流程错误,不管我得到什么,现在你必须 setattribute 进入会话范围 然后使用这个:

HttpSession session = request.getSession();
session.setAttribute("UserName", "Usename_Value");

或者请求范围使用这个:

request.setAttribute("attributeName",yourStringVAlue);

事实证明,出于某种原因 google 邮递员没有按应有的方式发送 HttpServletRequest。所以球衣像新用户一样翻译它并创建一个空的新 HttpServletRequest。 结论不要用Google的邮递员测试你的服务器端 当我尝试从我的客户端发送请求时它工作正常。