Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struts2-URL标记-隐藏查询字符串_Url_Struts2_Tags - Fatal编程技术网

Struts2-URL标记-隐藏查询字符串

Struts2-URL标记-隐藏查询字符串,url,struts2,tags,Url,Struts2,Tags,在对stackoverflow进行了大量研究之后,我发布了这个问题,因为我找不到解决这个问题的方法 需求场景:根据每个客户id作为参数,从客户列表中更新客户 尝试的解决方案:根据从jsp收到的客户Id,将其作为Struts2 url标记传递给操作 面临问题-查询字符串在URL上可见。 问题: 如果我们使用struts Url标记,我们不能隐藏查询字符串吗 如果在使用Url标记时无法隐藏using查询字符串?上述场景的替代方案是什么 下面是struts.xml、jsp和操作的代码- 所有客户详细

在对stackoverflow进行了大量研究之后,我发布了这个问题,因为我找不到解决这个问题的方法

需求场景:根据每个客户id作为参数,从客户列表中更新客户

尝试的解决方案:根据从jsp收到的客户Id,将其作为Struts2 url标记传递给操作

面临问题-查询字符串在URL上可见。

问题:

  • 如果我们使用struts Url标记,我们不能隐藏查询字符串吗
  • 如果在使用Url标记时无法隐藏using查询字符串?上述场景的替代方案是什么
  • 下面是struts.xml、jsp和操作的代码-

    所有客户详细信息
    客户Id
    名字
    姓
    年龄
    创建日期
    
    



    struts.xml-

    
    页面/customerForm.jsp
    
    客户行动类-

    公共类CustomerAction扩展ActionSupport实现模型驱动{
    Logger=Logger.getLogger(CustomerAction.class);
    客户=新客户();
    List customerList=new ArrayList();
    CustomerDAO CustomerDAO=新CustomerDAOImpl();
    公共客户getCustomer(){
    退货客户;
    }
    //将客户设置到价值堆栈中
    公共作废设置客户(客户){
    this.customer=customer;
    }
    公共列表getCustomerList(){
    返回客户列表;
    }
    //将客户列表设置到值堆栈上
    public void setCustomerList(列表customerList){
    this.customerList=customerList;
    }
    公共字符串execute()引发异常{
    回归成功;
    }
    公共对象getModel(){
    退货客户;
    }
    //编辑客户详细信息,它将根据customerId检索记录
    //SkipValidation用于跳过验证()
    @SkipValidation
    公共字符串getCustomerById(){
    logger.info(“**要编辑的客户Id**”+Customer.getCustomerId());
    customer=customerDAO.customerbyd(customer.getCustomerId());
    回归成功;
    }
    
    另一种方法是加密用户ID并将其发送回HTML页面。在客户端维护映射。提交请求时,发布加密值。解密/加密逻辑将在服务器端。 这将增加系统开销,但与安全性相比,这是一个相当不错的性能折衷方案。 另外,请看一下@jcryption.org/info,它在麻省理工学院和GPL许可下


    一个更简单的解决方案是将其转换为“POST”操作,以便在HTTP请求体内传递值。如果通过HTTPS传递,则会对其进行加密,但您仍然可以使用Google Developer Tools或IE9 Developer mode进行用户id查找一些无序的注意事项:

    • 使用不同的操作(仅限execute方法)或同一操作的不同方法来执行不同的“操作”
    • 每个操作/方法的名称应与所执行的操作相匹配,并且是自解释的,例如,您应该使用
      editCustomer
      方法(或操作)来编辑客户,使用
      getCustomer
      方法(或操作)来获取客户
    • GET-HTTP方法应用于读取数据,而POST-HTTP方法应用于发送数据;理想情况下,每个非读取操作都应通过POST执行;使用GET-HTTP发送数据是20年前产生的一个古老的坏习惯,从未消失过:/POST的原因是隐藏的URL、更高的负载容量和发送数据的能力二进制数据等
    也就是说,像
    http://foo.com/Struts2Example/getCustomerAction?customerId=2
    应该是可见的(例如被标记为书签),理想情况下应该是修饰的(REST样式,比如StackOverflow):类似于
    http://foo.com/Struts2Example/Customer/2/

    类似
    http://foo.com/Struts2Example/editCustomerAction?customerId=2
    无法工作,因为您没有传递任何其他参数;您知道要编辑的客户id,但不知道要更改的数据。。。 它会变成这样:
    http://foo.com/Struts2Example/editCustomerAction?customerId=2&name=foo&lastname=bar&age=42
    ,这会起作用,但正如前面所说的(以及您在问题中所问的),应该隐藏起来,并通过POST进行处理

    如果您正在页面的
    中打印
    ID
    s,则无需向用户隐藏它们

    您需要做的是确保用户不能在您指定的范围之外更改
    ID
    s;
    如果您在页面中绘制了ID为{1,2,3}的
    客户列表
    您必须阻止用户更改id并尝试使用
    id=4
    更新客户的任何尝试。要实现这一点,只需在填充页面之前将id列表存储在
    会话中,然后对照列表检查页面返回的
    id
    。如果不匹配,请阻止恶意操作


    希望这有助于

    将评论转换为答案。请忽略评论。Thanks@user1428716-谢谢你的回答。在这个场景中,由于我没有使用struts表单,我如何实现/转换请求到POST?为什么要隐藏id?如果你将值存储在客户端,任何人都可以查看源代码并获取它。你可以当然,使用POST发送结果,但是考虑用户需要对页面进行书签。真正的答案是安全性……这个用户是否应该能够访问这个客户ID?如果不是,那么在任何情况下都不应该允许。是的,用户可以签书签。