JS页面跳转使地址后面不显示参数[通俗易懂]

背景使用window.open()和window.location.href跳转时,新页面的地址栏会显示参数,如下:http://127.0.0.1:8080/website-cms/admin/article/edit?action=add。这样会暴露参数内容,用户可以修改地址栏的参数。如果提交的参数修改可能会出现业务上的错误,甚至可以跳过权限验证,实现本来没有的权限。案例以…

大家好,又见面了,我是你们的朋友全栈君。

背景

使用window.open()和window.location.href跳转时,新页面的地址栏会显示参数,如下:http://127.0.0.1:8080/website-cms/admin/article/edit?action=add
这样会暴露参数内容,用户可以修改地址栏的参数。如果提交的参数修改可能会出现业务上的错误,甚至可以跳过权限验证,实现本来没有的权限。

案例

以前做过一个系统是通过权限控制按钮,权限小的只能查看,权限大的可以修改。但是为了方便只使用了同一个页面通过不同的参数控制查看和修改。?op=1和?op=2分别是查看和修改,结果有的用户直接将op=1改为了op=2从而跳过权限验证,直接实现了修改功能。

实现方法

实现的思路是利用JS创建一个Form表单,然后将参数用Input元素的方式添加到Form表单中,最后提交Form表单从而实现跳转。
Form创建工具类

(function(){ 
   
    //设置命名空间
    var CodeSTD = window.CodeSTD || {};

    window.CodeSTD = CodeSTD; 

    /** * 创建Form表单 * @author 王成委 * @param config Object * <p>url:form的Action,提交的后台地址</p> * <p>method:使用POST还是GET提交表单</p> * <p>params:参数 K-V</p> * @return Form */
    CodeSTD.form = function(config){ 
   
        config = config || {};

        var url = config.url,
            method = config.method || 'GET',
            params = config.params || {};

        var form = document.createElement('form');
        form.action = url;
        form.method = method;
        form.target = "_blank";

        for(var param in params){
            var value = params[param],
                input = document.createElement('input');

            input.type = 'hidden';
            input.name = param;
            input.value = value;

            form.appendChild(input);
        }

        return form;
    }


})()

使用方法

function onAddClick(){ 
   
    var treeObj = $.fn.zTree.getZTreeObj("menu-tree");
    var nodes = treeObj.getSelectedNodes();
    var node = nodes[0];
    var menuId = node.menuId,menuName = node.menuName;

    var form = new CodeSTD.form({
        url:'admin/article/edit',
        method:'POST',
        params:{
            editor:'UE',
            action:'add',
            menuId:menuId,
            menuName:menuName
        }
    })

    $(form).submit();

    form = null;
}

使用Form跳转后的地址http://127.0.0.1:8080/website-cms/admin/article/edit

有需求的小伙伴可以参考下,实现方式很简单。如果文中有什么不妥的地方欢迎提出建议。有更好的方法欢迎留言。

有好多小伙伴反应不能使用,原因可能是因为您用的是火狐浏览器,在火狐浏览器下需要将form以隐藏的方式写入到body中才可以使用。也就是需要在CodeSTD.form中加入document.body.appendChild(form)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128152.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python简单爬虫入门一

    Python简单爬虫入门一

    2022年2月22日
    50
  • oracle 9i安装_oracle9i查看字符集

    oracle 9i安装_oracle9i查看字符集Oracle9iDatabaseRelease2Enterprise/Standard/PersonalEditionforWindowsNT/2000/XPhttp://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk1.ziphttp://download.oracle.com/otn/nt/oracle9i/9201/…

    2025年6月28日
    2
  • mysql 字符串类型 分区_MySQL分区类型

    mysql 字符串类型 分区_MySQL分区类型博文大纲:1、RANGE分区2、LIST分区3、HASH分区4、key分区5、MySQL分表和分区的区别6、附加:如何实现将分区放在不同的目录下进行存储MySQL分区类型如下:RANFGE分区LIST分区HASH分区key分区上面的四种分区的条件必须是整形,如果不是整形需要通过函数将其转换为整形。1、RANGE分区RANGE分区是基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不…

    2022年6月8日
    31
  • java redis 没密码配置_jeeplus设置Redis密码

    java redis 没密码配置_jeeplus设置Redis密码接手过来的jeeplus系统原本没有设置redis密码,近期要上线,为保证redis安全性,运维要求添加redis密码,且在线上环境为redis设置了密码。接下来我需要修改程序内容来迎合运维此项修改,方式如下:设置Redis密码涉及到以下三个文件,分别是:jeeplus.properties、spring-context-jedis.xml和JedisUtils.java。以上三个文件的含义为如下…

    2025年9月18日
    6
  • java如何将字符串转化为日期_java如何将字符串转为日期「建议收藏」

    java如何将字符串转化为日期_java如何将字符串转为日期「建议收藏」一、概述将Java中字符串“2010年1月2日”格式的转换为日期的最佳方法是什么?最终,我想将月份,日期和年份分解为整数,以便可以使用Datedate=newDate();date.setMonth()..date.setYear()..date.setDay()..date.setlongcurrentTime=date.getTime();将日期转换为时间。二、详解java.u…

    2025年6月14日
    4
  • Altium Designer — 精心总结

    Altium Designer — 精心总结以前是使用DXP2004来画图的,后来转行。想来已经有一年半的时间没有画过了。突然转到AD,有些不适应。用了下发觉很多功能确实比DXP要来的强大。花了不少时间和精力,将之前的一些经验技巧,进行整理总结。希望这篇文章,可以让人少走线些弯路。让初学者可以快速入门。好了,言归正传,开始启程!首先下载AD16: AltiumDesigner16.0.6Build282安装教程:Alti

    2022年7月13日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号