如何在 servlet jsp 中实现生产就绪登录注销功能

Posted

技术标签:

【中文标题】如何在 servlet jsp 中实现生产就绪登录注销功能【英文标题】:how to implement production ready login logout functionality in servlet jsp 【发布时间】:2017-10-11 10:31:28 【问题描述】:

我的问题很简单——如何在servlet jsp中实现login-logout?

以下是用例...

我在数据库中有一个用户表,其中包含电子邮件、用户名和密码 我有一个映射的 bean 对象 - java 中的用户具有电子邮件、用户名、密码属性 我只是想通过验证电子邮件和密码登录但是 一旦我登录然后注销,当我单击返回按钮时,它不应该保留会话。 它不应该给出任何警告,而只是要求登录 如果我复制粘贴受限资源的链接,它应该要求登录

我经历过的所有解决方案...

有人说要使用角色和 bla bla 来实现 tomcat 安全性...但是我认为我不应该在某些 tomcat 配置文件中设置用户名和密码。 Bcz 详细信息在数据库表中 有些人要求实现 no-cache,pragma bla bla... 但从来没有工作 后退按钮禁用是愚蠢的事情

**

我期待你们提供什么帮助...?

**

是否有任何第三方 API 可用于执行此操作? 在生产就绪的应用程序中是如何实现的? 我应该使用 JAAS 还是任何其他安全过程来处理上述场景或什么 请给我一些提示或解决方案,我应该如何继续在 servlet-jsp 中实现生产就绪登录注销

我在互联网上进行了搜索,但最终得到了简单的登录示例或 tomcat 安全角色等。没有人给出实际的解决方案。请不要说这个问题与本论坛无关。

谢谢

【问题讨论】:

Spring Security 怎么样?你不想在 Spring MVC 框架上构建你的应用程序吗? 您可以使用过滤器来检查您是否已登录 @Scary - 是的,我使用过滤器,我也维护会话,我在注销时也使会话无效但是当我点击后退按钮时,所有内容都会再次从缓存中填充。 查看可能重复的***.com/questions/4194207/… 谢谢@Scary - 请告诉我基于角色的安全性如何适用于这种情况,或者适用于其他类型的安全性。它一直让我感到困惑 【参考方案1】:

这是因为浏览器缓存了正在加载的网页,您可以通过使用过滤器并告诉浏览器不要缓存网页来防止它,如下所示。 过滤器的doFilter方法

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    response.setHeader("Pragma", "no-cache");
    response.setDateHeader("Expires", 0);

    HttpSession session = request.getSession(false);//don't create if session doesn't exist.

    if (session==null || session.getAttribute("username") == null) 
        RequestDispatcher rd=request.getRequestDispatcher("login");//dispatch it to your desired page i.e login page
        rd.forward(request, response);
     else 
        chain.doFilter(req, res);  
    

您应该在 web.xml 中配置此过滤器,或者使用您想要过滤的 url-patterns 的注释。有关更多详细信息,请参阅文档。

【讨论】:

【参考方案2】:

如果您使用的是 Tomcat,那么一个好的起点是 Tomcat Standard Realm Implementations。

请务必记住,普通 Java EE 安全性验证用户并授权他们使用角色 - 即使您只有一个角色。

完成此操作后,您可以通过调用调用 HttpServletRequest.logout() 的 servlet 来实现 Logout,然后使 HttpSession 无效:

 request.logout();
 request.getSession().invalidate();

然后:

 response.sendRedirect("some protected page");

这应该可以解决您的后退按钮问题并返回登录页面。

【讨论】:

OOOOKay..! Grt @史蒂夫 我上面的理解是..我只需要配置这个Realm,tomcat就可以完成剩下的重要工作..!只是我需要把东西放在会话中并在注销时失效..! 您会发现阅读Servlet Specification 的§13 也很有用! 您好,请回复..!在用户注册自己然后登录以访问该应用程序的服务的应用程序中实施上述方法是否良好且安全? 嗯 - 是的。它本质上是按照 servlet 规范

以上是关于如何在 servlet jsp 中实现生产就绪登录注销功能的主要内容,如果未能解决你的问题,请参考以下文章

servlet 和 jsp 中的会话跟踪

用Servlet与JSP中实现分页查询

在 JSP 中实现登录页面的优雅方式

用DBHelper在JSP页面中实现登录功能

jsp问题(菜鸟求救):登录模块的问题,登录时出现505错误

表单和servlet在idea中实现文件的上传