Struts2通过自定义标签实现权限控制的方法

网友投稿 323 2023-03-28


Struts2通过自定义标签实现权限控制的方法

近期在开发中遇到一种需求:根据用户的权限决定是否显示某操作按钮。

例如:若用户拥有删除数据的权限,则在界面中显示“删除”按钮;若用户无该权限,则界面中不显示相应按钮。

这样,就需要用到自定义标签了。

要定义Struts2的自定义标签,只需三步:

1.定义一个Component类,并继承自org.apache.struts2.components.Component;

2.定义一个Tag类,并继承自import org.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,则显示按钮,否则将不显示任何内容。

package qdgxy.tag;

import com.opensymphony.xwork2.util.ValueStack;

import org.apache.struts2.components.Component;

import qdgxy.domain.User;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import java.io.IOException;

import java.io.Writer;

public class AComponent extends Component {

private String actionURL;

private String value;

private String onclick = "";

private HttpServletRequest request;

@Override

public boolean start(Writer writer) {

HttpSession session = request.getSession();

User user = (User) session.getAttribute("user");

if (user.hasPrivilegeByURL(actionURL)) {

try {

writer.write("" + value + "");

} catch (IOException e) {

e.printStackTrace();

}

return true;

} else {

return super.start(writer);

}

}

private String formatURL(String url) {

int index = url.indexOf('?');

if (index != -1) {

String params = url.substring(index);

url = url.substring(0, index) + ".action" + params;

} else {

url = url + ".action";

}

return url;

}

public AComponent(ValueStack stack, HttpServletRequest request) {

super(stack);

this.request = request;

}

public String getActionURL() {

return actionURL;

}

public void setActionURL(String actionURL) {

this.actionURL = actionURL;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

public String getOnclick() {

return onclick;

}

public void setOnclick(String onclick) {

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中定义的组件对标签进行处理。

package qdgxy.tag;

import com.opensymphony.xwork2.util.ValueStack;

import org.apache.strutshttp://2.components.Component;

import org.apache.struts2.views.jsp.ComponentTagSupport;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ATag extends ComponentTagSupport {

private String actionURL;

private String value;

private String onclick = "";

@Override

public Component getBean(ValueStack valueStack, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {

return new AComponent(valueStack, httpServletRequest);

}

@Override

protected void populateParams() {

AComponent component = (AComponent) getComponent();

component.setActionURL(actionURL);

component.setValue(value);

component.setOnclick(onclick);

}

public String getOnclick() {

return onclick;

}

public void setOnclick(String onclick) {

this.onclick = onclick;

}

public String getActionURL() {

return actionURL;

}

public void setActionURL(String actionURL) {

this.actionURL = actionURL;

}

public String getValue() {

return value;

}

public void setValue(String value) {

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一下就能获得,在此就不再赘述。

至此,我们就可http://以在JSP中使用自定义标签了。

使用的方式:

1. 引入标签库:<%@ taglib prefix="oa" uri="/WEB-INF/OATag.tld" %>

2. 使用标签:

这样,在用户查看当前页面时,就能够根据用户的权限来选择是否显示操作按钮。

总结

以上就是本文有关Struts2通过自定义标签实现权限控制的方法的介绍,希望对大家有所帮助。感兴趣的朋友可以参阅:Struts和servlet不能共存问题解决方法  Struts2修改上传文件大小限制方法解析  struts2开发流程及详细配置等。有什么问题可以留言,会及时回复大家的。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:测试管理平台接口异常(接口测试报错)
下一篇:详解Java单元测试之JUnit篇
相关文章

 发表评论

暂时没有评论,来抢沙发吧~