【问题标题】:How to secure my Account after Logout?注销后如何保护我的帐户?
【发布时间】:2013-04-18 02:10:28
【问题描述】:

我有一种情况 - 在我从页面注销后,如果有人在浏览器中单击“返回”按钮,它会自动再次进入返回页面。在 Logout.java (Servlet) 我使用:

session.invalidate();
request.getRequestDispatcher("index.jsp").forward(request,response);

一切正常。但是注销后,如果我在浏览器中单击返回按钮(左上角),它会回到我所在的位置。如果我单击返回,我想这样做,那么必须说您的会话已过期或登录或其他。怎么做。请提出您宝贵的建议。
我刚读到这个,我创建了一个 servlet FilterURL.java:

public class FilterURL extends HttpServlet implements Filter {
    @Override
    public void init(FilterConfig config) throws ServletException {
    //
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
      HttpServletResponse hsr = (HttpServletResponse) res;
      hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
      hsr.setHeader("Pragma", "no-cache"); // HTTP 1.0.
      hsr.setDateHeader("Expires", 0); // Proxies.
      chain.doFilter(req, res);
    }

    @Override
    public void destroy() {
    //
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    //
    }
}

还有我的 web.xml:(在 web-app 下)

<filter>
    <filter-name>FilterURL</filter-name>
    <filter-class>com.filter.url.sys.FilterURL</filter-class>
</filter>
<filter-mapping>
    <filter-name>FilterURL</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

但它不会工作。我错了什么??
我是从这个页面读到的:

  1. How to use a servlet filter in Java to change an incoming servlet request url?
  2. Prevent user from seeing previously visited secured page after logout
  3. http://tutorials.jenkov.com/java-servlets/servlet-filters.html
  4. servlet session , after logout , when back button of browser is pressed , again the secure page is shown

【问题讨论】:

  • 您是否使用过滤器等检查每个请求的会话状态?
  • 注销后可以用JS关闭浏览器窗口,防止出现这种情况。
  • 注销后,您会跳转到一个页面,在该页面中您会使用“确定”按钮提醒消息。一旦用户单击“确定”按钮,您就会关闭浏览器窗口。
  • 这种情况下如何使用Filter?

标签: jsp jakarta-ee servlet-filters logout back-button-control


【解决方案1】:

filter

HttpSession session = request.getSession(false);
                                 // don't create if it doesn't exist
if(session != null && !session.isNew()) {
    chain.doFilter(request, response);
} else {
    response.sendRedirect("/index.jsp");
}

checking session in servlet and jsp

【讨论】:

    【解决方案2】:

    使用 servlet 过滤器链接以获得更好的安全性。

    源 Oracle

    堆栈溢出的解释

    How to use a servlet filter in Java to change an incoming servlet request url?

    有关教程,请参阅此链接。

    http://viralpatel.net/blogs/tutorial-java-servlet-filter-example-using-eclipse-apache-tomcat/

    一个不错的 -- http://tutorials.jenkov.com/java-servlets/servlet-filters.html

    过滤器可以执行许多不同类型的功能。我们将在本文中讨论斜体项目的示例:

    • 基于用户身份的身份验证阻止请求。

    • 记录和审核 - 跟踪 Web 应用程序的用户。

    • 图像转换-缩放贴图等。

    • 数据压缩——使下载更小。

    • 本地化 - 将请求和响应定位到特定语言环境。

    • XML 内容的 XSL/T 转换 - 将 Web 应用程序响应定位到不止一种类型的客户端。

    阅读官方文档http://www.oracle.com/technetwork/java/filters-137243.html

    【讨论】:

    • 这种情况下如何使用Filter?请给我一个这种情况的例子。
    • 谢谢,@Nikhil,非常讨人喜欢 :)
    【解决方案3】:

    它是否再次从服务器加载页面?然后你需要检查你的用户识别和会话代码。其他答案中已经给出了一些提示。

    如果页面在浏览器的缓存中,那么您很不走运,浏览器可以再次显示它。毕竟是本地文档。

    但有一些可能的解决方法(如果您的用户和会话识别有效)。

    • 将 HTTP 标头设置为过期、缓存控制,以便建议浏览器每次都重新加载页面。取决于浏览器的行为方式。
    • 全部使用 JavaScript,即构建单页 Web 应用程序,从而完全删除后退按钮功能。有时是一种有效的方法,但不是每次都有效。当使用应该可以通过唯一 URL 访问的资源时,它不是。
    • 在注销和新页面之间进行重定向(如redirect-after-post),因此单击后退按钮将引导用户进入重定向页面并立即再次进入您将用户发送到之后的页面注销。
    • 在每个页面上使用一些 Ajax 来检查用户是否仍然登录;如果没有,请重定向到登录页面。

    【讨论】:

    • 很好的解释 +1 先生。
    【解决方案4】:

    这是这样做的:

    <script>
       history.forward();
    </script>
    

    在每个页面的&lt;head&gt; 部分添加它可以防止这个问题。

    【讨论】:

    • 如果有人在浏览器中禁用脚本并按下返回会怎样?不要依赖客户端 .trust 服务器。
    • 是的,你写的。这就是为什么我们需要过滤器链接它也可以工作。这是最好的过程。
    • 但也要保留这些行。这将提高效率:) 并祝项目顺利。
    猜你喜欢
    • 2018-04-02
    • 2019-09-12
    • 2017-05-07
    • 2022-11-20
    • 1970-01-01
    • 2018-07-08
    • 2022-10-23
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多