struts2中的拦截器问题

大多数的web端项目都会用到"权限"这个东西,首先要明白权限是捆绑在角色上的,也就是对应关系,权限:角色=n:1.

既然需要有权限的地方,那么拦截器自然不可以缺少了。

1.拦截器的配置文件(struts.xml):

<package name="manage" namespace="/" extends="default">
	<!--管理员 -->
<interceptors>
        <interceptor name="admininter" class="cn.yitongworld.util.AdminInteceptor"></interceptor>	        <interceptor-stack name="admininterstack">
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<interceptor-ref name="admininter"></interceptor-ref>
			</interceptor-stack> 
		</interceptors>
	<!-- 配置默认拦截器栈-->
<default-interceptor-ref name="admininterstack"/>
	 <global-results>
		<result name="login" type="chain">preLogin</result>
		<result name="optresult_success">/WEB-INF/manage/operationresult_success.jsp</result>
		<result name="optresult_error">/WEB-INF/manage/operationresult_error.jsp</result>
		</global-results>
	<!-- 上传图片 -->
<action name="fileUpload" class="cn.yitongworld.action.FileUploadAction"></action>
</package>

2.java代码(类):

@ParentPackage("manage")
@Namespace("/")
@Controller
public class ManBillAction extends BaseAction<Bill> {

	代码省略.........

}

3.java代码(拦截器)

@SuppressWarnings("serial")
public class AdminInteceptor extends AbstractInterceptor {
	@Override
	public String intercept(ActionInvocation invocation){
	//获取当前用户信息
	Map<String, Object> session = ActionContext.getContext().getSession();
	//获得当前请求的对象(好像就是一个地址)
	HttpServletRequest request = ServletActionContext.getRequest();
	     //判断用户是否存在
	     if(session.get(Const.SESS_USER)!=null){
	    	 try {    //转换称用户对象
		    	 User user=(User) session.get(Const.SESS_USER);
		    	 //判断用户是不是管理员
		    	 if(user.getId()==null||!user.getType().equals(UserType.ADMINUSER)){
		    	 
		    	 		return Action.LOGIN;
		    	 	}
		    	 //判断用户是不是超级管理员
		    	 if(user.getId().toString().equals(Cache.getSetting(Const.SUPERADINID).getValue())){                  //如果是超级管理员,继续调用下面的action或者是result       
		    	 return invocation.invoke();
		    	 	}
		    	 //判断用户的权限和角色是否为空
		    	 if(MyString.isEmpty(user.getAuthority())&&MyString.isEmpty(user.getRole())){
		    	 		request.setAttribute("tipMessage","抱歉,权限不够!");
		    	 		return Action.ERROR;
		    	 	}
		    	 //从当前请求的对象中得到url
		    	 String url=request.getRequestURI();
		    	 //从url中截取出action
			 String action =url.substring(url.lastIndexOf("/")+1);
			 //判断是否含有权限
		    	 if(hasAuth(invocation, user.getAuthority(), action))
		    	        //如果有权限继续走原先的action
		    	 	return invocation.invoke();
		    	 //判断所在角色是否含有权限
		    	 if(!MyString.isEmpty(user.getRole()))
		    	         //角色有多个权限
		    	         for(String role:user.getRole().split(",")){
		    	             //role其实就是角色中的任意一个权限
		    	 	    if(hasAuth(invocation, StaticDataCache.getStaticdata(role).getValue(), action))                               //如果有权限继续走原先的action
				    	    return invocation.invoke();
		    	 		}
		    	 	request.setAttribute("tipMessage","抱歉,权限不够!");
	    	 		return Action.ERROR;
				} catch (Exception e) {
					e.printStackTrace();
					return "500"; 
				}
	     }else{
	    	 request.setAttribute("tipMessage","未登陆,请先登陆!");
	    	 //跳转至拦截页面
	    	 if(!request.getRequestURI().contains("login"))
	    		 session.put("returnUrl", getReturnUrl(request));
	    	 return Action.LOGIN;  
		}

	}
	private boolean hasAuth(ActionInvocation invocation, String authority, String action){
		if(!MyString.isEmpty(authority)){
			for(String auth:authority.split(","))
			{
				if(MyString.isEmpty(auth)){
					continue;
				}
				try{
					Staticdata sd = StaticDataCache.getStaticdata(auth.trim());
					if(sd.getValue()==null)
						continue;
					if(sd.getValue().equals(action))
						return true;
				}catch(Exception e){
					e.printStackTrace();
					continue;
				}
			}
		}
		return false;
	}
	private String getReturnUrl(HttpServletRequest request){
		Map<String, String[]> map=request.getParameterMap();
		StringBuffer temp=new StringBuffer(request.getRequestURI()+"?");
		Iterator<Entry<String, String[]>> iter = map.entrySet().iterator();
		while (iter.hasNext()) {
		   Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) iter.next();
		   for(String val:entry.getValue()){
			   temp.append(entry.getKey()+"="+val+"&");
		   }
		}
		String value=temp.toString();
		if(value.endsWith("&")){
			value=value.substring(0, value.length()-1);
		}
		return temp.toString();
	}

}

程序应该是这样走的,当用户点击相应的url的时候,会直接进入action中,但是在action中出现了以下2个注解

@ParentPackage("manage")
@Namespace("/")

