首页 > 解决方案 > 如何实现 LogoutFilter?

问题描述

大家好,我正在使用 JSF 构建一个 Java Web 应用程序。对于身份验证,我使用了 Apache Shiro。我构建了一个注销按钮,该按钮调用 shiro 的注销方法,然后将用户重定向到登录页面。但是如果我点击后退按钮,用户可以导航到页面。我读到了这个,我意识到我必须实现我自己的自定义过滤器。这是过滤器的代码:

import al.ikubinfo.ipermit.bpmn.model.entities.UserEntity;
import al.ikubinfo.ipermit.bpmn.services.UserService;

public class LoginFilter implements Filter {

    private static final String LOGIN_VIEW = "/login.xhtml";

    @EJB
    private UserService userService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;

        UserEntity currentUser = userService.getCurrentUser();
        if (currentUser == null) {
            httpServletResponse.sendRedirect(httpServletRequest.getServletContext().getContextPath() + LOGIN_VIEW);
        }

        else {
            chain.doFilter(request, response);
        }

    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

}

我也将它包含在 web.xml 中,但它不起作用。应用程序启动成功,但没有打开任何视图。有人能帮助我吗?

标签: jsfservlet-filters

解决方案


使用后退按钮时,您会看到页面的缓存版本。该页面在浏览器中本地缓存。

注销后,您必须进入登录页面

在此页面上使用以下 javascript

var url = window.location.href;
window.history.go(-window.history.length);
window.location.href = url;

也尝试插入

<META Http-Equiv="Cache-Control" Content="no-cache">
<META Http-Equiv="Pragma" Content="no-cache">
<META Http-Equiv="Expires" Content="0">

进入jsp页面,以便浏览器不缓存页面。


推荐阅读