请求被Servlet过滤器拦截两次

时间:2016-08-31 10:29:18

标签: jsf servlets jsf-2 servlet-filters

我有一个使用JSF的项目。我写了一个过滤器,截取每个请求有两个目的:
1)出于安全原因,为每个请求更改会话ID 2)检查用户是否已登录,否则重定向到登录页面,再次出于安全原因,除非经过适当的身份验证,否则没有人看到"内部"页

我的LoginFilter的简单代码(当然我省略了会话ID更改和重定向部分以保持简单)

public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String reqUrl = ((HttpServletRequest) request).getRequestURL().toString();

        System.out.println("reqUrl : " + reqUrl);

        HttpSession session = ((HttpServletRequest)request).getSession();
        System.out.println("session obj : " + session);

        chain.doFilter(request, response);

        System.out.println("reqUrl AFTER :: " + reqUrl);
    }
}

当我登录时,对于登录屏幕之后接下来页面的网址,拦截请求,将调用一次Filter的doFilter方法。

由于我正在跟踪(System.out.println)通过过滤器的网址, 这就是我在控制台中获得的内容

reqUrl : http://localhost:8082/meqms/module/voting/mainframe.jsf
session obj : org.apache.catalina.session.StandardSessionFacade@396df0c7
reqUrl AFTER :: http://localhost:8082/meqms/module/voting/mainframe.jsf

但是,如果我现在刷新页面, 请求被截获两次。

和控制台获取新条目,如

reqUrl : http://localhost:8082/meqms/module/voting/mainframe.jsf
session obj : org.apache.catalina.session.StandardSessionFacade@396df0c7
reqUrl AFTER :: http://localhost:8082/meqms/module/voting/mainframe.jsf
reqUrl : http://localhost:8082/meqms/module/voting/mainframe.jsf
session obj : org.apache.catalina.session.StandardSessionFacade@396df0c7
BROKER_MSTR_BEAN
reqUrl AFTER :: http://localhost:8082/meqms/module/voting/mainframe.jsf

我不明白这里发生了什么。 但是我注意到的一件事是加载了资源,即mainframe.xhtml在页面加载时调用JSF bean方法 打印BROKER_MSTR_BEAN

这次打印是第二次拦截,而不是第一次。这让我相信页面mainframe.xhtml只会在第二个"拦截" (过滤器)。

如果是这样的话,为什么第一次打电话? 这里发生了什么事 。为什么资源会被请求两次(因此被过滤器拦截两次?)

===============编辑========================== 我们这里有2个mainframe.xhtml。一个包括另一个

主要的一个:

<ui:composition template="/WEB-INF/include/template/page-template.xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jstl/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:define name="page-content">
        <ui:param name="currentContentDescriptor"
            value="#{applicationController.currentContextDescriptor}" />
        <ui:decorate
            template="/WEB-INF/include/template/plain_container.xhtml">

            example template
            <ui:define name="example">
                <ui:include src="/WEB-INF/include/ksecurity_vote/mainframe.xhtml" />
            </ui:define>
        </ui:decorate>
    </ui:define>

</ui:composition>

包括的那个:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<h:form xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:mobi="http://www.icesoft.com/icefaces/mobile/component">


    <div style="visibility: hidden;">
        <h:outputText value="#{brokerMstr.onpageload}" />
    </div>
</h:form>

BrokerMstrBean.java

public class BrokerMstrBean extends GenericDaoImpl<BrokerMstr> implements java.io.Serializable {
    private String onpageload;

    public void setOnpageload(String onpageload) {
        this.onpageload = onpageload;
    }

    public String getOnpageload() {
        System.out.println("Brokermstrbean");
        HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        Object s = req.getParameter("status");
        if (s == null) {
            s = req.getAttribute("status1");
            System.out.println(" status " + s);
        }
        if (s != null) {
            if ((s.equals("0")) || (s.equals("1"))) {
                setValidation_popup(false);

            }
        }

        return onpageload;
    }

我对jsf不是很了解。这个项目是由其他人制作的。你能帮忙吗

0 个答案:

没有答案