Java Postlogin钩子是一种使用servlet、过滤器的功能
我在我的webApp中有一个要求,我需要为使用有效凭据登录的用户生成内部密码。也就是说,此内部密码生成功能将在用户的会话生存期内仅发生一次。我需要将此内部密码放入用户的会话中。 使用postlogin钩子可以在liferay中实现类似的功能,但我不知道如何仅使用servlet和过滤器来实现同样的功能。 注意:我使用JAAS进行用户身份验证 我做了如下操作:在servlet过滤器中,检查会话中的内部密码,如果它不存在,则生成。但在用户登录后,同时有多个对服务器的请求,则会创建不必要的多个密码。这个密码生成是一件昂贵的事情 有人能给我提点别的建议吗?Java Postlogin钩子是一种使用servlet、过滤器的功能,java,servlets,web-applications,servlet-filters,Java,Servlets,Web Applications,Servlet Filters,我在我的webApp中有一个要求,我需要为使用有效凭据登录的用户生成内部密码。也就是说,此内部密码生成功能将在用户的会话生存期内仅发生一次。我需要将此内部密码放入用户的会话中。 使用postlogin钩子可以在liferay中实现类似的功能,但我不知道如何仅使用servlet和过滤器来实现同样的功能。 注意:我使用JAAS进行用户身份验证 我做了如下操作:在servlet过滤器中,检查会话中的内部密码,如果它不存在,则生成。但在用户登录后,同时有多个对服务器的请求,则会创建不必要的多个密码。这个
提前谢谢。我不知道JAAS身份验证是如何工作的,我只是指那部分: 我需要将此内部密码放入用户会话 如果您想将任何内容存储到用户会话以供以后处理,可以在serlvets代码中执行此操作
protected final void doGet(HttpServletRequest request,HttpServletResponse response) {
HttpSession session = request.getSession(true); //this returns an existing session, or creates new one
session.setAttribute(key,value);
...
}
只要会话存在,这些存储的对象就一直可用
我做了如下操作:在servlet过滤器中,检查会话中的内部密码,如果它不存在,则生成。但在用户登录后,同时有多个对服务器的请求,则会创建不必要的多个密码。这个密码生成是一件昂贵的事情
如果生成内部密码的成本很高,则不应在servlet过滤类中创建它们,因为这些过滤器适用于客户机向服务器发出的任何请求。将pw生成的相关代码移动到servlet,它执行用户凭证的实际验证。如果凭据正常,请创建一次密码并将其存储在会话对象中,如上所述
更新:
假设你有某种html表单
<form method="post" action="AuthServlet">
<input type="text" name="username">
<input type="password" name="pwd">
<input type="submit" value="login">
</form>
在用ServletName
表示的servlet中,您可以在doPost()中执行密码生成,并将此pwd附加到用户会话。
如果您有某种用户模型,并且用户具有角色等。您可以查询角色,并根据角色转发到servlet。
这更有帮助吗 在验证用户时添加内部密码生成逻辑就可以了。因此,我需要在JAAS身份验证模块中添加此逻辑。但是,我的问题是针对纯servlet的。但我的问题是:有没有办法像web.xml中的任何配置一样,在登录后只调用一次servlet。请不要说明如何将值设置到会话中。我认为,从我的问题可以清楚地看出,我曾经使用过servlet,并且对服务器端技术有基本的了解。但是谢谢你的回答。我已经更新了我的答案,我不得不承认,也许我没有正确地理解你,看我上面的假设这似乎是正确的。非常感谢你的朋友。
@WebServlet("/AuthServlet")
public class AuthServlet
extends HttpServlet {
// .. lines omitted ..
@Override
protected final void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException {
// ... lines omitted
// perform authentication with JAAS
try {
LoginContext loginContext = new LoginContext("SomeName", handler);
// starts the actual login
loginContext.login();
//at this point, user is authenticated..normally you would forward him to e.g. a jsp, welcoming the user
//request.getRequestDispatcher("anyJsp.jsp").forward(request, response);
//but you can also forward to another serlvet and perform business logic or else
request.getRequestDispatcher("/ServletName").forward(request, response);
} catch (LoginException e) {
//do sth., if auth fails
}
}