JSF缓存【转】
在用JSF 做系统view层时,有两个必须要解决的问题,就是缓存的控制和页面权限的判断,尤其是缓存问题,经常搞的我改了东西看不到效果,然后再找问题在哪,最后没招的时候,清空缓存,一切就ok,真tnnd。所以实现了JSF的PhaseListener接口,所有页面都设为no-cache,牺牲点速度,换取调整的时间,也算值了,反正客户都是在局域网中。
package com.ame.util; import java.util.Map; import javax.faces.application.NavigationHandler; import javax.faces.context.FacesContext; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import javax.faces.event.PhaseListener; import javax.servlet.http.HttpServletResponse; import com.ame.login.bean.LoginBean; /** * @author LinRuijun * @function JSF login capability judgment and cache-control */ @SuppressWarnings("serial") public class LoginCheck implements PhaseListener { public PhaseId getPhaseId() { return PhaseId.RESTORE_VIEW; } public void beforePhase(PhaseEvent phaseEvent) { FacesContext facesContext = phaseEvent.getFacesContext(); HttpServletResponse response = (HttpServletResponse)facesContext.getExternalContext().getResponse(); response.addHeader("Pragma", "no-cache"); response.addHeader("Cache-Control", "no-cache"); response.addHeader("Cache-Control", "no-store"); response.addHeader("Cache-Control", "must-revalidate"); } public void afterPhase(PhaseEvent event) { FacesContext fc = event.getFacesContext(); try{ String pageName = fc.getViewRoot().getViewId(); boolean loginPage = false; if(pageName.lastIndexOf("login")>-1){ loginPage = true; } if (!loginPage && !loggedIn()) { NavigationHandler nh = fc.getApplication().getNavigationHandler(); nh.handleNavigation(fc, null, "logout"); } }catch(Exception e){ e.printStackTrace(System.out); } } private boolean loggedIn() { Map<String, Object> session = FacesContext.getCurrentInstance().getExternalContext().getSessionMap(); if (session.get("loginBean") != null) { LoginBean login = (LoginBean)(session.get("loginBean")); return login.isLoginFlag(); }else{ return false; } } } 然后在JSF的Faces-config.xml 里配置一下 <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> <lifecycle> <phase-listener id="showPhaseListener"> com.ame.util.LoginCheck </phase-listener> </lifecycle> <navigation-rule> <from-view-id>*</from-view-id> <navigation-case> <from-outcome>logout</from-outcome> <to-view-id>/login.jsp</to-view-id> <redirect/> </navigation-case> </navigation-rule> </faces-config> okay ,一切搞定。 |