springboot 自定义权限标签(tld),在freemarker引用操作

第一步:引入jar包

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2.1-b03</version>
    </dependency> 

第二步:自定义标签类

import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;

import org.jasig.cas.client.authentication.AttributePrincipal;
import org.springframework.web.servlet.tags.RequestContextAwareTag;

import com.goodidea.sso.dto.PrivilegesDto;
import com.goodidea.sso.dto.ResourcesDto;
import com.goodidea.sso.service.PrivilegesService;

/**
 *
* @ClassName: PrivilegeTag
* @Description: 权限标签类
* @author lsg
* @date 2017年9月12日 下午5:36:01
*
 */
public class PrivilegeTag extends RequestContextAwareTag{

  private static final long serialVersionUID = 534416848523276042L;

  private String menuAlias;

  private String priAlias;

  public String getMenuAlias() {
    return menuAlias;
  }

  public void setMenuAlias(String menuAlias) {
    this.menuAlias = menuAlias;
  }

  public String getPriAlias() {
    return priAlias;
  }

  public void setPriAlias(String priAlias) {
    this.priAlias = priAlias;
  }

  @Override
  protected int doStartTagInternal() {
    // TODO Auto-generated method stub
    boolean result = false;
     try {
      HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
       AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
       Map<String, Object> attributes = principal.getAttributes();
      String username=(String) attributes.get("username");
      PrivilegesService privilegesService= (PrivilegesService)this.getRequestContext().getWebApplicationContext().getBean("privilegesServiceImpl");
      Set<ResourcesDto> dto = privilegesService.findResourcesByUsername(username);
      for (ResourcesDto resourcesDto : dto) {
        if(this.menuAlias.equals(resourcesDto.getAlias())){
          for (PrivilegesDto pdto : resourcesDto.getPrivileges()) {
            if(this.priAlias.equals(pdto.getAlias())){
               result = true;
            }
          }
        }
      }
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      result =false;
    }
    return result? EVAL_BODY_INCLUDE : SKIP_BODY;
  }
}

第三步:创建tld标签,放入在web-inf下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>privilege</shortname>
  <tag>
    <name>privilege</name>
    <tagclass>com.goodidea.sso.core.PrivilegeTag</tagclass>
    <bodycontent>empty</bodycontent> <!--这里如果设为empty,则无body-->
    <attribute>
      <name>menuAlias</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>priAlias</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

第四:页面引用

<#assign p=JspTaglibs["/WEB-INF/tld/privilege.tld"] />

注意tld,如果不在web.xml上进行引入的话,就放在web-inf下,要不然会报找不到tld资源异常

补充知识:Springboot项目 freemarker 引入shiro 标签

springboot集成shiro权限过程略过

一、添加maven 依赖

<dependency>
 <groupId>net.mingsoft</groupId>
 <artifactId>shiro-freemarker-tags</artifactId>
 <version>0.1</version>
</dependency>

二、注入FreeMarkerConfigurer,未指定templateLoaderPath时遇到过跳转到页面404问题

@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() throws IOException, TemplateException {
  FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
  freeMarkerConfigurer.setTemplateLoaderPath("classpath:templates/");
  freemarker.template.Configuration configuration = freeMarkerConfigurer.createConfiguration();
  configuration.setDefaultEncoding("UTF-8");
  //这里可以添加其他共享变量 比如sso登录地址
  configuration.setSharedVariable("shiro", new ShiroTags());
  freeMarkerConfigurer.setConfiguration(configuration);
  return freeMarkerConfigurer;
}

三、shiro标签

1、session中读取登录人信息

<@shiro.principal/>

2、带有loginName属性的对象转换为Prinipal后保存在session

<shiro:principal property="loginName" />

3、带有loginName属性的Json(个人使用的是FashJson对象)转换为Prinipal后保存在session,使用freemarker标签处理Json

<#assign loginInfo><@shiro.principal/></#assign>

<#assign data=loginInfo?eval>

用户:${data.loginName!""}

4、其他shiro标签使用

<@shiro.hasPermission name="权限编码">
...
</@shiro.hasPermission>

