你好
我目前正在使用Guice和@SessionScoped。为了让它更有意义,我决定构建一个(非常简单的)身份验证过程。
以下是我所做的每个步骤的解释。然后我会问你一些问题。
[1] 我创建了一个Identity类,代表一个人(客人或用户):
@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);
}
}
这段代码不起作用,我的Identity的uid始终为“null”。
让我们来看看问题:
a - 首先,为什么我的代码不起作用?
b - @SessionScoped是否等同于将对象设置在HttpSession中?
c - 如何使(http)会话中的Identity对象无效(仅限它)?
d - 一般来说,我们在什么情况下需要使用@SessionScoped?
感谢您的阅读,
期待您的答案。