我有一个使用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不是很了解。这个项目是由其他人制作的。你能帮忙吗