`
gege_s
  • 浏览: 18753 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

基于struts2拦截器的权限管理之拦截器实现

 
阅读更多

这里共定义了三种拦截器,用于日志记录·过滤未登录用户·验证访问权限·作业时间拦截器:

 

1.日志记录。

package com.xx.power.web.intercept;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.ylsoft.invite.action.SaveException;
import com.ylsoft.power.domain.entity.AccessLog;
import com.ylsoft.power.domain.entity.User;
import com.ylsoft.power.domain.service.AccessLogService;
import com.ylsoft.power.openservice.AccessDenyException;
import com.ylsoft.power.openservice.LoginFailException;
import com.ylsoft.power.query.ajax.json.response.FailResponseBean;
import com.ylsoft.power.web.action.AbstractAction;
import com.ylsoft.power.web.action.ActionUtil;

public class AccessLogInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 3888019155867653546L;
	private AccessLogService accessLogService;//日志服务,记录refer,用户信息,访问地址,处理耗时,访问者ip,客户端信息
	public static final String ACTION_NAME = "ACTION_NAME";//访问地址在session中的位置

	public void setAccessLogService(AccessLogService accessLogService) {
		this.accessLogService = accessLogService;
	}
	/**
	 * 拦截处理
	 */
	public String intercept(ActionInvocation ai) throws Exception {
		System.out.println("begin request");
		String result = null;
		Exception ex = null;
		Long escape = System.currentTimeMillis();
		HttpServletRequest request = null;
		try {//捕捉所有异常,并进行异常记录
			logSetUp(ai);
			request = (HttpServletRequest) ai.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);
			HttpSession session = request.getSession();
			String url = request.getRequestURI();
			String actionName = this.getActionNameUrl(url);
			session.setAttribute(ACTION_NAME, actionName);//放置用户访问地址

			result = ai.invoke();

			escape = System.currentTimeMillis() - escape;
		} catch (LoginFailException e) {
			ActionSupport action = (ActionSupport) (ai.getAction());
			action.addActionError(e.getMessage());
			e.printStackTrace();
			ex = e;
			escape = System.currentTimeMillis() - escape;
		} catch (Exception e) {
			ex = e;
			escape = System.currentTimeMillis() - escape;
			e.printStackTrace();
		} finally {
			AccessLog accessLog = logSetUp(ai);
			accessLog.setElapsedTime(escape);//设置耗时
			if (ex != null) {
				accessLog.setDescript(StringUtils.substring(ex.getMessage(), 0,100));
				accessLog.setThrowEx(true);
			} else {
				accessLog.setThrowEx(false);
			}
			accessLogService.persistLog(accessLog);
			
			HttpServletResponse response = (HttpServletResponse) ai.getInvocationContext().get(
					ServletActionContext.HTTP_RESPONSE);
			String ajax = request.getHeader("x-requested-with");// 判断时同步请求还是异步请求
			// 为空代表同步的请求
			ActionSupport action = (ActionSupport) (ai.getAction());
			if (ex!=null) {
				
				if (StringUtils.isNotBlank(ajax)) {
					if (request.getParameter("r") != null) {
						ActionUtil.flushJsonMsg(response, new FailResponseBean("操作失败!"));
						return null;
					}else if (ex != null&&ex instanceof LoginFailException) {
						ActionUtil.flushJsonMsg(response, new FailResponseBean("xx"));
						return null;
					} 
				}else if(ex instanceof AccessDenyException){
					return "501";
				}else if (ex != null&&ex instanceof LoginFailException) {
					ActionUtil.flushMsg(response, "<script>window.top.location='"+request.getContextPath()+"/login!loginUI.action';</script>");
					return null;
				}
				if (ex instanceof SaveException) {
					SaveException saveException=(SaveException) ex;
					action.addActionError(saveException.getMessage());
					return saveException.getResult();
				}
			}
			//TODO 实现退回
			System.out.println("begin response");
			if (result==null) {
				if (ex!=null) {
					action.addActionError(ex.getMessage());
				}else {
					action.addActionError("服务器错误!");
				}
				result="500";
			}
		}
		return result;
	}
	/**
	 * 装配访问日志对象
	 * @param ai
	 * @return
	 */
	private AccessLog logSetUp(ActionInvocation ai) {
		AccessLog accessLog = new AccessLog();
		HttpServletRequest request = (HttpServletRequest) ai.getInvocationContext().get(
				ServletActionContext.HTTP_REQUEST);
		Map<String, Object> session =(Map<String, Object>) ai.getInvocationContext().get(ServletActionContext.SESSION);
		User user = (User) session.get(AbstractAction.LOGIN_USER_SESSION_KEY);
		String user_agent = request.getHeader("User-Agent");
		String userIp = request.getRemoteAddr();
		String url = request.getRequestURI();
		String reffer=request.getHeader("refer");
		accessLog.setReffer(StringUtils.substring(reffer, 0,90));
		accessLog.setUrl(this.getActionNameUrl(url));
		accessLog.setUser(user);
		if (user!=null) {
			accessLog.setUserId(user.getUserId());
		}
		accessLog.setUserIp(userIp);
		accessLog.setUserOs(user_agent != null ? user_agent.substring(0, user_agent.length() > 70 ? 70 : user_agent
				.length() - 1) : null);
		accessLog.setUsrBrowser(user_agent != null ? user_agent.substring(0, user_agent.length() > 70 ? 70 : user_agent
				.length() - 1) : null);
		accessLog.setLogDate(new Date());
		accessLog.setAction(null);
		return accessLog;
	}
	/**
	 * 得到用户访问地址xx!x.action形式
	 * @param url
	 * @return
	 */
	private String getActionNameUrl(String url) {
		String actionName = "";
		String[] str = url.split("/");
		if (str.length > 0) {
			actionName = str[str.length - 1];
		}
		if (actionName.indexOf("?") > 0) {
			actionName = actionName.substring(0, actionName.indexOf("?"));
		}
		return actionName;
	}

}

 

2.过滤未登录用户

 

/**
 * 验证是不是已登录用户
 */
package com.xx.power.web.intercept;

import java.util.Map;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.ylsoft.power.domain.entity.Action;
import com.ylsoft.power.domain.entity.Catalog;
import com.ylsoft.power.domain.entity.User;
import com.ylsoft.power.domain.service.ActionService;
import com.ylsoft.power.openservice.LoginFailException;
import com.ylsoft.power.web.action.AbstractAction;


public class ValidSessionInterceptor extends AbstractInterceptor{
	private static final long serialVersionUID = 6751070416682198400L;
	private ActionService actionService;//操作或动作指令服务
	/**
	 * 拦截并处理
	 */
	public String intercept(ActionInvocation ai) throws Exception {
		System.out.println("begin request");
		String result="";
		try {
			Map session=ai.getInvocationContext().getContext().getSession();
			if (session.get(AbstractAction.LOGIN_USER_SESSION_KEY)==null) {
				throw new LoginFailException(null,"请登录!");//抛出全局异常
			}else {
				//查看用户访问地址
				Action action=actionService.top0InUrl((String)session.get(AccessLogInterceptor.ACTION_NAME));
				String listViewType=null;//过滤类型
				Catalog catalog=null;	//访问对应的具体页面
				if (action!=null) {
					listViewType=action.getListViewType();
					catalog=action.getCatalog();
				}
				/**
				 * 通过threadlocal变量进行动态的参数传递,可以在用户当前请求线程中访问和设置
				 */
				ThreadLocalOperater.setAccessMessage(new AccessMessage((User)session.get(AbstractAction.LOGIN_USER_SESSION_KEY),listViewType,catalog));
				result=ai.invoke();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("begin response");
		return result;
	}
	public void init() {
		super.init();
		System.out.println("验证会话拦截器 init...");
	}
	public void destroy() {
		super.destroy();
		System.out.println("验证会话拦截器 destroy...");
	}
	public void setActionService(ActionService actionService) {
		this.actionService = actionService;
	}
}

 

3.·验证访问权限

 

/**
 * 身份验证
 */
package com.ylsoft.power.web.intercept;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.ylsoft.power.domain.entity.Catalog;
import com.ylsoft.power.domain.entity.User;
import com.ylsoft.power.openservice.AccessService;
import com.ylsoft.power.openservice.PowerBean;
import com.ylsoft.power.web.action.AbstractAction;

public class AuthenticateInterceptor extends AbstractInterceptor{

	private static final long serialVersionUID = 4422212767616230184L;
	public static final String MENUNAME="IS-A-MENU";//是不是导航菜单
	private AccessService accessService;//访问处理服务
	public void setAccessService(AccessService accessService) {
		this.accessService = accessService;
	}
	/**
	 * 拦截并处理
	 */
	public String intercept(ActionInvocation ai) throws Exception {
		authenRole(ai);
		return ai.invoke();
	}
	/**
	 * 核心方法 进行角色验证
	 * @param ai
	 * @return true
	 * @throws Exception
	 */
	private boolean authenRole(ActionInvocation ai) throws Exception{
		System.out.println(ai);
		HttpSession session=((HttpServletRequest)ai.getInvocationContext().get(ServletActionContext.HTTP_REQUEST)).getSession();
		HttpServletRequest request = (HttpServletRequest) ai.getInvocationContext().get(
				ServletActionContext.HTTP_REQUEST);
		String type="";
		if ("menu".equals(request.getParameter("t"))) {//规定 如果是菜单访问的参数会在后面加上一个标识
			type=MENUNAME;
		}
		//访问的判断都在下面的方法里面
		Catalog catalog=accessService.accessInUrl((String)session.getAttribute(AccessLogInterceptor.ACTION_NAME), (User)session.getAttribute(AbstractAction.LOGIN_USER_SESSION_KEY),type);
		PowerBean powerBean=new PowerBean(catalog);//权限bean 里面包含了用户当前请求页面的按钮和输入框,也就是表单的元素
		ai.getStack().set(PowerBean.name, powerBean);//放在值栈里用于标签读取
		return true;
	}
	
}
 

4.作业时间

 

这里是业务上一个内容,不在权限范围内。

分享到:
评论

相关推荐

    Struts2拦截器实现权限控制demo

    在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...

    Struts2拦截器及其用法详细说明

    总结,Struts2拦截器是其核心机制之一,它允许开发者以模块化的方式添加额外的功能,提高代码的可复用性和可维护性。通过自定义拦截器和合理配置,我们可以实现诸如日志记录、事务管理、权限验证等多种业务需求,...

    struts2拦截器实现权限控制

    在Struts2中,拦截器是基于AOP(面向切面编程)的概念设计的,它们在Action调用前后执行,可以添加额外的功能,如日志记录、事务管理、权限验证等。对于权限控制,拦截器可以在请求到达Action之前检查用户的登录状态...

    struts2 拦截器

    3. **权限验证**:拦截器可以实现用户登录检查,防止未授权的访问。 4. **数据校验**:在Action执行前,拦截器可以对输入数据进行校验,确保数据的合法性。 5. **业务逻辑增强**:如事务管理,可以在拦截器中进行...

    struts2 拦截器实例

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...

    struts2拦截器

    描述中提到的“基于struts2的拦截器测试,实现了页面的跳转,中间过程的拦截”,这表明我们可能在创建一个测试场景,来验证拦截器如何控制请求的流向以及如何在特定的业务逻辑点进行干预。页面跳转通常是拦截器完成...

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    struts2拦截器实现拦截不文明字迹

    拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...

    使用struts2拦截器对登陆权限验证

    在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合Servlet Filter进一步加强安全性。 首先,让我们理解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念设计的,它们...

    Struts2拦截器原理分析

    在文章"Struts2拦截器原理分析实例"中,作者通过一个具体的应用场景,展示了如何配置和使用拦截器来实现特定的功能,比如日志记录或权限验证。通过阅读这篇博客,我们可以更直观地理解拦截器的工作方式和价值。 ...

    Struts2拦截器源程序

    在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...

    struts2拦截器应用小例子

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在动作执行前后插入自定义的逻辑,如日志、权限检查、数据验证等。本示例将探讨如何在Struts2中使用拦截器。 首先,我们需要理解Struts2拦截器的...

    struts2 拦截器实现登录控制

    这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...

    Struts2拦截器源码

    首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...

    Struts2学习案例(拦截器)

    在Struts2中,拦截器是基于Java的动态AOP(面向切面编程)实现的,它可以在Action调用前后插入额外的逻辑,比如日志记录、权限验证、事务管理等。拦截器通过配置文件或者注解与Action关联,形成一个拦截器栈,每个...

    struts2实现拦截器、

    在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序形成一个拦截器链。当请求到达Action时,这些拦截器会按照顺序逐个执行其`intercept()`方法,最后调用实际的动作方法。拦截器可以独立于...

    浅谈Struts2拦截器的原理与实现.docx

    Struts2 拦截器是Struts2框架的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现对请求的预处理和后处理,从而增强应用程序的功能和控制流程。以下是对Struts2拦截器原理与实现的详细解析: ...

    struts2拦截器国际化

    Struts2的拦截器是一种AOP(面向切面编程)的概念,它在Action调用前后执行特定的逻辑,如日志记录、权限验证、数据校验等。拦截器通过配置在struts.xml或struts-plugin.xml文件中,按照定义的顺序进行调用。每个...

    运用struts2技术的拦截器实现的页面检测和用户注册

    通过上述方式,我们可以利用Struts2的拦截器机制有效地实现页面访问控制和用户注册功能,同时保持代码的清晰和模块化。在实际开发中,还可以结合其他拦截器,如性能监控、日志记录、事务管理等,进一步增强应用的...

    Java Struts 实现拦截器

    其中,拦截器(Interceptor)是Struts2中的一个关键特性,用于扩展框架的功能,实现诸如事务管理、权限控制、输入验证等功能。 #### Struts2的处理流程 1. **客户端请求**: 当客户端发起HTTP请求时,请求首先到达...

Global site tag (gtag.js) - Google Analytics