如何使用球衣将会话绑定到用户对象
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的邮递员测试你的服务器端
当我尝试从我的客户端发送请求时它工作正常。
我正在尝试创建登录功能,我想在会话中保存特定数据以供用户将来的请求使用,这可能吗?
在 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的邮递员测试你的服务器端 当我尝试从我的客户端发送请求时它工作正常。