你是不是想问这个是什么呢?看完拦截器的配置你就懂了,是对应的(此拦截器配置在了进入action之前)

<package name="manage" namespace="/" extends="default">

所以说还没有加载页面数据的时候,程序看到类的注释会先去配置文件中找到相应的Interceptor

<interceptor name="admininter" class="cn.yitongworld.util.AdminInteceptor"></interceptor>

根据Interceptor的引用找到相应的类进行拦截,直到遇见

return invocation.invoke();

说明拦截成功,此时程序会怎么样执行呢?也是最难的一点对于我这个菜鸟来说。一般来说都是调用一个方法得到一个结果,那拦截器是不是这个道理呢?当然啦!说明拦截成功了!只有拦截成功才可以运行下面的"程序",这个"程序"指的就是加拦截器注释的类。大概程序运行过程是这样的:2->1->3->2

总结:struts2的Interceptor其实有n种方式去拦截,我这里是在程序执行之前进行的拦截(用户没有权限直接不去执行下面的action),你也可以在加载页面数据之后进行CRUD的拦截。根据具体情况而定了。

时间: 2024-12-09 19:05:55

struts2中的拦截器问题的相关文章

struts2中的拦截器

一  AOP思想: 面向切面编程的思想 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,这实际

好记性不如烂笔头49-javaWeb框架struts2中的拦截器(4)

1. Struts2的拦截器概述 Struts2拦截器是在访问某个Action或Action的某个方法之前拦截,或者在运行之后处理.Struts2拦截器是可插拔的,拦截器是AOP(Aspect Oriented Programming,面向切面编程)的一种实现 Struts2的拦截器栈(InterceptorStack)就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用. Struts2规定用户自定义拦截器必须实现com

struts2 中 paramsPrepareParamsStack 拦截器

struts2二次参数拦截器内容: 规定了请求的执行顺序 在struts2中,其拦截器为框架精华部分,而二次参数拦截器paramsPrepareParamsStack  对于解决数据回显,对象修改属性丢失的问题悠着很良好的处理机制. 在 struts-default.xml 中的默认拦截器配置中有以下部分(可自行查找源码,通常为:struts-2.5.2\src\core\src\main\resources): <interceptor-stack name="paramsPrepare

Debug查看Struts2中ExceptionMappingInterceptor拦截器怎么把ExceptionHolder放入值栈中,以及理解拦截器的工作原理。。。

1.小案例代码: jsp界面: <body> <s:property value="exceptionStack"/><br> <s:property value="exception"/><br> <s:property value="exception.getMessage"/> <form action="product-details.action&q

Struts2中的拦截器详解

拦截器是什么 拦截器是一种可以在让用户在Action执行之前和Result执行之后进行一些功能处理的机制. 拦截器在action执行之前和result执行之后的顺序是相反的,可以看下图: 也就是说执行的顺序是:Interceptor1-Interceptor2-Interceptor3-Action-Result–Interceptor3--Interceptor2--Interceptor1 拦截器的优点 下边是书上总结的优点,贴几张图,还是比自己写来得快. 拦截器有什么 在我们使用Actio

关于struts2的自定义拦截器和struts2的详细流程

1.其实我们大家平常都会用struts2用的很多,但是有的时候我们并不是真正的了解struts2的运行机制,下面给大家分享一下struts2的运行流程.MVC框架 解释如下: 1.  所有请求被Struts2核心控制器StrutsPreparaedAndExecuteFilter拦截 2.根据ActionMapper提供的信息决定如何进行下一步 3.ActionMapper主要依赖Struts2的配置文件struts.xml 4.接下来为每个Action创建Action代理类ActionProx

(转)关于struts2的自定义拦截器和struts2的详细流程

转自 http://www.94cto.com/index/Article/content/id/63218.html.话说,写的真不错. 1.其实我们大家平常都会用struts2用的很多,但是有的时候我们并不是真正的了解struts2的运行机制,下面给大家分享一下struts2的运行流程.MVC框架 解释如下: 1. 所有请求被Struts2核心控制器StrutsPreparaedAndExecuteFilter拦截 2.根据ActionMapper提供的信息决定如何进行下一步 3.Actio

java struts2入门学习---拦截器学习

转发: https://www.cnblogs.com/amosli/p/3521872.html 一.拦截器,拦截器栈 1.拦截器的作用 拦截器本质上和servlet的过滤器是一样的.在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦截器. 2.拦截器执行顺序 在struts.xml文件中,<intercepto-ref/>中先引用的先执行,后引用的后执行.如果某个拦截器出错或不允许通过,那么下一个拦截器是不允许执行的. 需要拦

struts2入门之拦截器

1.拦截器的执行时间:在action对象创建之后,在具体的方法执行之前: 2.拦截器底层实现原理:用到AOP思想和责任链模式:AOP:面向切面编程,通俗的讲就是当某个功能模块要增加某一项功能时,尽可能不去修改源代码而是通过其他的方式来达到相同的效果,比如通过配置文件等方式:责任链模式和过滤链模式有点相似,过滤链模式是指比如,一个请求由多个过滤器进行过滤,每个过滤器进行放行之后才能到下一个过滤器,最后实现目的:但是责任链模式,比如要执行多个操作,有添加,修改,删除三个操作,首先执行添加操作,添加操