JSF 是基于事件驱动的
所以 下面 就 基于 在JSF阶段事件(生命周期事件)中控制页面的访问权限
<!--EndFragment-->
主要是 实现一个生命周期监听接口 javax.faces.event.PhaseListener
public class SecurityLifeListener implements PhaseListener{
public void afterPhase(PhaseEvent arg0) {
}
public void beforePhase(PhaseEvent event) {
//设置 ViewRoot
FacesContext fc = event.getFacesContext().getCurrentInstance();
UIViewRoot uiv = new UIViewRoot();
//根据实际情况 设置跳转页面
uiv.setViewId("/login.jsp");
fc.setViewRoot(uiv);
//或者直接根据你配置文件的导航 来设置
// logout 来自配置文件
NavigationHandler nh = fc.getApplication().getNavigationHandler();
nh.handleNavigation(fc, null, "logout");
//还可以使用 常用的HTTP对象
(HttpServletRequest) FacesContext.getCurrentInstance()
.getExternalContext().getRequest()
}
/**
* 参数说明 Restore_View:当(重新)访问JSP的时候,重建server端组件树。
*
* Apply_Request Value:将request parameters 复制到component submitted values。
*
* Process_Validators:执行验证。
*
* Update_Model Values:更新model数据:<h:inputText value="#{user.name}"/>
*
* Invoke_Application:调用应用程序:Action。
*
* Render_Response:渲染Response:保存状态并装载下一个视图。
*
*/
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
当然我们使用 javax.servlet.Filter 来进行访问权限控制 也行 ,但是没有比上面的方法来得更直接的了
我们通过上面的方法就明白 ,其实这个生命周期监听 和拦截器 很相似的 。它主要是控制某个生命周期的前后做什么处理
当然我们想让这个 监听响应的JSF生命周期的类生效 还需要下面的配置:
<lifecycle> <phase-listener id="securityListener"> com.SecurityLifeListener </phase-listener> </lifecycle>
下面说明它的优点:
不影响原有的业务逻辑代码的情况下,对页面进行权限控制;
集中处理页面权限,简单而高效。