您的位置:首页 > 其它

权限之路径拦截

2015-12-01 12:16 309 查看
存在这样一种情况,有些人在浏览器中输入他们要访问来访问资源,这样我们就会考虑,用户是否登录,用户是否拥有权限。如果有则允许访问,如果没有就不让访问。
1.定义拦截器

//权限拦截器
publicclass CheckPrivilegeInterceptor extends AbstractInterceptor {

@Override
publicString intercept(ActionInvocation invocation) throws Exception {
//                System.out.println("----->之前");
//                Stringresult=invocation.invoke();//代理的action
//                System.out.println("----->之后");
//                returnresult;

Useruser=(User) ActionContext.getContext().getSession().get("user");
StringnameSpace=invocation.getProxy().getNamespace();
StringactionName=invocation.getProxy().getActionName();
StringprivUrl=nameSpace+actionName;

if(user==null){//如果是登录页面是不拦截的
if(privUrl.startsWith("/user_login")){
returninvocation.invoke();
}else{
return"loginUI";
}
}else{
//检测是否有访问该资源的权限
if(user.hasPrivilegeByUrl(privUrl)){
//放行
returninvocation.invoke();
}else{
return"noPrivilegeError";
}

}

}
}


User:根据用户的访问路径去校验是否有权限

/**
* 根据路径用户查询权限
*/

publicboolean hasPrivilegeByUrl(String privUrl) {
//超级管理有所有的权限
if(isAdmin()) {
returntrue;
}

//>> 去掉后面的参数
intpos = privUrl.indexOf("?");
if(pos > -1) {
privUrl= privUrl.substring(0, pos);
}
//>> 去掉UI后缀
if(privUrl.endsWith("UI")) {
privUrl= privUrl.substring(0, privUrl.length() - 2);
}

//如果本URL不需要控制,则登录用户就可以使用
Collection<String>allPrivilegeUrls = (Collection<String>)ActionContext.getContext().getApplication().get("allPrivilegeUrls");
if(!allPrivilegeUrls.contains(privUrl)) {
returntrue;
}else {
//普通用户要判断是否含有这个权限
for(Role role : roles) {
for(Privilege priv : role.getPrivileges()) {
if(privUrl.equals(priv.getUrl())) {
returntrue;
}
}
}
returnfalse;
}
}


2.struts.xml配置拦截器

<!--权限拦截器 -->
<interceptors>
<interceptorname="checkPrivilege"
class="cn.itcast.oa.util.CheckPrivilegeInterceptor"></interceptor>
<interceptor-stackname="defaultStack">
<interceptor-refname="checkPrivilege" />
<interceptor-refname="defaultStack" />
</interceptor-stack>
</interceptors>


 
3.总结
拦截器的使用很简单,只需如上2步即可。它的原理类似于动态代理,以横切的形式贯穿整个程序即当我们发请求时拦截器就会起作用。
敬请关注《权限之缓存》。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: