- 浏览: 219115 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
julyboxer:
http://www.baobao5u.com/Product ...
喝茶的十八个层次,你属于哪一层? -
xiaolong0211:
呵呵,学习了,这两天一直在装gcc,可算装上了,谢谢
Red Hat enterprise 5 gcc安装顺序 -
run_xiao:
翻译的不是很到位啊
推荐引擎mahout相关资料 -
julyboxer:
关键价值链
B2C网络站点资源梳理 -
julyboxer:
要买的书http://product.dangdang.com ...
B2C网络站点资源梳理
角色受限采访URL。
由于JSF的流程在Servlet Filter之后, 所以不能使用Filter的层面获取到JSF的一些请求路径信息,即javax.faces.context.FacesContext.getCurrentInstance()应该是空的。
这里可以使用javax.faces.event.PhaseListener来获取请求和输出路径信息。在face-config.xml配置好即可获取到请求和输出的页面路径。例如,用户当前处于公用页面A.jsf, 现在按链接想跳转到B.jsf; JSF首先会恢复A.jsf的视图,这时PhaseListener,验证合法就输出视图到B.jsf, 这时又会来到PhaseListener 恢复视图B.jsf, 可以将鉴权的代码添加到或BeforeParse, AfterParse方法里。
ParseListener对h:outputLink或CommandLink是应该是可行的,因为只是对链接进行限制。 如果对于CommandButton可能是不行的,例如A.jsf 点击按钮action="#{bBean.bAction}",
public String bAction() ...{
//能够进入到方法内部,如果这里是很多逻辑操作,数据操作的话。。。。
return "B_JSF";
//只有在return之后ParseListener才能限制鉴权,那就晚了。而链接就不同,因为它没什么逻辑操作。
}
这种鉴权就要用到下面提到的第二种方法。
package web;
import java.io.IOException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** *//**
* @author zealvampire
* @version 1.0 2006-10-17
*/
public class SecurityPhaseListener implements PhaseListener ...{
private static final long serialVersionUID = 6186106530012195240L;
private static final Log log = LogFactory.getLog(SecurityPhaseListener.class);
/**//* (non-Javadoc)
* @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
*/
public void afterPhase(PhaseEvent event) ...{
PhaseId phaseId = event.getPhaseId();
if (phaseId == PhaseId.RESTORE_VIEW || phaseId == PhaseId.INVOKE_APPLICATION) ...{
FacesContext currentContext = FacesContext.getCurrentInstance();
String viewId= currentContext.getViewRoot().getViewId();
//ViewId 就是我们需要的路径,类似URL
}
/**//* (non-Javadoc)
* @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
*/
public void beforePhase(PhaseEvent event) ...{
}
/** *//**
* (non-Javadoc)
* @see javax.faces.event.PhaseListener#getPhaseId()
*/
public PhaseId getPhaseId() ...{
return PhaseId.ANY_PHASE;
}
}
face-config.xml
<faces-config>
<lifecycle>
<phase-listener>
web.SecurityPhaseListener
</phase-listener>
</lifecycle>
</face-config>
2. 扑获JSF中用户要执行的Action
例子,用户在A.jsf点击CommandButton action="#{bBean.bAction}" 要是我们能在这个动作执行之前扑获到它并进行鉴权的话, 那就Sofu了。
这个我是看Myfaces源码以及看face-config.xml格式看到的, 里面有个ActionListener, 猜猜是什么东西? 是的,就像写Swing一样,用来处理消息和动作的。先看看Myfaces的默认实现。
/**//*
* Copyright 2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.myfaces.application;
import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.application.NavigationHandler;
import javax.faces.component.ActionSource;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.MethodBinding;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** *//**
* @author Manfred Geiler (latest modification by $Author: mbr $)
* @author Anton Koinov
* @version $Revision: 231425 $ $Date: 2005-08-11 07:49:45 -0400 (Thu, 11 Aug 2005) $
*/
public class ActionListenerImpl
implements ActionListener
...{
private static final Log log = LogFactory.getLog(ActionListenerImpl.class);
public void processAction(ActionEvent actionEvent) throws AbortProcessingException
...{
FacesContext facesContext = FacesContext.getCurrentInstance();
Application application = facesContext.getApplication();
ActionSource actionSource = (ActionSource)actionEvent.getComponent();
MethodBinding methodBinding = actionSource.getAction();
String fromAction;
String outcome;
if (methodBinding == null)
...{
fromAction = null;
outcome = null;
}
else
...{
fromAction = methodBinding.getExpressionString();
try
...{
outcome = (String) methodBinding.invoke(facesContext, null);
}
catch (EvaluationException e)
...{
Throwable cause = e.getCause();
if (cause != null && cause instanceof AbortProcessingException)
...{
throw (AbortProcessingException)cause;
}
else
...{
throw new FacesException("Error calling action method of component with id " + actionEvent.getComponent().getClientId(facesContext), e);
}
}
catch (RuntimeException e)
...{
throw new FacesException("Error calling action method of component with id " + actionEvent.getComponent().getClientId(facesContext), e);
}
}
NavigationHandler navigationHandler = application.getNavigationHandler();
navigationHandler.handleNavigation(facesContext,
fromAction,
outcome);
//Render Response if needed
facesContext.renderResponse();
}
}
看到fromAction = methodBinding.getExpressionString();这个你就偷笑了吧,那确实,这个就是我们要的bBean.bAction 模仿这个类重新写一个类吧,。然后在face-config.xml配置一下。
<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
<action-listener>OurOwnActionListenerImpl</action-listener>
</application>
ActionListener是一个接口,我想在其他JSF的实现,应该也是通过的吧。
由于JSF的流程在Servlet Filter之后, 所以不能使用Filter的层面获取到JSF的一些请求路径信息,即javax.faces.context.FacesContext.getCurrentInstance()应该是空的。
这里可以使用javax.faces.event.PhaseListener来获取请求和输出路径信息。在face-config.xml配置好即可获取到请求和输出的页面路径。例如,用户当前处于公用页面A.jsf, 现在按链接想跳转到B.jsf; JSF首先会恢复A.jsf的视图,这时PhaseListener,验证合法就输出视图到B.jsf, 这时又会来到PhaseListener 恢复视图B.jsf, 可以将鉴权的代码添加到或BeforeParse, AfterParse方法里。
ParseListener对h:outputLink或CommandLink是应该是可行的,因为只是对链接进行限制。 如果对于CommandButton可能是不行的,例如A.jsf 点击按钮action="#{bBean.bAction}",
public String bAction() ...{
//能够进入到方法内部,如果这里是很多逻辑操作,数据操作的话。。。。
return "B_JSF";
//只有在return之后ParseListener才能限制鉴权,那就晚了。而链接就不同,因为它没什么逻辑操作。
}
这种鉴权就要用到下面提到的第二种方法。
package web;
import java.io.IOException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** *//**
* @author zealvampire
* @version 1.0 2006-10-17
*/
public class SecurityPhaseListener implements PhaseListener ...{
private static final long serialVersionUID = 6186106530012195240L;
private static final Log log = LogFactory.getLog(SecurityPhaseListener.class);
/**//* (non-Javadoc)
* @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
*/
public void afterPhase(PhaseEvent event) ...{
PhaseId phaseId = event.getPhaseId();
if (phaseId == PhaseId.RESTORE_VIEW || phaseId == PhaseId.INVOKE_APPLICATION) ...{
FacesContext currentContext = FacesContext.getCurrentInstance();
String viewId= currentContext.getViewRoot().getViewId();
//ViewId 就是我们需要的路径,类似URL
}
/**//* (non-Javadoc)
* @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
*/
public void beforePhase(PhaseEvent event) ...{
}
/** *//**
* (non-Javadoc)
* @see javax.faces.event.PhaseListener#getPhaseId()
*/
public PhaseId getPhaseId() ...{
return PhaseId.ANY_PHASE;
}
}
face-config.xml
<faces-config>
<lifecycle>
<phase-listener>
web.SecurityPhaseListener
</phase-listener>
</lifecycle>
</face-config>
2. 扑获JSF中用户要执行的Action
例子,用户在A.jsf点击CommandButton action="#{bBean.bAction}" 要是我们能在这个动作执行之前扑获到它并进行鉴权的话, 那就Sofu了。
这个我是看Myfaces源码以及看face-config.xml格式看到的, 里面有个ActionListener, 猜猜是什么东西? 是的,就像写Swing一样,用来处理消息和动作的。先看看Myfaces的默认实现。
/**//*
* Copyright 2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.myfaces.application;
import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.application.NavigationHandler;
import javax.faces.component.ActionSource;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.MethodBinding;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** *//**
* @author Manfred Geiler (latest modification by $Author: mbr $)
* @author Anton Koinov
* @version $Revision: 231425 $ $Date: 2005-08-11 07:49:45 -0400 (Thu, 11 Aug 2005) $
*/
public class ActionListenerImpl
implements ActionListener
...{
private static final Log log = LogFactory.getLog(ActionListenerImpl.class);
public void processAction(ActionEvent actionEvent) throws AbortProcessingException
...{
FacesContext facesContext = FacesContext.getCurrentInstance();
Application application = facesContext.getApplication();
ActionSource actionSource = (ActionSource)actionEvent.getComponent();
MethodBinding methodBinding = actionSource.getAction();
String fromAction;
String outcome;
if (methodBinding == null)
...{
fromAction = null;
outcome = null;
}
else
...{
fromAction = methodBinding.getExpressionString();
try
...{
outcome = (String) methodBinding.invoke(facesContext, null);
}
catch (EvaluationException e)
...{
Throwable cause = e.getCause();
if (cause != null && cause instanceof AbortProcessingException)
...{
throw (AbortProcessingException)cause;
}
else
...{
throw new FacesException("Error calling action method of component with id " + actionEvent.getComponent().getClientId(facesContext), e);
}
}
catch (RuntimeException e)
...{
throw new FacesException("Error calling action method of component with id " + actionEvent.getComponent().getClientId(facesContext), e);
}
}
NavigationHandler navigationHandler = application.getNavigationHandler();
navigationHandler.handleNavigation(facesContext,
fromAction,
outcome);
//Render Response if needed
facesContext.renderResponse();
}
}
看到fromAction = methodBinding.getExpressionString();这个你就偷笑了吧,那确实,这个就是我们要的bBean.bAction 模仿这个类重新写一个类吧,。然后在face-config.xml配置一下。
<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
<action-listener>OurOwnActionListenerImpl</action-listener>
</application>
ActionListener是一个接口,我想在其他JSF的实现,应该也是通过的吧。
发表评论
-
网页设计步骤
2010-04-20 15:37 909第1章 用户体验为什么如此重要 日常生活中的遭遇 什么 ... -
Unix的5种I/O模型
2009-03-30 16:00 30561、阻塞I/O 2、非阻塞I/O ... -
使用异步 I/O 大大提高应用程序的性能
2009-03-30 15:21 1171http://www.ibm.com/developerwor ... -
WSAD环境下JMS异步通信全攻略
2009-03-18 12:03 740http://tech.ccidnet.com/art/981 ... -
java线程的缺陷
2009-03-14 21:59 1181Java 编程语言的线程模型可能是此语言中最薄弱的部分。它完 ... -
Java NIO类库Selector机制解析
2009-03-02 11:45 1840Java NIO 类库 Selector ... -
Java远程通讯可选技术及原理
2009-02-23 11:07 929在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的, ... -
ConcurrentHashMap原理分析
2009-02-14 13:38 2092集 合是编程中最常用 ... -
AOP 的利器:ASM 3.0 介绍
2009-02-13 14:05 11762007 年 7 月 25 日 随着 AOP(Aspec ... -
JVM小记2
2009-01-17 16:03 928JVM执行引擎: 方法 ... -
JVM小记
2009-01-08 15:33 982JVM内存分布 方法区:包 ... -
socket, nio socket 及nio socket框架MINA总结
2008-12-21 15:03 3161最近花了点时间研究了一下nio,及其开源框架MINA,现把心得 ... -
大型网站架构分析收集
2008-11-26 22:17 2044. PlentyOfFish 网站架构学习 http://ww ... -
java深度clone
2008-11-14 14:47 1288public Object deepClone() ... -
20081107总结
2008-11-08 17:03 847今天是一个特别的 ... -
JAVA中的指针,引用及对象的clone
2008-09-04 19:22 818Java语言的一个优点就是取消了指针的概念,但也导致了许多程序 ... -
weblogic 9 远程调试
2008-07-11 17:22 1351在startWebLogic.cmd中加入 set JAVA_ ... -
JVM调优总结
2008-07-09 19:55 1143http://pengjiaheng.spaces.live. ... -
JFreeChart增强JSP报表的用户体验 (精品 )
2008-05-27 22:17 1019http://tech.it168.com/j/2007-09 ... -
Java是传值还是传引用
2008-05-27 10:09 9261. 简单类型是按值传递的 Java 方法的参数是简单类 ...
相关推荐
创建一个名为`login.xhtml`的文件,用HTML和JSF组件来设计登录表单。例如: ```html 用户名:" /> 密码:" /> 登录" action="#{loginBean.login}" /> ``` - 这里使用了`<h:inputText>`和`...
4. **权限管理**:EJB处理角色和权限分配,JSF界面展示和修改权限。 5. **报表生成**:EJB计算统计信息,JSF展示图表或导出报表。 ### 优化与扩展 1. **安全性**:利用Java EE的安全机制,如JAAS(Java ...
8. **安全性**:包括输入验证、权限管理、安全编程实践等,以防止潜在的安全漏洞。 9. **可靠性**:规范可能包含关于容错设计、故障恢复和冗余策略的指导,以确保系统的高可用性。 10. **维护性**:提倡代码的清晰...
通过这样的整合,开发者可以构建出一个健壮、可扩展且易于维护的Web应用程序,利用JSF的组件模型,Spring的强大功能,Hibernate的数据管理,PrimeFaces的UI设计,以及Spring Security的安全保障,为企业级应用开发...
6. **设计JSF界面**:使用JSF的UI组件创建用户界面,将这些组件的数据绑定到Managed Bean的属性,从而实现数据的双向绑定。例如,使用`h:inputText`显示和编辑数据库记录,`h:commandButton`触发CRUD操作。 7. **...
3. **Struts框架**: Struts是基于MVC设计模式的Web应用框架,主要用于控制应用程序的流程。它通过Action类来处理用户的请求,并决定接下来的视图。在JSF+SSH集成中,Struts通常用作连接JSF和Spring的桥梁,处理HTTP...
JavaScript Faces (JSF) 是Java平台上的一种用于构建用户界面的模型-视图-控制器(MVC)框架,专为创建企业级Web应用程序而设计。这个"一个jsf企业级程序示例"旨在向开发者展示如何有效地利用JSF来构建高效、可维护...
总结起来,"jsf增删改查带oracle数据库"是一个典型的Web开发应用场景,涉及到JSF框架的UI设计、数据绑定、事件处理,以及Oracle数据库的JDBC操作、SQL命令编写和MVC架构的应用。通过学习和实践这一主题,开发者可以...
虽然它没有实现分页,但对于初学者来说,理解这个例子可以帮助他们更好地掌握JSF的UI设计、Managed Bean的使用以及通过Hibernate进行数据库操作的基本流程。对于进一步的学习,开发者可以尝试添加更多复杂的功能,如...
通过Spring的AOP,可以方便地进行日志记录、权限验证等横切关注点的处理。 **Hibernate** Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,让开发者可以用面向对象的方式处理数据库事务。...
2. **表单设计**:创建一个HTML或JSF表单,包含一个`<input type="file">`元素,允许用户选择要上传的文件。例如: ```html ``` 这里使用了PrimeFaces的`<p:fileUpload>`组件,它简化了文件上传的处理。 3. *...
5. **系统架构**:《图书管理系统》采用MVC(Model-View-Controller)设计模式,模型层由iBatis处理数据库操作,视图层由JSF和ajax4jsf共同构建,控制器层则由Spring管理,这种架构保证了系统的可维护性、可扩展性和...
- 权限管理:根据用户角色设置不同的访问权限,如读、写、执行等。 总结来说,这个"JSF+primefaces 网盘实现代码前端"项目将利用JSF的强大力量,结合PrimeFaces的丰富组件,以及HTML、CSS和JavaScript的基础技术,...
开发者可能会在其中学习到如何配置和使用这些框架,如何设计和实现业务逻辑,以及如何处理并发和安全性等问题。项目可能包含以下组件: 1. **前端界面**:由JSF组件构成,处理用户输入,展示商品信息,实现购物车和...
8. **MVC模式在JSF中的实现**:解释JSF如何符合MVC设计模式,以及如何分离视图、模型和控制器。 9. **性能优化**:可能包括了JSF的缓存机制、EJB的懒加载策略、以及Spring的缓存支持等提高系统性能的方法。 10. **...
该文件通常包含软件的许可证信息,详细说明了JSF Facelets 1.1.9的使用权限和限制。阅读此文件可以帮助开发者了解软件的授权条款,确保合法合规地使用该技术。 总的来说,JSF Facelets 1.1.9作为JSF生态系统的一...
- **安全性和授权**:探讨如何保护JSF应用免受攻击并实现用户权限管理。 #### 四、案例分析 为了更好地理解和应用JSF的技术要点,本书还提供了多个实际案例,例如: - **登录表单**:构建一个包含用户名和密码...
3. **关机功能**:虽然不常见,但在特定场景下,JSF可以用来创建一个能够发送系统关机命令的Web应用,但这通常需要服务器端的特殊权限和API支持。 **四、源码分析** 提供的压缩包文件`mann_srcs.part06.rar`、`mann...
1. **用户认证与授权**: 网银系统必须具备强大的用户身份验证和权限管理功能,确保用户的安全登录和操作权限控制。 2. **账户管理**: 包括账户信息展示、余额查询、交易记录查看等。 3. **转账与支付**: 用户可以...
- 通过配置 Spring Security 过滤器,可以拦截并处理用户的登录请求,同时在 JSF 页面上展示相应的权限控制。 5. **AOP 在 JSF 中的应用**: - Spring 的 AOP 功能可以在 JSF Managed Bean 的方法调用前后添加切...