`
pipe
  • 浏览: 206976 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

webwork简单的权限拦截器

阅读更多
在这里,我们通过一个简单的例子来演示如何用Interceptor来验证权限。
我们假设你的程序中已经写好了每个用户的权限,如A用户的权限是InsertUser.action,,,,或者更多,一个权限字符串。
在xwork.xml配置Interceptor,配置InsertUser.action.
OK !
下面是验证步骤:
1.用户访问InsertUser.action,触发Interceptor
2.在Interceptor中我们需要获取HttpSession来取得当前用户,查询当前用户具有的权限String.将它转换为String[],
3.获取当前用户访问的url :通过HttpServletRequest来获取url ,再处理以后的url为xxx.action.
4.判断该url是否与当前用户权限String[]中某一个String 一致。
5.一致 就继续执行该Action,否则就return "error";

好 ,下面是Interceptor的代码
public class SecurityInterceptor implements Interceptor {

	
	private static final long serialVersionUID = 1L;

	private Logger log = Logger.getLogger(this.getClass());

	public void destroy() {
		log.info(">>>>>>>>>>>>>>>>>>>>>>>结束拦截器!!!!<<<<<<<<<<<<<<<<<<<<<");
	}

	public void init() {
		log.info(">>>>>>>>>>>>>>>>>>>>>>>开始初始化拦截器!!!!<<<<<<<<<<<<<<<<<<<<<");
	}

	public String intercept(ActionInvocation invocation) throws Exception {
		String strFullPath = ServletActionContext.getServletContext()
				.getRealPath("/");
		strFullPath = strFullPath + "WEB-INF//applicationContext.xml";
		ApplicationContext ac = new FileSystemXmlApplicationContext(strFullPath);
		
		SecurityDAOImpl security = (SecurityDAOImpl) ac.getBean("securityDAO");
		// Bean容器中无法配置Interceptor,所以SecurityDAOImpl中无法获得SessionFactory 必须读取配置文件
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		UserInfo user = (UserInfo) session.getAttribute("UserLoginInfo");// 获取session中存放的用户信息
		boolean flag = false;
		if (user != null) {
			log
					.info(">>>>>>>>>>>>>>>>>>>>>>>当前用户" + user.getUserName()
							+ " 进入" + invocation.getAction()
							+ ",开始操作!!!!!<<<<<<<<<<<<<<<<<<<<");
			log
					.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>判断当前用户权限开始<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!!!!!");

			String url = "";			
			url = Constant.ChangeUrl.getUrl(request.getRequestURL().toString());
			List list = null;
			if (url != null) {
				list = security.getSecurityByUser(user);// 获取用户权限 如1,2,3,4				
				if (list != null) {
					if (list.size() > 0 && list.get(0) != null) {
						String[] str = ((String) list.get(0)).split(";");// 获得用户权限数组为数字字符串
						String[] strTemp = null;
						for (int i = 0; i < str.length; i++) {
							if (str[i] != null && str[i] != "") {
								strTemp = Constant.SecurityList
										.getNameBySecurity(
												Integer.parseInt(str[i]))
										.split(",");// 这里是分割每个权限字符串
								if (strTemp != null) {
									for (int j = 0; j < strTemp.length; j++) {
										//就只有这1句是来验证url是否相等
										if (url.equalsIgnoreCase(strTemp[j])) {
											flag = true;
											break;
										}
									}
								}

							}
						}
					}
				}
			}
		} else {
			log.info("您尚未登录或者登录失效!,请重新登录");
			request.setAttribute("noLogin", "noLogin");
		}
		if (flag) {
			log
					.info(">>>>>>>>>>>>>>>>>>验证成功,你有访问权限!!!!开始操作!!!<<<<<<<<<<<<<<<<<<<<<");
			return invocation.invoke();

		} else {
			log.info(">>>>>>>>>>>>>>>>>>您没有访问权限!!<<<<<<<<<<<<<<<<<<<<<");
			return "error";
		}

	}

}


中间部分都是查询数据库中用户权限,再进行分割。只有最后2句是最重要的
return invocation.invoke(); 这里指继续执行action
return "error"; 直接跳转到错误页面。

OK! 现在我们来看看 xwork.xml的配置。

<xwork>
	<include file="webwork-default.xml"></include>
	<package name="default" extends="webwork-default">



		<interceptors>
			<interceptor name="params"
				class="com.opensymphony.xwork.interceptor.ParametersInterceptor" />
			<interceptor name="SecurityInterceptor"
				class="com.xxx.xxx.SecurityInterceptor" />
			<interceptor name="logger"
				class="com.opensymphony.xwork.interceptor.LoggingInterceptor" />
			<interceptor-stack name="testStack">
				<interceptor-ref name="SecurityInterceptor" />
				<interceptor-ref name="params" />
				<interceptor-ref name="logger" />
			</interceptor-stack>

		</interceptors>
<global-results>
			<result name="login" type="dispatcher">
				<param name="location">/login.jsp</param>
			</result>
			<result name="error" type="dispatcher">
				<param name="location">/error.jsp</param>
			</result>
		</global-results>		
<action name="InsertUser.action" class="xxx"
			method="xxx">
			<result name="success">/user/addSecurityGroup.jsp</result>
			<interceptor-ref name="testStack"></interceptor-ref>
		</action>


这里也用了webwork自带的Interceptor ,其中params是必须的,由于采用了Interceptor,可能你提交给Action的参数也拦截掉了,无法获得到参数,而params可以将参数带给Action.
logger是做日志的,在Action进入之前和结束以后均会写一条日志,如:before xxx action , after xxx action.


分享到:
评论
2 楼 pipe 2007-11-28  
String strFullPath = ServletActionContext.getServletContext()      
               .getRealPath("/");      
       strFullPath = strFullPath + "WEB-INF//applicationContext.xml";      
       ApplicationContext ac = new FileSystemXmlApplicationContext(strFullPath);      
             
       SecurityDAOImpl security = (SecurityDAOImpl) ac.getBean("securityDAO");      
 

这部分程序可以去掉了!因为现在Interceptor交给bean管理了,另外在Interceptor中增加代码:
private ISecurityDAO dao ;   
    public ISecurityDAO getDao() {   
        return dao;   
    }   
  
    public void setDao(ISecurityDAO dao) {   
        this.dao = dao;   
    }  


这样每次去调用Interceptor的时候 ,都可以直接使用dao.getSecurityByUser(user);了。
1 楼 pipe 2007-11-27  
更正一下:
将Interceptor交给spring来管理,避免每次去读applicationContext.xml引起内存溢出。
在applicationContext.xml中加入:
<bean id="securityInterceptor" class="com.xxx.aop.SecurityInterceptor" scope="prototype">  
        <property name="dao">  
            <ref bean ="securityDAO"/>  
        </property>  
           
    </bean>  

然后更改一下 xwork.xml中Interceptor配置
<interceptor name="SecurityInterceptor"  
                class="securityInterceptor" />  

OK了!

相关推荐

    webwork 权限拦截器

    WebWork权限拦截器是WebWork框架中的一个重要组件,主要用于实现基于拦截器(interceptor)的权限控制。在Web开发中,权限拦截器扮演着至关重要的角色,它可以在用户请求到达控制器之前进行预处理,判断用户是否有权...

    webwork拦截器,验证,以及帮助文档

    在WebWork中,拦截器是处理请求的关键组件,它们在动作执行前后执行特定的任务,如日志记录、权限检查、数据转换等。拦截器通过在ActionInvocation链中插入逻辑,使得开发者可以灵活地扩展应用程序的行为,而无需...

    J2EE(Struts_拦截器)

    可以使用`&lt;interceptors&gt;`标签定义拦截器栈,然后使用`&lt;interceptor&gt;`标签声明具体的拦截器,最后在`&lt;action&gt;`标签中通过`&lt;interceptor-ref&gt;`指定拦截器的使用。 例如: ```xml ...

    java拦截器

    - **代码复用**:通过将常用的功能(如日志记录、权限检查等)封装在拦截器中,可以显著提高代码的复用性。 - **易于维护**:将横切关注点(Cross-cutting Concerns)从业务逻辑中分离出来,使得业务逻辑更加清晰,...

    webwork源码底层实现

    4. **Interceptors(拦截器)**:WebWork引入了拦截器的概念,它们在Action执行前后执行,可以实现通用的功能,如权限检查、日志记录等。在源码中,你会看到这些拦截器的实现。 5. **Value Stack(值栈)**:...

    WebWork2配置

    4. **拦截器**:WebWork2通过拦截器链来增强Action的执行过程,例如,权限检查、日志记录、事务管理等。在webwork.xml中,你可以创建自定义的拦截器并将其添加到默认的拦截器栈中。 5. **结果类型配置**:WebWork2...

    WebWork2.0讲解说明

    3. Interceptors(拦截器):拦截器是WebWork2.0的一个强大功能,允许在Action调用前后插入自定义逻辑,如权限验证、日志记录等。 二、WebWork2.0主要特性 1. 智能表单绑定:WebWork2.0支持自动将HTTP请求参数绑定...

    webwork中文文档

    **拦截器**:拦截器在Action执行前后执行,可以用于实现诸如权限检查、日志记录、数据验证等功能。 #### 4. **结果类型**:WebWork支持多种结果类型,如dispatcher、redirect、stream等,用于控制请求的处理流程和...

    webwork

    3. **拦截器(Interceptors)**:WebWork 使用拦截器来执行一些预处理或后处理任务,如权限验证、日志记录等。拦截器可以在Action执行前后插入自定义逻辑,增强了系统功能的灵活性。 4. **异常处理**:WebWork 提供...

    WebWork docs 2 -- webWork 详细的说明文档

    4. **拦截器(Interceptors)**:拦截器允许在Action执行前后插入额外的功能,如日志记录、事务管理、权限检查等。学习如何编写和配置拦截器能提高代码的复用性和可维护性。 5. **结果(Results)**:Results定义了...

    webwork.pdf

    拦截器可以在Action执行前后进行预处理或后处理,比如权限检查、日志记录、事务管理等。这种机制使得开发者可以轻松地在不修改Action代码的情况下,添加新的功能或修改现有行为,大大提高了代码的复用性和可维护性。...

    webwork 简单例子

    此外,WebWork的拦截器(Interceptor)机制非常强大,可以实现事务管理、权限检查、日志记录等功能。在webworkPratice中,你可能会遇到一些预定义的拦截器或者自定义的拦截器,通过分析它们的工作原理,可以加深对...

    WebWork文档(PDF)

    拦截器可以用于日志记录、权限检查、事务管理等多种用途,大大增强了框架的灵活性。 4. **Ognl(Object-Graph Navigation Language)** WebWork使用Ognl作为表达式语言,用于在Action和视图之间绑定数据,以及在...

    webwork简单例子

    WebWork的核心概念包括Action、Interceptors(拦截器)、ValueStack(值栈)和OGNL(Object-Graph Navigation Language)。Action是处理用户请求的业务逻辑,而Interceptor则允许在Action执行前后进行额外的操作,如...

    webWork2开发指南

    3. **Interceptors(拦截器)**:WebWork2引入了拦截器的概念,它们在Action执行前后执行,可以用于日志记录、事务管理、权限验证等。拦截器的使用使得代码更易于组织和复用。 4. **动态方法调用(Dynamic Method ...

    webwork的api

    拦截器可以用于权限检查、日志记录、事务管理等多种场景。 5. **ValueStack**:ValueStack是WebWork的一个重要特性,它是一个存储Action上下文数据的数据结构。ValueStack允许开发者将数据放入栈中,然后在JSP或...

    webWork

    2. Interceptors(拦截器):在Action执行前后运行的组件,用于实现通用的业务逻辑,如权限检查、日志记录等。拦截器链可以灵活配置,提供了强大的扩展能力。 3. XWork:WebWork的底层框架,负责对象管理、依赖注入...

    webwork2开发指南

    1. 动作拦截器(Interceptors):拦截器可以对动作执行前后的流程进行增强,如权限检查、日志记录等。通过配置,可以灵活地组合和应用拦截器。 2. 数据验证(Validation):WebWork2提供了强大的数据验证机制,可以...

    webwork中文参考手册

    3. **拦截器(Interceptor)**:类似于AOP(面向切面编程),WebWork允许开发者定义拦截器来处理共性任务,如日志记录、事务管理、权限检查等,这些任务可以在动作执行前后自动进行。 4. **强大的表单处理**:...

Global site tag (gtag.js) - Google Analytics