记录一次bug解决过程:velocity中获取url中的参数

一、总结

  1. 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter(‘userId‘)
  2. 在Webx项目中,防止CSRF攻击(Cross-site request forgery,跨站请求伪造),在form表单提交中要加入$!csrfToken.ajaxUniqueToken

二、Bug描述:Velocity从URL中获取parameter参数

  在项目IDCM中,使用webx容器进行项目的开发。前端的模板引擎采用了velocity,在项目中,当从列表页跳到详情页的时候,通常我们的screen层是采用如下方式进行展现的:

public class EditRules extends BaseScreen {
    @Autowired
    private AutoAssignSupplierBo autoAssignSupplierBo;
    @Autowired
    private SupplierBo           supplierBo;
    @Autowired
    private AddressBo            addressBo;
    @Autowired
    private SiteBo               siteBo;

    public void execute(@Param("id")
    String id, Context context) throws Exception {
        QueryAssignRulesrDo query = new QueryAssignRulesrDo();
        if (StringUtils.isBlank(id)) {
            throw new ServiceException("id is empty ");
        }
        query.setRuleId(Long.parseLong(id));
        BoResultDTO<List<AssignRulesVo>> result = autoAssignSupplierBo.selectByQuery(query);
        List<AssignRulesVo> list = result.getData();
        if (CollectionUtils.isNotEmpty(list)) {
            // 当前规则的详情
            if (StringUtils.isNotBlank(list.get(0).getType())) {
                list.get(0).setTypeVal(list.get(0).getType());
              list.get(0).setType(WorkOrderCst.RelocationType.getNameByStrValue(list.get(0).getType()));
            }
            // 如果有数量信息需要展示
            if (list.get(0).getRuleContent().contains("数量")) {
                String[] numDes = list.get(0).getRuleContent().split(" ");
                for (String str : numDes) {
                    if (str.contains("数量")) {
                        String[] sz = str.split(":");
                        if (2 == sz.length) {
                            list.get(0).setAssetNum(sz[1]);
                        }
                    }
                }
            }
            context.put("ruleInfos", JSON.toJSONString(list.get(0)));
            // 补全控件信息
            Map<String, Object> map = fullInfo(list.get(0).getRuleJsonVal());
            if (list.get(0).getRuleContent().contains("数量")) {
                map.put("assetNum", list.get(0).getAssetNum());
            }
            context.put("ruleDes", JSONUtils.toJSONString(map));
        }
        // 初始化类型信息
        Map<String, Object> RelocationTypeList = WorkOrderCst.RelocationType.getRelocationTypeList();
        context.put("RelocationTypeList", RelocationTypeList);
        // 物流供应商信息
        context.put("logisticsSps", supplierBo.queryAllByType(WorkOrderCst.SpType.logistics.name()));
        // 传入设备类型
        this.setorderDeviceType(context);
    }
}

  上图代码是自动分配物流供应商从列表页跳转到详情页的时候,需要显示调用screen层的跟*.vm同名的*.java方法,通过传入参数id,即选择了指定行,后台会将查询到的数据封装到对象中,在vm中可以直接使用,而不用再走ajax请求,提升了系统的反映速度。其中在BaseScreen.java中负责公共日志的输出,当前权限的获取,以及一些公共属性的动态获取。但是,有一些业务场景中,我们在进行跳转的时候,只需要知道跳转过来的当前id,并不需要后端来加载数据。这时候,如果能从vm中直接获取跳转过来的url的parameter参数,那么就可以省去跟*.vm同名的*.java中的execute方法。

// 唯一正确的用法:
<input type="hidden" id="user_id" value=" $rundata.getRequest().getParameter(‘userId‘)"/>

//以下几种用法都无法获取到参数的值
$!request.parameter.userId
$!request.paarmater.getParameter(‘userId‘)

此外,Velocity更多使用细节参考英文官方文档或前往此处

三、Bug描述:$!csrfToken.hiddenField

  CSRF(跨站请求伪造),它通过伪装来自受信任用户的请求来利用受信任的网站。在IDCM项目中,在*.vm页面会有大量的<from>表单提交,在表单提交的时候,为了防止跨站请求伪造,要在form标签之后紧跟$!csrfToken.ajaxUniqueToken。

<form name="xxx" action="xxx" method="post">
  $!csrfToken.hiddenField
</form>

上述代码中,在VM文件的form表单中添加了token。该表单请求极有可能涉及数据增删改,需要防范CSRF,请确认使用POST请求,增加token参数,并在服务端校验token。

三、Bug描述:

附录:

