通过Struts2拦截器实现权限系统,网上有太多的例子.
这里记录的只是页面上某个连接能否显示的控制.
场景: 用户没有权限执行"修改记录"这个操作.那么,在页面中,"修改记录"这个链接也不应该出现
环境: Struts2.1.8 其实哪个版本无所谓
我的实际环境: Eclipse3.5 + jboss Tool + EJB3 +mysql5
步骤:
1. 在WEB-INF 下新建一个 tld文件,我这里命名是ems-tag.tld.内容拷贝自Struts-core.jar/meta-inf/目录下
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <description><![CDATA["带权限控制的标签 :继承了Struts2的页面标签, 用作权限组件的UI判定 ."]]></description> <display-name>"权限控制UI Tags"</display-name> <tlib-version>1.0</tlib-version> <short-name>ems</short-name> <uri>/ems2-tags</uri> <tag> <description><![CDATA[呈现一个 HTML href 元素 ]]></description> <name>a</name> <tag-class>cn.vs9.ems.web.tags.ui.AnchorTag</tag-class> <body-content>JSP</body-content> 以下若干代码略过,完全和Struts2的一样 .... </tag>
2. 继承标签类: org.apache.struts2.views.jsp.ui.AnchorTag
/** 重写的Struts2 Link标签
* <ems:a action="${ActionUrl}" >链接</ems:a>
*
* 标签作用,在执行url之前判定是否有"权限"在页面呈现 执行链接.
* "权限"依赖此用户组是否有权限执行此Action
*/
public class AnchorTag extends org.apache.struts2.views.jsp.ui.AnchorTag {
/**
* 是否通过授权.默认否
*/
private boolean isAccess = false ;
@Override
public int doEndTag() throws JspException {
System.out.println( " doEndTag " );
if ( ! isAccess){
return SKIP_BODY;
}
return super .doEndTag();
}
@Override
public int doStartTag() throws JspException {
System.out.println( this .action); // 根据url判断
// 这里替换成具体的权限判断
isAccess = true ;
if ( ! isAccess){
return SKIP_BODY;
}
return super .doStartTag();
}
}
3. 在页面试用
现在运行一下,试着切换标签类中的isAccess =true | false 看效果吧
其他标签也可以使用此方式进行.
目前我实现了a标签和action标签,项目基本就够用了
思路:
把页面分页为多个视图.
通过 <ems:action name="user_list" executeResult="true" namespace="/json"/> 的方式 .可以动态实现页面部件的组合
<% @ page language = " java " contentType = " text/html; charset=UTF-8 " pageEncoding = " UTF-8 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>
<% @ taglib prefix = " ems " uri = " /ems2-tags " %>
< ems : a action = " /data/user_update.action?entity.id=1 " > 修改用户 </ ems : a >