Interceptor问题

andying 发布于 2014/10/09 10:59
阅读 291
收藏 0

@JFinal 你好,想跟你请教个问题:

              我现在有一需求,想做一个Controll级的Interceptor(实现不同页面的权限控控制),需在Interceptor中传递参数,以检查不同的页面不同的权限,因为不同的页面权限检测语句是一样的,只是参数不同而已,看了Jinal中的Interceptor例子,好像不能这样:

@Before(DemoInterceptor.class) // Controller
public class HelloController extends Controller {

}

请问怎样才能实现以上需求呢?

加载中
0
JFinal
JFinal

    在拦截器中通过 ai.getActionKey() 或者 ai.getControllerKey() 可以得到当前请求的是什么 action 和 controller,可以事先将 actionKey 或 controllerKey 所有拥的权限在数据库中存放好,在拦截器中通过 controllerKey 或 controllerKey 以及当前用户所拥有的权限来做控制。

    JFinal.me().getAllActionKeys() 可以获取所有的 actionKey,可以事先将它们全部写入库中,记得写前先判断是否已经存在

0
JFinal
JFinal

   非得要传递参数,可以通过自定义注解,例如 @Auth("admin"),然后拦截器中这样用:

public void intercept(ActionInvocation ai) {
  Auth auth = ai.getController.getAnnotation(Auth.class);
  String value = auth.getValue();
  // 在此判断
  if (checkRight(value))
    ai.invoke();
  else
    ai.getController().render("no_right.html");
}



0
andying
andying

其实在intercept中可以传以参数即可(userId,model, popedom),我就可以调自一个自定方法了,如下:

Tools.getPopedom(userId,model, popedom);

小弟菜鸟,自定义注解没弄过,能举个例子吗?

0
JFinal
JFinal

引用来自“andying”的评论

其实在intercept中可以传以参数即可(userId,model, popedom),我就可以调自一个自定方法了,如下:

Tools.getPopedom(userId,model, popedom);

小弟菜鸟,自定义注解没弄过,能举个例子吗?

    这样可否:

public void intercept(ActionInvocation ai) {
  Controller c = ai.getController();
  userId = c.getPara("userId");
  // 或者 userId 从 session 中获取
  ......
}



andying
andying
还有这2个参数呢(model, popedom),开始我也这样考虑过,但 model,popedom这2个参数如何传入session呢?这个拦截器是要在访问action之前触发的,触发之前能把这2个参数值写入session?
0
andying
andying

引用来自“JFinal”的评论

   非得要传递参数,可以通过自定义注解,例如 @Auth("admin"),然后拦截器中这样用:

public void intercept(ActionInvocation ai) {
  Auth auth = ai.getController.getAnnotation(Auth.class);
  String value = auth.getValue();
  // 在此判断
  if (checkRight(value))
    ai.invoke();
  else
    ai.getController().render("no_right.html");
}



ai.getController.getAnnotation(Auth.class);
这句报错,提示没有此方法getAnnotation
0
andying
andying

自已慢慢摸着石头过河,终于搞定了,注解也不难.

说下思路:

1.先自定义一个注解Popedom:

2.再建一个自定义Intercept(PopedomIntercept)

3.最后在Controll中引用即可,如下.

@Popedom(usrid="aaa",model="SalesOrder",oper="open")
@Before(PepodomInterceptor.class)
public class AdminControll  extends Controller {

....

....

 }

在此,还是要谢谢@JFinal的耐心解答,给我提了个醒,用注解.

 

0
andying
andying

引用来自“andying”的评论

自已慢慢摸着石头过河,终于搞定了,注解也不难.

说下思路:

1.先自定义一个注解Popedom:

2.再建一个自定义Intercept(PopedomIntercept)

3.最后在Controll中引用即可,如下.

@Popedom(usrid="aaa",model="SalesOrder",oper="open")
@Before(PepodomInterceptor.class)
public class AdminControll  extends Controller {

....

....

 }

在此,还是要谢谢@JFinal的耐心解答,给我提了个醒,用注解.

 

请问@Jfinal :

@Popedom(usrid="aaa",model="SalesOrder",oper="lopen")

怎么我这个注解只能放在Controll层,如果放到Method层级就报错:

@Popedom(usrid="aaa",model="SalesOrder",oper="lopen")
 @Before(PepodomInterceptor.class)
 public void list(){

...
...
}

我的PepodomInterceptor如下:

