Struts2通过自定义标签实现权限控制的方法
近期在开发中遇到一种需求:根据用户的权限决定是否显示某操作按钮。
例如:若用户拥有删除数据的权限,则在界面中显示“删除”按钮;若用户无该权限,则界面中不显示相应按钮。
这样,就需要用到自定义标签了。
要定义Struts2的自定义标签,只需三步:
1.定义一个Component类,并继承自org.apache.struts2.components.Component;
2.定义一个Tag类,并继承自importorg.apache.struts2.views.jsp.ComponentTagSupport;
3.在WEB-INF目录下创建相应的LTD文件
下面就来逐一实现:
step1:定义Component类
Component,顾名思义是“组件”。这其中封装了标签需要的处理逻辑。
我们定义的Component类需要继承org.apache.struts2.components.Component;。在父类中,有两个方法比较重要,分别是:start()方法和end()方法,这两个方法分别对应了开始标签和结束标签,我们可以通过这两个方法来对标签进行操作。
此外,若标签需要属性,则应该在本类中定义相应属性,并提供相应的get()和set()方法,用于封装这些属性。
然后,我们就可以对标签及属性进行处理了。
这里给出我的代码,实现的功能是:将当前每一个要显示的按钮的URL地址与用户所拥有的权限对应的URL比较,若用户有权限访问该URL,则显示按钮,否则将不显示任何内容。
packageqdgxy.tag; importcom.opensymphony.xwork2.util.ValueStack; importorg.apache.struts2.components.Component; importqdgxy.domain.User; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpSession; importjava.io.IOException; importjava.io.Writer; publicclassAComponentextendsComponent{ privateStringactionURL; privateStringvalue; privateStringonclick=""; privateHttpServletRequestrequest; @Override publicbooleanstart(Writerwriter){ HttpSessionsession=request.getSession(); Useruser=(User)session.getAttribute("user"); if(user.hasPrivilegeByURL(actionURL)){ try{ writer.write(""+value+""); }catch(IOExceptione){ e.printStackTrace(); } returntrue; }else{ returnsuper.start(writer); } } privateStringformatURL(Stringurl){ intindex=url.indexOf('?'); if(index!=-1){ Stringparams=url.substring(index); url=url.substring(0,index)+".action"+params; }else{ url=url+".action"; } returnurl; } publicAComponent(ValueStackstack,HttpServletRequestrequest){ super(stack); this.request=request; } publicStringgetActionURL(){ returnactionURL; } publicvoidsetActionURL(StringactionURL){ this.actionURL=actionURL; } publicStringgetValue(){ returnvalue; } publicvoidsetValue(Stringvalue){ this.value=value; } publicStringgetOnclick(){ returnonclick; } publicvoidsetOnclick(Stringonclick){ this.onclick=onclick; } }
step2:定义Tag类
Tag类,说白了就是我们所使用的标签。
创建Tag类,首先需要继承org.apache.struts2.views.jsp.ComponentTagSupport类。
然后,重写getBean()方法和populateParams()方法。
getBean()方法用于返回标签组件的实例,即我们step1中创建的组件。
populateParams()方法用于填充属性,即:将我们标签中的属性封装到标签类中。因此,我们在Tag类中也需要定义相应属性并提供get()和set()方法。
这样,我们就可以指定组件对标签进行处理。
可能有人会有疑问:为什么我们不将标签处理逻辑直接写在Tag类中,而是要单独定义一个Component类呢?
这是因为:Struts2支持多种表现层技术,使用Component可以对不同的表现层技术使用不同的处理方式,提高程序的可扩展性。
给出我的代码:
这段代码实现的功能是:使用step1中定义的组件对标签进行处理。
packageqdgxy.tag; importcom.opensymphony.xwork2.util.ValueStack; importorg.apache.struts2.components.Component; importorg.apache.struts2.views.jsp.ComponentTagSupport; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; publicclassATagextendsComponentTagSupport{ privateStringactionURL; privateStringvalue; privateStringonclick=""; @Override publicComponentgetBean(ValueStackvalueStack,HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse){ returnnewAComponent(valueStack,httpServletRequest); } @Override protectedvoidpopulateParams(){ AComponentcomponent=(AComponent)getComponent(); component.setActionURL(actionURL); component.setValue(value); component.setOnclick(onclick); } publicStringgetOnclick(){ returnonclick; } publicvoidsetOnclick(Stringonclick){ this.onclick=onclick; } publicStringgetActionURL(){ returnactionURL; } publicvoidsetActionURL(StringactionURL){ this.actionURL=actionURL; } publicStringgetValue(){ returnvalue; } publicvoidsetValue(Stringvalue){ this.value=value; } }
step3:在WEB-INF目录下创建TLD文件
TLD文件描述了标签的语法,如:标签有哪些属性,标签的属性是否支持表达式等内容。
我们在JSP中使用标签前,都需要引入相应的标签库,所以我们需要定义TLD文件,使JSP中能使用我们的自定义标签。
给出我定义的TLD文件,其中有几个简单的属性。
1.0 2.0 oa /WEB-INF/OATag.tld a qdgxy.tag.ATag scriptless actionURL true true value true true onclick false true
其中:
short-name:相当于前缀
uri:就是<%@taglib>中的uri
tag:一个标签
tag-class:标签类,就是我们的Tag类
body-content:标签体中能写的内容
attribute:属性
name:属性名
required:是否必须
rtexprvalue:是否支持表达式
TLD文件中的内容还有很多,更多内容可以Google一下就能获得,在此就不再赘述。
至此,我们就可以在JSP中使用自定义标签了。
使用的方式:
1.引入标签库:<%@taglibprefix="oa"uri="/WEB-INF/OATag.tld"%>
2.使用标签:
这样,在用户查看当前页面时,就能够根据用户的权限来选择是否显示操作按钮。
总结
以上就是本文有关Struts2通过自定义标签实现权限控制的方法的介绍,希望对大家有所帮助。感兴趣的朋友可以参阅:Struts和servlet不能共存问题解决方法 Struts2修改上传文件大小限制方法解析 struts2开发流程及详细配置等。有什么问题可以留言,小编会及时回复大家的。