Struts2框架通过自定义标签实现权限控制是一种比较常用的方法。下面分为两步详细讲解如何实现:
第一步:自定义标签
- 首先需要定义一个标签处理类,这个类必须继承TagSupport类,实现其中的doStartTag方法
public class AuthTag extends TagSupport {
private String permission;
public void setPermission(String permission) {
this.permission = permission;
}
public int doStartTag() throws JspException {
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.isPermitted(permission)) {
return EVAL_BODY_INCLUDE;
}
return SKIP_BODY;
}
}
在标签处理类中,我们定义标签属性permission,表示当前标签所需要的权限。在doStartTag方法中,我们通过Shiro的Subject对象判断当前用户是否拥有该权限。如果有,我们返回EVAL_BODY_INCLUDE表示继续执行标签体内的内容,否则返回SKIP_BODY表示跳过标签体内的内容。
- 接着需要在struts.xml文件中声明自定义标签
<struts>
<bean type="com.xxx.AuthInterceptor" name="authInterceptor"/>
<interceptors>
<interceptor name="authInterceptor" class="com.xxx.AuthInterceptor"/>
</interceptors>
<global-allowed-methods>*</global-allowed-methods>
<constant name="struts.custom.i18n.resources" value="global"/>
<package name="default" extends="struts-default">
<interceptors>
<interceptor-ref name="authInterceptor"/>
</interceptors>
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>
<action name="user_list" class="com.xxx.action.UserAction">
<result>/WEB-INF/jsp/user/list.jsp</result>
</action>
</package>
</struts>
在struts.xml文件中,声明自定义标签的方式是通过声明拦截器来绑定标签处理类。在上面的代码中,我们声明了一个名为authInterceptor的拦截器,将其绑定到了default包中,并在该拦截器中声明了自定义标签的路径。
第二步:使用自定义标签
在JSP中使用自定义标签的方式如下:
<%@ taglib prefix="auth" uri="/tags/auth"%>
<auth:auth permission="user:list">
<a href="${pageContext.request.contextPath}/user/list.action">用户列表</a>
</auth:auth>
在这个例子中,我们使用了自定义标签<auth:auth>
,并传入了一个permission属性,其中user:list表示用户列表的权限。当当前用户拥有该权限时,标签体内的内容就会被执行,否则就会被跳过。
示例二:
<%@ taglib prefix="auth" uri="/tags/auth"%>
<auth:auth permission="user:save">
<input type="submit" value="保存"/>
</auth:auth>
在这个例子中,我们使用了自定义标签<auth:auth>
,并传入了一个permission属性,其中user:save表示保存用户的权限。当当前用户拥有该权限时,标签体内的内容就会被执行,否则就会被跳过。
通过上面这些步骤,我们就可以使用自定义标签来实现Struts2的权限控制了。注:这里使用了Shiro作为权限框架,需先将Shiro集成到Strtus2中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2通过自定义标签实现权限控制的方法 - Python技术站