存在这样一种情况,有些人在浏览器中输入他们要访问来访问资源,这样我们就会考虑,用户是否登录,用户是否拥有权限。如果有则允许访问,如果没有就不让访问。
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步即可。它的原理类似于动态代理,以横切的形式贯穿整个程序即当我们发请求时拦截器就会起作用。
敬请关注《权限之缓存》。