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("<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="修改"/>

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

总结

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

(0)

相关推荐

  • JSP 开发之Struts2内建自定义拦截器

    JSP 开发之Struts2内建自定义拦截器 Struts2的自定义拦截器主要用于解析请求参数,将请求参数赋值给Action属性,执行数据校验,文件上传等等操作.当需要扩展Struts2的功能时,我们只需要提供相应的拦截器并将它配置到Struts2容器中即可:当我们不需要使用的时候,只需要取消它在Struts2容器中的配置就行了. 1>配置拦截器主要使用四个配置元素: :用于配置自定义拦截器 :用于引用拦截器或者拦截器栈 :用于配置自定义拦截器栈,一个拦截器栈由多个拦截器构成,也可以包含其他的拦

  • struts2自定义MVC框架

    本文实例为大家分享了struts2自定义MVC框架的方法,供大家参考,具体内容如下 自定义MVC: (首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发. 总结MVC特点如下: (1)数据的获取和显示分离 (2)控制器将不同的模型和视图组合在一起 (3)应用

  • 关于Struts2文件上传与自定义拦截器

    一.访问或添加request/session/application属性 public String scope() throws Exception{   ActionContext ctx = ActionContext.getContext();   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app   ctx.getSession().put("ses", &q

  • struts2自定义拦截器的示例代码

    题目:使用struts2自定义拦截器,完成用户登陆才能访问权限的实现 在session中存放user变量表示用户登陆,若user为空则用户没有登陆,反之登陆 显示提示信息(请先登录) 定义拦截器 在struts.xml中定义拦截器使用标签<Intercaptors>.<Intercapter>. <interceptors> <interceptor name="test" class="Intercaptor.Intercaptor

  • Struts2 自定义下拉框Tag标签

    自定义标签主要包括三个步骤: 1.编写java类,继承TagSupport类: 2.创建tld文件,影射标签名和标签的java类: 3.jsp页面引入tld. 例子:自定义下拉框标签 如果页面上有下拉选择框,通常最好的解决方法是使用数据字典,因为有可能多个页面 使用同一个下拉框,便于后台统一维护. 自定义Tag类 import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.

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

    近期在开发中遇到一种需求:根据用户的权限决定是否显示某操作按钮. 例如:若用户拥有删除数据的权限,则在界面中显示"删除"按钮:若用户无该权限,则界面中不显示相应按钮. 这样,就需要用到自定义标签了. 要定义Struts2的自定义标签,只需三步: 1.定义一个Component类,并继承自org.apache.struts2.components.Component; 2.定义一个Tag类,并继承自import org.apache.struts2.views.jsp.Component

  • Spring Boot 通过AOP和自定义注解实现权限控制的方法

    本文介绍了Spring Boot 通过AOP和自定义注解实现权限控制,分享给大家,具体如下: 源码:https://github.com/yulc-coding/java-note/tree/master/aop 思路 自定义权限注解 在需要验证的接口上加上注解,并设置具体权限值 数据库权限表中加入对应接口需要的权限 用户登录时,获取当前用户的所有权限列表放入Redis缓存中 定义AOP,将切入点设置为自定义的权限 AOP中获取接口注解的权限值,和Redis中的数据校验用户是否存在该权限,如果R

  • yii权限控制的方法(三种方法)

    本文实例讲述了yii权限控制的方法.分享给大家供大家参考,具体如下: 这里摘录以下3种: 1. 通过accessControl: public function filters() { return array( 'accessControl', // perform access control for CRUD operations ); } /** * Specifies the access control rules. * This method is used by the 'acc

  • java中自定义Spring Security权限控制管理示例(实战篇)

    背景描述 项目中需要做细粒的权限控制,细微至url + httpmethod (满足restful,例如: https://.../xxx/users/1, 某些角色只能查看(HTTP GET), 而无权进行增改删(POST, PUT, DELETE)). 表设计 为避嫌,只列出要用到的关键字段,其余敬请自行脑补. 1.admin_user 管理员用户表, 关键字段( id, role_id ). 2.t_role 角色表, 关键字段( id, privilege_id ). 3.t_privi

  • Django web自定义通用权限控制实现方法

    需求:web系统有包含以下5个url,分别对于不同资源: 1.stu/add_stu/ 2.stu/upload_homework/ 3.stu/query_homework/ 4.stu/add_record/ -------------------------------------------------------------------------------------------------------- 学生可以访问:2,3 老师可以访问:1,4 可以通过基于角色对用户权限进行控

  • Spring MVC整合Shiro权限控制的方法

    Apache Shiro 是一个功能强大且灵活的开放源代码安全框架,可以细粒度地处理认证 (Authentication),授权 (Authorization),会话 (Session) 管理和加密 (cryptography) 等企业级应用中常见的安全控制流程. Apache Shiro 的首要目标是易于使用和理解. 有时候安全性的流程控制会非常复杂,对开发人员来说是件很头疼的事情,但并不一定如此. 框架就应该尽可能地掩盖复杂性,并公开一个简洁而直观的 API,从而简化开发人员的工作,确保其应

  • Vue中实现权限控制的方法示例

    一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 1.接口访问的权限控制 2.页面的权限控制 菜单中的页面是否能被访问 页面中的按钮(增.删.改)的权限控制是否显示 下面我们就看一看是如何实现这些个权限控制的. 二.接口访问的权限控制 接口权限就是对用户的校验.正常来说,在用户登录时服务器需要给前台返回一个Token,然后在以后前台每次调用接口时都需要带上这个Token,然后服务端获取到这个Token后进行比对,如果通过

  • vue中如何实现后台管理系统的权限控制的方法步骤

    一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单中的页面是否能被访问 页面中的按钮(增.删.改)的权限控制是否显示 下面我们就看一看是如何实现这些个权限控制的. 二.接口访问的权限控制 接口权限就是对用户的校验.正常来说,在用户登录时服务器需要给前台返回一个Token,然后在以后前台每次调用接口时都需要带上这个Token, 然后服务端获取到这个Token后进行比对,如果通过则可以

  • vue中如何实现后台管理系统的权限控制的方法示例

    一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单中的页面是否能被访问 页面中的按钮(增.删.改)的权限控制是否显示 权限控制是什么 在权限的世界里服务端提供的一切都是资源,资源可以由请求方法+请求地址来描述,权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源.具体的说,前端对资源的访问通常是由界面上的按钮发起,比如删除某条数据:或由用户进入某一个页面发

  • Springboot 整合shiro实现权限控制的方法

    Author:jeffrey Date:2019-04-08 一.开发环境: 1.mysql - 5.7 2.navicat(mysql客户端管理工具) 3.idea 2017.2 4.jdk8 5.tomcat 8.5 6.springboot2.1.3 7.mybatis 3 8.shiro1.4 9.maven3.3.9 二.数据库设计 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CB46ByC1-1604249108144)(img/shiro01.pn

随机推荐