本文章只讲述struts2拦截器在权限控制中的作用,对应权限系统的数据库设计不做讨论
为了实现细粒度的权限控制,需要对struts2中action的方法进行拦截,这里我们用到了annotation注解的方式。
在action的方法上面添加自定义注解,具体例子如下:
@Access(privilegeValue="RoleQuery")
public String list(){
//处理分页显示
}
上面的Access注解是自定义的,具体代码如下:
/**
* 权限注解
* 该注解添加到action的方法上
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Access {
/**
* 权限值(访问某个Action方法所需的权限)
*/
String privilegeValue();
}
接下来讲一讲struts2拦截器是如何对该方法进行拦截的
首先看看struts2配置文件中拦截器的配置
<!-- 把需要被拦截的action统一放在manager这个package下,不需要拦截的action(比如登录)放另外的package下 -->
<package name="manager" extends="struts-default">
<interceptors>
<!-- 权限拦截器 -->
<interceptor name="access" class="accessInterceptor"></interceptor>
<interceptor-stack name="my-default">
<interceptor-ref name="access"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="my-default"></default-interceptor-ref>
<global-results>
<result name="success">/WEB-INF/page/share/message.jsp</result>
<result name="login" type="redirectAction">login</result>
<result name="NoPrivilege">/WEB-INF/page/share/noPrivilege.jsp</result>
</global-results>
<action name="managerAction" class="managerAction">
<result name="list">/WEB-INF/page/privilege/manager/manager_list.jsp</result>
<result name="addUI">/WEB-INF/page/privilege/manager/manager_add.jsp</result>
<result name="authorizationUI">/WEB-INF/page/privilege/manager/authorization.jsp</result>
</action>
<action name="roleAction" class="roleAction">
<result name="list">/WEB-INF/page/privilege/role/role_list.jsp</result>
<result name="addUI">/WEB-INF/page/privilege/role/role_add.jsp</result>
<result name="updateUI">/WEB-INF/page/privilege/role/role_update.jsp</result>
</action>
</package>
再看一看accessInterceptor这个拦截的具体代码:
public class AccessInterceptor implements Interceptor {
public void init() {
}
public void destroy() {
}
public String intercept(ActionInvocation invocation) throws Exception {
Map session=ActionContext.getContext().getSession();
/**
* 获取用户信息
*/
Manager manager = (Manager) session.get("MANAGER");
/**
* 用户未登录直接返回登录页面
*/
if(manager==null){
return "login";
}
/**
* 获取用户的权限值,登录的时候就从数据库取出来保存到session中
*/
List<String> privilegeValues=(List<String>)session.get("PRIVILEGES");
/**
* 获取此次调用的方法名
*/
String method = invocation.getProxy().getMethod();
/**
* 获取所有已注解方法
*/
List<Method> methods = AnnotationUtils.findAnnotatedMethods(invocation
.getAction().getClass(), Access.class);
/**
* 迭代所有已注解方法
*/
for (Method m : methods) {
if (m.getName().equals(method)) {
/**
* 获取被调用方法的注解
*/
Access access = m.getAnnotation(Access.class);
String s = access.privilegeValue() ;
if (privilegeValues.contains(s)) {
return invocation.invoke();
}else{
return "NoPrivilege";
}
}
}
/**
* 没有对方法进行注解,不拦截此次请求
*/
return invocation.invoke();
}
}
用拦截器进行后台方法级的权限控制到这里就讲完了,下次再讲一讲关于前台对于html元素的权限拦截(基于自定义JSP标签)