阿里巴巴-基础架构事业群业务,项目路径:

基础架构事业群业务。

时间: 2024-10-23 11:12:39

记录一次bug解决过程:velocity中获取url中的参数的相关文章

js中获取URL中指定的查询字符串

js中获取URL中指定的搜索字符串,主要利用location对象实现,废话少说,上代码. 1 function getSearchString(key) { 2 // 获取URL中?之后的字符 3 var str = location.search; 4 str = str.substring(1,str.length); 5 6 // 以&分隔字符串,获得类似name=xiaoli这样的元素数组 7 var arr = str.split("&"); 8 var ob

记录一次bug解决过程:规范变量名称和mybatis的使用以及代码优化

一.总结 Mybatis中当parameterType为基本数据类型的时候,统一采用_parameter来代替基本数据类型变量. Mybatis中resultMap返回一个对象,resultType返回一个Map简单数据类型(由于需要缓存到JVM中)的映射关系. String类型转Integer类型:String类型转int类型用到的方法是不一样的. 方法入口处第一行写new Date(),防止时间在23:59:59跨界对逻辑带来影响. 考虑到上线app_resource表忘记配置供应商比例,在

记录一次bug解决过程:eclipse Installed JREs 配置引出的问题

一 总结 eclipse Installed JREs 配置引出的问题:编译以来JDK,不是JRE spring boot内嵌tomcat运行程序,tomcat:run 二 Bug描述:eclipse Installed JREs 配置引出的问题 刚新鲜检索出的代码,同学们编译都ok的,自己编译总是出错.原因在于eclipse Installed JREs 配置出错引出的问题.路径:windows->preferences->输入jre->Installed JRES->要依赖JD

记录一次bug解决过程:可维护性和性能优化

一.总结 使用某些变量的地方在2次以上的,强烈建议使用枚举值来维护变量,日后方便扩展. 查数据库的方法调用,能合并就净量去合并. 二.Bug描述 枚举变量的维护以及方法使用: public class UsedOnce { public static enum ruleDetailsEnum { SOURCEREGIN("原区域"), TARGETREGIN("目的区域"), SOURCECITY("原城市"), TARGETCITY("

记录一次bug解决过程:else未补全导致数据泄露

一.总结 快捷键ctrl + alt + 四个方向键 --> 倒置屏幕 未补全else逻辑,倒置查询数据泄露 二.BUG描述:else逻辑未补全,倒置查询数据泄露 在查询筛选参数的时候,有如下逻辑: if (StringUtils.isNotBlank(logisticsOrder.getParentIds())) { // 所属复合单 String[] ids = SqlStringUtil.sliptQueryStr(logisticsOrder.getParentIds()); for (

记录一次bug解决过程:resultType和手动开启事务

一.总结 二.BUG描述:MyBatis中resultType使用 MyBatis中的resultType类似于入参:parameterType.先看IDCM项目中的实际使用案例代码,如下: // List<Integer> orderIds = assetBeanMapperExt.getOrderIdsByParentIds(SqlStringUtil.formatInStr(logisticsOrder.getParentIds())); 我们的目的是通过*Ext层直接返回一个list,

记录一次bug解决过程:eclipse集成lombok插件

一 总结 eclipse集成插件lombok: 启动Spring Boot项目: sublime全局搜索关键字:ctrl + shift + F JDK8中的lambda表达式使用 二 BUG描述:集成eclipse插件lombok lombok插件,使用注解@Data的方式,从而省略了代码中频繁的getter和setter方法.安装插件:通过下载jar包安装,并且制定到你的eclipse.exe路径.官方下载地址:http://projectlombok.org/download.html.

在JQuery中获取URL中的参数值

添加一个js文件,代码如下 1 // * jQuery url get parameters function [获取URL的GET参数值] 2 // *character_set UTF-8 3 // * author Jerry.li([email protected]) 4 // * version 1.2012.12.11.1400 5 // * Example 6 // * <code> 7 // * var GET = $.urlGet(); //获取URL的Get参数 8 //

记录一则ORA-00054,ORA-00031解决过程

生产环境:AIX 5.3 + Oracle 10.2.0.5 任务要求:普通表改造分区表,历史数据不要 这个需求很简单: pl/sql导出建表语句,依次修改成分区的建表语句,注意将索引修改成本地索引; drop 原表; create 新分区表. 1.重建过程中遇到问题:删除某表时报错ORA-00054,导致无法删除重建此表. SQL> drop table MOD_RESALT_PERF_CARR_1X_ZTE; create table MOD_RESALT_PERF_CARR_1X_ZTE(