Struts2通过自定义标签实现权限控制的方法
作者:陈夏明 发布时间:2021-07-19 11:06:22
近期在开发中遇到一种需求:根据用户的权限决定是否显示某操作按钮。
例如:若用户拥有删除数据的权限,则在界面中显示“删除”按钮;若用户无该权限,则界面中不显示相应按钮。
这样,就需要用到自定义标签了。
要定义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("<a href='" + formatURL(actionURL) + "' onClick='" + onclick + "'>" + value + "</a>");
} 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.struts2.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文件,其中有几个简单的属性。
<?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>oa</short-name>
<uri>/WEB-INF/OATag.tld</uri>
<tag>
<name>a</name>
<tag-class>qdgxy.tag.ATag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>actionURL</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>onclick</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
其中:
short-name:相当于前缀
uri:就是<%@taglib>中的uri
tag:一个标签
tag-class:标签类,就是我们的Tag类
body-content:标签体中能写的内容
attribute:属性
name:属性名
required:是否必须
rtexprvalue:是否支持表达式
TLD文件中的内容还有很多,更多内容可以Google一下就能获得,在此就不再赘述。
至此,我们就可以在JSP中使用自定义标签了。
使用的方式:
1. 引入标签库:<%@ taglib prefix="oa" uri="/WEB-INF/OATag.tld" %>
2. 使用标签:<oa:a actionURL="user_editUI?id=${id}" value="修改"/>
这样,在用户查看当前页面时,就能够根据用户的权限来选择是否显示操作按钮。
来源:http://blog.csdn.net/u012325167/article/details/51382350


猜你喜欢
- 背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生。需求:收到红包的时候进行
- 在编程过程中一定要注意代码命名的规范性,否则在使用和维护过程中将造成很大的麻烦,这也是一种良好的编码习惯。看下面代码,除了userPass命
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- Android 7.0调用相机崩溃解决办法 错误提示:android.os.FileUriExposedException: fi
- 由于我使用的是properties类型的配置文件,在对druid的参数进行配置的时候,多加了druid,也就是spring.datasour
- 获取最新插入数据的id原始方法读取最后一条的插入数据,但这样会造成如果两条数据同时插入,会并发出现错误SELECT * FROM admin
- 本文实例为大家分享了UnityShader3实现彩光效果展示的具体代码,供大家参考,具体内容如下参考链接: 【OpenGL】Shader实例
- 去年谷歌 I/O大会上介绍了一个非常厉害的新框架DataBinding, 数据绑定框架给我们带来了很大的方便,以前我们可能需要在每个Acti
- 参数传递即将参数传输到程序后台中,后台可能做一些处理,然后再将内容存入数据库之类嗒!参数传递的方法较多,一一说明如下。1、Action中直接
- 平时,我们将c#中的Distinct大多用于对数组去重,一般数组为基础的数据类型,例如 int,string.也可以用于对象去重,我们看看C
- Mybatis入门-基于配置实现单表的增删改查Mybatis简介官网链接:https://mybatis.org/mybatis-3/zh/
- 在使用SuperSocket来写服务器的过程中,这是一个非常快速的开发方式,也非常好用。不过学习的曲线有点高,在使用的过程中经常会遇到各种各
- Java获取文件的类型和扩展名实现代码:File file=new File("E:\\aa.jpg"); String
- 今天记录一下TextView的倒影效果,显示一串文字,然后在文字的下方显示出它的倒影,先上效果图:最重要的就是View中getDrawing
- 在我们日常开发过程中,通常会涉及到数据权限问题,下面以我们常见的一种场景举例:一个公司有很多部门,每个人所处的部门和角色也不同,所以数据权限
- 接口定义了一系列的行为规范,为类型定义一种Can-Do的功能。例如,实现IEnumerable接口定义了GetEnumerator方法,用于
- 以前使用HttpServletResponse可以通过输出流的方式来向前台输出图片。现在大部分都是使用springboot,在使用sprin
- 在nginx.conf文件的http模块新增以下内容gzip &nbs
- //while和for循环可以相互转换,以下为简单格式;for(1;2;3) A;//等价于
- 1.内容中含有xml预定好的实体,如“<”和“&”,对xml来说是禁止使用的,针对这种字符,解决方式是使用CDATA部件以&q