public class PepodomInterceptor implements Interceptor {


		Popedom pm= ai.getController().getClass().getAnnotation(Popedom.class);
		System.out.println(pm);      //如果注解@Popedom(usrid="aaa",model="SalesOrder",oper="open")放在Method上,这里pm是空值,为何?
		UserVO userVO =ai.getController().getSessionAttr("user");
		String usrid=pm.usrid();
		String model=pm.model();
		String oper=pm.oper();
		if(MyTools.getPopedom( usrid,model,oper)){
		     ai.invoke();
		}else{
			
			 ai.getController().render("/showmsg.jsp"); 
		}
	}
}

 

0
JFinal
JFinal

引用来自“andying”的评论

自已慢慢摸着石头过河,终于搞定了,注解也不难.

说下思路:

1.先自定义一个注解Popedom:

2.再建一个自定义Intercept(PopedomIntercept)

3.最后在Controll中引用即可,如下.

@Popedom(usrid="aaa",model="SalesOrder",oper="open")
@Before(PepodomInterceptor.class)
public class AdminControll  extends Controller {

....

....

 }

在此,还是要谢谢@JFinal的耐心解答,给我提了个醒,用注解.

 

引用来自“andying”的评论

请问@Jfinal :

@Popedom(usrid="aaa",model="SalesOrder",oper="lopen")

怎么我这个注解只能放在Controll层,如果放到Method层级就报错:

@Popedom(usrid="aaa",model="SalesOrder",oper="lopen")
 @Before(PepodomInterceptor.class)
 public void list(){

...
...
}

我的PepodomInterceptor如下:

public class PepodomInterceptor implements Interceptor {


		Popedom pm= ai.getController().getClass().getAnnotation(Popedom.class);
		System.out.println(pm);      //如果注解@Popedom(usrid="aaa",model="SalesOrder",oper="open")放在Method上,这里pm是空值,为何?
		UserVO userVO =ai.getController().getSessionAttr("user");
		String usrid=pm.usrid();
		String model=pm.model();
		String oper=pm.oper();
		if(MyTools.getPopedom( usrid,model,oper)){
		     ai.invoke();
		}else{
			
			 ai.getController().render("/showmsg.jsp"); 
		}
	}
}

 

拦截器是针对 controller 来设计的,只有用于拦截 action
0
andying
andying

引用来自“andying”的评论

自已慢慢摸着石头过河,终于搞定了,注解也不难.

说下思路:

1.先自定义一个注解Popedom:

2.再建一个自定义Intercept(PopedomIntercept)

3.最后在Controll中引用即可,如下.

@Popedom(usrid="aaa",model="SalesOrder",oper="open")
@Before(PepodomInterceptor.class)
public class AdminControll  extends Controller {

....

....

 }

在此,还是要谢谢@JFinal的耐心解答,给我提了个醒,用注解.

 

引用来自“andying”的评论

请问@Jfinal :

@Popedom(usrid="aaa",model="SalesOrder",oper="lopen")

怎么我这个注解只能放在Controll层,如果放到Method层级就报错:

@Popedom(usrid="aaa",model="SalesOrder",oper="lopen")
 @Before(PepodomInterceptor.class)
 public void list(){

...
...
}

我的PepodomInterceptor如下:

public class PepodomInterceptor implements Interceptor {


		Popedom pm= ai.getController().getClass().getAnnotation(Popedom.class);
		System.out.println(pm);      //如果注解@Popedom(usrid="aaa",model="SalesOrder",oper="open")放在Method上,这里pm是空值,为何?
		UserVO userVO =ai.getController().getSessionAttr("user");
		String usrid=pm.usrid();
		String model=pm.model();
		String oper=pm.oper();
		if(MyTools.getPopedom( usrid,model,oper)){
		     ai.invoke();
		}else{
			
			 ai.getController().render("/showmsg.jsp"); 
		}
	}
}

 

引用来自“JFinal”的评论

拦截器是针对 controller 来设计的,只有用于拦截 action

我看demo案例,怎么都可以放在每个方法中呢?

@Before(BlogValidator.class)
	public void save() {
		getModel(Blog.class).save();
		redirect("/blog");
	}
	
	public void edit() {
		setAttr("blog", Blog.dao.findById(getParaToInt()));
	}
	
	@Before(BlogValidator.class)
	public void update() {
		getModel(Blog.class).update();
		redirect("/blog");
	}

 

 

返回顶部
顶部