Struts2-URL标记-隐藏查询字符串
在对stackoverflow进行了大量研究之后,我发布了这个问题,因为我找不到解决这个问题的方法 需求场景:根据每个客户id作为参数,从客户列表中更新客户 尝试的解决方案:根据从jsp收到的客户Id,将其作为Struts2 url标记传递给操作 面临问题-查询字符串在URL上可见。Struts2-URL标记-隐藏查询字符串,url,struts2,tags,Url,Struts2,Tags,在对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?如果不是,那么在任何情况下都不应该允许。是的,用户可以签书签。