以上这篇springboot 自定义权限标签(tld),在freemarker引用操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    首先,要在电脑上安装配置好zookeeper哦~ 这是我云服务器上的zookeeper状态 接下来,开始整合 1. 准备一个dubbo-api的SpringBoot项目 用来存储Entity类和Server接口的项目,配置文件无须改动. entity – User // Lombok注解 相当于Setter Getter toString() @Data public class User implements Serializable { // 序列化很重要!!! private static

  • springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作

    springboot +redis 实现点赞.浏览.收藏.评论等数量的增减操作 前言 第一次写博客,记录一下: 最近做了一个帖子的收藏.点赞数量的功能,其实之前也做过类似的功能,因为之前一直使用的mysql 总是感觉对于这种频繁需要改变的值,不应该给予Mysql过大的压力,本文章采用的是redis 做了持久化.下面贴出关键代码:DataResponse是项目中使用的结果封装实体类:forumDTO是此功能的参数实体,如果有需要请留言. 常量如下: private static final Str

  • SpringBoot @Retryable注解方式

    背景 在调用第三方接口或者使用MQ时,会出现网络抖动,连接超时等网络异常,所以需要重试.为了使处理更加健壮并且不太容易出现故障,后续的尝试操作,有时候会帮助失败的操作最后执行成功.一般情况下,需要我们自行实现重试机制,一般是在业务代码中加入一层循环,如果失败后,再尝试重试,但是这样实现并不优雅.在SpringBoot中,已经实现了相关的能力,通过@Retryable注解可以实现我们想要的结果. @Retryable 首先来看一下Spring官方文档的解释: @Retryable注解可以注解于方法

  • SpringBoot使用Thymeleaf自定义标签的实例代码

    此篇文章内容仅限于 描述springboot与 thy 自定义标签的说明,所以你在看之前,请先会使用springboot和thymeleaf!! 之前写过一篇是springMVC与thymeleaf 的自定义标签(属于自定义方言的属性一块,类似thy的th:if和th:text等)文章,如果你想了解,以下是地址: 点击>>Thymeleaf3.0自定义标签属性 这篇例子可以实现你的分页标签实现等功能,不会讲一堆的废话和底层的原理(自行百度),属于快速上手教程,请认真看以下内容! PS: 请允许

  • 浅谈SpringBoot主流读取配置文件三种方式

    读取配置SpringBoot配置文件三种方式 一.利用Bean注解中的Value(${})注解 @Data @Component public class ApplicationProperty { @Value("${application.name}") private String name; } 该方式可以自动读取当前配置文件appliation.yml  或者application.properties中的配置值 区别在于读取yml文件时候支持中文编码,peoperties需

  • springboot 自定义权限标签(tld),在freemarker引用操作

    第一步:引入jar包 <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2.1-b03</version> </dependency> 第二步:自定义标签类 import java.util.Map; import java.util.Set; import javax.se

  • Java自定义简单标签实例

    下面将以权限的控制为例自定义一个标签:一.标签类型 复制代码 代码如下: <wxt:per uri="${pageContext.request.contextPath }/privilege/list"></wxt:per> 步骤:1.自定义一个类PerssionTag 继承SimpleTagSupport(自定义标签一般都会继承这个类) 复制代码 代码如下: package cn.com.liveuc.privilege.tag;import java.io

  • 如何使用Spring自定义Xml标签

    目录 前言 正文 自定义NameSpaceHandler 自定义schema Parser Decorator 总结 前言 在早期基于Xml配置的Spring Mvc项目中,我们往往会使用<context:component-scan basePackage="">这种自定义标签来扫描我们在basePackae配置里的包名下的类,并且会判断这个类是否要注入到Spring容器中(比如这个类上标记了@Component注解就代表需要被Spring注入),如果需要那么它会帮助我们

  • SpringBoot自定义注解开发指南

    目录 一.Java注解(Annotation) 1.JDK基本注解 2.JDK元注解 二.自定义注解开发 1.含义 2.演示 三.完成切面日志操作 四.完成前端响应反应 总结 一.Java注解(Annotation) 含义:Java注解是附加在代码中的一些元信息,用于一些工具在编译. 运行时进行解析和使用,起到说明.配置的功能. 1.JDK基本注解 @Override ——>重写 @Deprecated ——>已过时 @SuppressWarnings(value = "unchec

  • Android权限控制之自定义权限

    天哪,这篇文章终于说道如何自定义权限了,左盼右盼,其实这个自定义权限相当easy.为了方便叙述,我这边会用到两个app作为例子示范. Permission App: used to define a new permission 这个作为定义权限的App,我称之为Permission App. Client App: used to access the specified activity of Permission App 这个作为访问上述自定义权限的App,我称之为Client App 先

  • 详解Android自定义权限使用总结

    1.如何声明自定义权限 在Manifest文件中使用Permission标签定义自己的权限: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bright.permission"> <permission

  • springboot 自定义LocaleResolver实现切换语言

    我们在做项目的时候,往往有很多项目需要根据用户的需要来切换不同的语言,使用国际化就可以轻松解决. 我们可以自定义springboot中的LocaleResolver来进行简单的国际化处理,下面来通过简单Demo来简单的了解国际化. 在下面的Demo中,我用的是thymeleaf模板引擎标签的形式对国际化进行取值. 1.在pom中引入thymeleaf模板引擎 //引入thymeleaf <dependency> <groupId>org.springframework.boot&l

  • springboot自定义redis-starter的实现

    spring时代整合redis spring我相信只要是一个Java开发人员我相信再熟悉不过了,几乎垄断了整个JavaEE的市场份额,话不多说进入正题. 首先看看我们在spring中整合redis需要做什么 1.首先maven工程的话不用想先导入依赖 <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> &

  • SpringBoot自定义注解实现Token校验的方法

    1.定义Token的注解,需要Token校验的接口,方法上加上此注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementTyp

  • 教你怎么用Springboot自定义Banner图案

    一.前言 我们在启动 Spring Boot 项目时,默认会在控制台打印 Spring logo 和版本等信息,如下: 这就是 Spring Boot 的 Banner 打印功能,其实我们可以自定义打印的 banner ,也可以禁用和启用打印 banner 功能.在真实项目中,我们一般不会去自定义 banner 图案,它其实就是项目启动时打印图案或者文字而已,没实际意义.推荐在自己个人项目玩玩这个彩蛋即可,顺便简单了解下它内部实现原理. 比如,自定义一个 banner 之后,项目启动控制台打印如

随机推荐