精华内容
下载资源
问答
  • SpEL + AOP实现注解的动态赋值,注解动态赋值 一、自定义注解 先聊聊这个需求,我需要根据用户的权限对数据进行一些处理,但是痛点在哪里呢?用户的权限是在请求的时候知道的,我怎么把用户的权限传递给处理规则...

    SpEL + AOP实现注解的动态赋值,注解动态赋值

     

    一、自定义注解

    先聊聊这个需求,我需要根据用户的权限对数据进行一些处理,但是痛点在哪里呢?用户的权限是在请求的时候知道的,我怎么把用户的权限传递给处理规则呢?想了以下几种方案:

    那么现在有个难点就是:我怎么把 request 的权限参数传递到 response 中呢?当然可以在 Spring 拦截器中处理,但是我不想把这段代码侵入到完整的鉴权逻辑中。突然想到,我能不能像 spring-data-redis 中 @Cacheable 一样,利用注解和 SpEL 表达式动态的传递权限参数呢?然后在 ResponseBodyAdvice 读取这个注解的权限参数,进而对数据进行处理。

    首先,我们需要有个自定义注解,它有两个参数:key 表示 SpEL 表达式;userType 表示权限参数。

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ResponseSensitiveOverride {
    
        /**
         * SPEL 表达式
         *
         * @return
         */
        String key() default "";
    
        /**
         * 1:主账号、2:子账号
         */
        int userType() default 1;
    }

    然后,把这个注解放在路由地址上,key 写入获取权限参数的 SpEL 表达式:

        @ResponseSensitiveOverride(key = "#driverPageParam.getUserType()")
        @RequestMapping(value = "/queryPage", method = RequestMethod.POST)
        public ResponseData<PageVo<AdminDriverVo>> queryPage(@RequestBody AdminDriverPageParam driverPageParam) {
            return driverService.queryPageAdmin(driverPageParam);
        }

    二、SpEl + AOP 注解赋值

    现在 SpEL 表达式是有了,怎么把 SpEL 表达式的结果赋值给注解的 userType 参数呢?这就需要用 Spring AOP 、Java 反射 和 动态代理 的知识。

    @Aspect
    @Component
    public class SensitiveAspect {
    
        private SpelExpressionParser spelParser = new SpelExpressionParser();
    
        /**
         * 返回通知
         */    
        @AfterReturning("@annotation(com.yungu.swift.base.model.annotation.ResponseSensitiveOverride) && @annotation(sensitiveOverride)")
        public void doAfter(JoinPoint joinPoint, ResponseSensitiveOverride sensitiveOverride) throws Exception {
            //获取方法的参数名和参数值
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            List<String> paramNameList = Arrays.asList(methodSignature.getParameterNames());
            List<Object> paramList = Arrays.asList(joinPoint.getArgs());
    
            //将方法的参数名和参数值一一对应的放入上下文中
            EvaluationContext ctx = new StandardEvaluationContext();
            for (int i = 0; i < paramNameList.size(); i++) {
                ctx.setVariable(paramNameList.get(i), paramList.get(i));
            }
    
            // 解析SpEL表达式获取结果
            String value = spelParser.parseExpression(sensitiveOverride.key()).getValue(ctx).toString();
            //获取 sensitiveOverride 这个代理实例所持有的 InvocationHandler
            InvocationHandler invocationHandler = Proxy.getInvocationHandler(sensitiveOverride);
            // 获取 invocationHandler 的 memberValues 字段
            Field hField = invocationHandler.getClass().getDeclaredField("memberValues");
            // 因为这个字段是 private final 修饰,所以要打开权限
            hField.setAccessible(true);
            // 获取 memberValues
            Map memberValues = (Map) hField.get(invocationHandler);
            // 修改 value 属性值
            memberValues.put("userType", Integer.parseInt(value));
    
        }
    }

    通过这种方式,我们就实现了为注解动态赋值。

    三、ResponseBodyAdvice 处理数据

    现在要做的事情就是在 ResponseBody 数据返回前,对数据进行拦截,然后读取注解上的权限参数,从而对数据进行处理,这里使用的是 SpringMVC 的 ResponseBodyAdvice 来实现:

    @Slf4j
    @RestControllerAdvice
    @Order(-1)
    public class ResponseBodyAdvice implements org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice {
    
        private static final ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
            @Override
            protected Integer initialValue() {
                return SysUserDto.USER_TYPE_PRIMARY;
            }
        };
    
        @Override
        public boolean supports(MethodParameter returnType, Class converterType) {
            if (returnType.hasMethodAnnotation(ResponseSensitiveOverride.class)) {
                ResponseSensitiveOverride sensitiveOverride = returnType.getMethodAnnotation(ResponseSensitiveOverride.class);
                threadLocal.set(sensitiveOverride.userType());
                return true;
            }
            return false;
        }
    
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
            if (body != null && SysUserDto.USER_TYPE_SUB.equals(threadLocal.get())) {
                // 业务处理
            }
            return body;
        }
    }

    题外话,其实我最后还是摈弃了这个方案,选择了 Dubbo 过滤器的处理方式,为什么呢?因为在做数据导出的时候,这种方式没办法对二进制流进行处理呀!汗~ 但是该方案毕竟耗费了我一个下午的心血,还是在此记录一下,可能有它更好的适用场景!

    展开全文
  • 今天小编就为大家分享一篇bootstrap下拉框动态赋值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 第一种:下拉框动态赋值:private void Form1_Load(object sender, EventArgs e){//获取数据源listthis.Column1.DataSource = list;this.Column1.DisplayMember = "";this.Column1.ValueMember = "";}private ...

    第一种:

    下拉框动态赋值:

    private void Form1_Load(object sender, EventArgs e)

    {

    //获取数据源list

    this.Column1.DataSource = list;

    this.Column1.DisplayMember = "";

    this.Column1.ValueMember = "";

    }

    private DataGridViewComboBoxEditingControl dataGridViewComboBox = null;

    //捕获事件

    private void dgvTableFields_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

    {

    if (e.Control is DataGridViewComboBoxEditingControl && this.dgvTableFields.CurrentCell.ColumnIndex ==4

    && this.dgvTableFields.CurrentCell.RowIndex !=-1)

    {

    this.dataGridViewComboBox = (DataGridViewComboBoxEditingControl)e.Control;

    //增加委托处理

    dataGridViewComboBox.SelectionChangeCommitted += new EventHandler(this.dataGridViewComboBox_SelectionChangeCommitted);

    }

    }

    private void dataGridViewComboBox_SelectionChangeCommitted(object sender, EventArgs e)

    {

    //处理业务

    MessageBox.Show(((ComboBox)sender).Text);

    }

    private void dgvTableFields_CellEndEdit(object sender, DataGridViewCellEventArgs e)

    {

    if (this.dataGridViewComboBox != null)

    {

    dataGridViewComboBox.SelectionChangeCommitted -= new EventHandler(this.dataGridViewComboBox_SelectionChangeCommitted);

    this.dataGridViewComboBox =null;

    }

    }

    第二种:

    在DataGridView控件中加入ComboBox下拉列表框的实现

    展开全文
  • URL动态赋值

    2016-11-17 22:09:00
    url动态赋值: 指的是url中包含{selector},...后面的文档中,凡是标记有D-Url字样的URL参数,均支持动态赋值,通常支持动态赋值的url,同时支持warn参数,warn参数携带动态赋值不成功的提示信息。   我没有测试成...

     

    url动态赋值:

    指的是url中包含{selector},即花括号括起来的jQuery选择器,当提交该url时,框架会自动将selector对应元素的值替换到花括号所占区域。

    (感觉实现了一点类似el表达式的效果)

     

    后面的文档中,凡是标记有D-Url字样的URL参数,均支持动态赋值,通常支持动态赋值的url,同时支持warn参数,warn参数携带动态赋值不成功的提示信息。

     

    我没有测试成功,后面成功了补上来。

     

    只有在url属性中可以看到D-Url的url才可以动态赋值,例如:

    <script type="text/javascript">
                            function openMytab(obj){
                                $(obj).navtab({id:'mynavtab', url:'{#navtab_url}', title:'我的业务界面'});
                            }
                        </script>
                            <button type="button" class="btn btn-default" οnclick="openMytab(this)">打开navtab</button>

     

    展开全文
  • 主要给大家介绍了关于jquery动态赋值id与动态取id的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
  • 4.动态赋值

    2020-06-12 10:15:41
    跟汤老师学Java笔记:动态赋值 完成:第一遍 1.什么是动态赋值? 循环接收用户输入的数据,动态为数组赋值 package season7; import java.util.Scanner; public class TestArrayDongTai { public static void main...

    4.动态赋值

    学习:第7遍


    1.什么是动态赋值???

    循环接收用户输入的数据,动态为数组赋值


    public class Test{
    	public static void main(String[] args) {
    	
    		Scanner input = new Scanner(System.in);
    		
    		//循环接收用户输入的数据,为数组赋值
    		String[] names = new String[5];
    		
    		for (int i = 0; i < names.length; i++) {
         	System.out.print("请输入第" + (i + 1) + "个学生的姓名:");
    			names[i] = input.next();
    		}
    		
    		//循环输出数组中的元素
            //为了和数组下标一致,循环从int i=0开始
    		for (int i = 0; i < names.length; i++) {
    	 System.out.println("第"+(i+1)+"个学生的名字是:"+names[i]);
    		}
    
    	}
    }
    
    
    展开全文
  • 最近又在忙着升级产品了,加上有着自己的安排,压缩着时间,想着办法提高着效率,都会找各种少有的闲暇的时间考虑着接下来的...需求:下拉框的动态赋值配方:jQuery EasyUI 中的combobox处方:首先是后台的准备:...
  • uniapp为tabbar动态赋值

    千次阅读 2020-04-24 11:56:44
    uniapp为tabbar动态赋值uniapp为tabbar动态赋值 uniapp为tabbar动态赋值 uni.setTabBarBadge方法设置tabbar text赋值要加‘’+‘’ uni.setTabBarBadge({ index: 2, text: '' + this.total3 + '', });...
  • 在本文中我们给大家整理了关于Python动态赋值的陷阱的相关知识点内容,需要的朋友们学习下。
  • ECharts的动态赋值

    千次阅读 2017-03-20 11:51:11
    ECharts图表创建的动态赋值
  • jqpagination动态赋值实例

    千次阅读 2016-01-24 19:18:57
    jqpagination动态赋值实例
  • 主要介绍了JS实现给json数组动态赋值的方法,结合实例形式分析了javascript针对json数组的遍历、赋值等常用操作技巧,需要的朋友可以参考下
  • Vue 动态赋值 class

    千次阅读 2018-09-14 08:48:36
    版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82696881 Vue 动态赋值 class ...
  • JS的动态赋值

    2019-10-11 20:34:26
    JS的动态赋值 //输入指定学员人数,然后对应输出每一个人的成绩总和 平均值 最大值 最小值 //1-声明一个变量名为num 作为存储学员人数 var num=parseInt(prompt('请输入学员人数')); //2-声明一个数组名为...
  • layui下拉框动态赋值html代码:js代码:上图: html代码: <div class="layui-input-inline"> <select id="service" name="service" lay-verify="required" lay-filter="business" class="select"> ...
  • 模态框动态赋值

    千次阅读 2019-01-15 17:03:07
    模态框动态赋值,可以有多种方式:1、每次一个个填充;2、直接针对模态框中的ID赋值。。。 今天说下同事犯的错误,大家引以为鉴: 首先如图: 他在点击详情链接时,是能拿到相关参数的,进去具体模态框后的数据...
  • 1.select动态赋值 //将真正的value赋值给select。name为select标签后跟的name,value为想赋给select的值。 $(“select[name=example]”).val(“value”); &amp;amp;lt;!--select标签--&amp;amp;gt; &...
  • router-link to 动态赋值

    千次阅读 2019-02-28 10:02:00
    router-link to 动态赋值 路由定义: 动态赋值: &lt;router-link :to="{path:'/old_data_details/params/'+item.id}" &gt; &lt;/router-link&gt; ...
  • searchableSelect 插件动态赋值

    千次阅读 2018-05-29 16:34:58
    同时带来的问题是不能绑定onchange,还不能动态赋值.今天在网上找了半天也没找到方法.真的很头疼.首先我需要的功能是点击下拉框时要激活事件,并请求后台去查找数据.然后将值返回回来去重新定义select.而问题就在于...
  • Oracle游标动态赋值

    千次阅读 2016-11-22 09:51:00
    1. oracle游标动态赋值的小例子 -- 实现1:动态给游标赋值 -- 实现2:游标用表的rowtype声明,但数据却只配置表一行的某些字段时,遍历游标时需fetch into到精确字段 CREATE OR REPLACE PROCEDURE proc_cursor1( -...
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台;社区覆盖了云计算、大数据、人工智能、...
  • 用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
  • autoit 解决二维数组动态赋值
  • HQL语句的动态赋值

    2019-04-07 17:45:01
    HQL语句的动态赋值1、“?”号代表参数2、自定义参数名称 在JDBC编程中,PreparedStatement对象为开发提供了方便,他不但可以为动态语句进行赋值,而且可以避免SQL的注入式攻击;此外,由于它使用了SQL的缓存技术,...
  • 下面小编就为大家分享一篇ajax动态赋值echarts的实例(饼图和柱形图),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • uniapp的swiper动态赋值问题

    千次阅读 2020-07-15 14:48:51
    过程 可以给组件赋class值,通过uniapp的...mounted中获取初始高度,watch中监听切换,动态赋值给swiper html的结构 <swiper :style="{height: componentHeight + 70 + 'px'}" @change="swiperChange" :cur

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,444
精华内容 4,577
关键字:

动态赋值