嗨
,我目前正在玩 Guice 和 @SessionScoped。为了更有意义,我决定构建一个(非常简单的)身份验证过程。
下面,我将解释我所做的每个步骤。然后我会问你一些问题。
[1] 我创建了一个代表一个人(客人或用户)的身份类:
@SessionScoped
public class Identity implements Serializable
{
private String uid;
private String name;
public boolean isAuthenticate()
{
return uid != null;
}
public void logout()
{
this.uid = null;
}
/*Setters-Getters*/
}
[2] 接下来,我创建了一个登录用户的身份验证类:
public class Authentication
{
@Override
public Identity authenticate(String login, String password)
{
/*some code*/
Identity identity = new Identity();
identity.setUid(user.getId());
return identity;
}
}
[3] 然后,在我的 Servlet 中,我登录用户:
@RequestScoped
public class LoginAction
{
@Inject
Injector injector;
protected void login(HttpServletRequest req, HttpServletResponse resp)
{
Identity identity = injector.getInstance(Identity.class);
Authentication auth = new Authentication();
identity = auth.authenticate("login","password");
}
}
[4] 最后,我创建了一个过滤器,显示用户是否已通过身份验证:
@Singleton
public class SecurityFilter implements Filter
{
@Inject
private Injector injector;
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
{
Identity identity = injector.getInstance(Identity.class);
if(identity.isAuthenticate())
{
System.err.println("USER");
}
else
{
System.err.println("GUEST");
}
chain.doFilter(request, response);
}
}
好吧,这段代码不起作用。我的身份的 uid 始终为“null”。
让我们来提问:
a - 首先,为什么我的代码不起作用?
b - @SessionScoped 是否等同于在 HttpSession 中设置对象?
c - 如何在(http)会话中使身份对象(仅它)无效?
d - 一般来说,在什么情况下我们必须使用@SessionScoped?
感谢您的阅读,
等待您的答复。