5

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

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

尝试的解决方案:根据从 jsp 收到的客户 ID,将其作为 Struts2 url 标签传递给 Action。

面临的问题 - URL 上可见的查询字符串。
http://foo.com/Struts2Example/getCustomerAction?customerId=2

问题 :

  1. 如果我们使用struts Url标签,我们可以不隐藏查询字符串吗?
  2. 如果我们在使用 Url 标签时无法隐藏 using 查询字符串?上述情况的替代方案是什么。

下面是 struts.xml、jsp 和操作的代码 -

<h2>All Customers Details</h2>

<s:if test="customerList.size() > 0">
    <table border="1px" cellpadding="8px">
        <tr>
            <th>Customer Id</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Age</th>
            <th>Created Date</th>
        </tr>
        <s:iterator value="customerList" status="userStatus">
            <tr>
                <td><s:url var="editCustomer" action="getCustomerAction">
                        <s:param name="customerId" value="%{customerId}" />
                    </s:url>

                    <p>
                        <s:a href="%{editCustomer}">
                            <s:property value="customerId" />
                        </s:a>
                    </p></td>

                <td><s:property value="firstname" /></td>
                <td><s:property value="lastname" /></td>
                <td><s:property value="age" /></td>
                <td><s:date name="createdDate" format="dd/MM/yyyy" /></td>
            </tr>
        </s:iterator>
    </table>
</s:if>
<br />
<br />

struts.xml-

<!-- Get Customer Details - To Pre-Populate the form to update a Customer -->
    <action name="getCustomerAction" method="getCustomerById"
        class="com.hcl.customer.action.CustomerAction">
        <result name="success">pages/customerForm.jsp </result>
    </action>

客户行动类-

public class CustomerAction extends ActionSupport implements ModelDriven {

Logger logger = Logger.getLogger(CustomerAction.class);

Customer customer = new Customer();

List<Customer> customerList = new ArrayList<Customer>();
CustomerDAO customerDAO = new CustomerDAOImpl();

public Customer getCustomer() {
    return customer;
}

//Set Customer onto Value Stack
public void setCustomer(Customer customer) {
    this.customer = customer;
}

public List<Customer> getCustomerList() {
    return customerList;
}

//Set Customer List onto Value Stack
public void setCustomerList(List<Customer> customerList) {
    this.customerList = customerList;
}

public String execute() throws Exception {
    return SUCCESS;
}

public Object getModel() {
    return customer;
}



// Edit customer details, it will retrieve the records based on customerId
//SkipValidation is used to skip the validate()
@SkipValidation
public String getCustomerById() {

    logger.info("** Customer Id to edit ** " + customer.getCustomerId());

    customer = customerDAO.customerById(customer.getCustomerId());

    return SUCCESS;

}
4

2 回答 2

1

一些无序的考虑:

  • 使用不同的Action(仅使用execute方法),或同一Action的不同方法,执行不同的“动作”;
  • 每个 Action/Method 的名称应该与执行的操作相匹配并且不言自明,例如您应该有一个编辑客户的方法(或 Action)editCustomer和一个获取客户的方法(或 Action);getCustomer
  • GET HTTP 方法应该用于读取数据,而 POST HTTP 方法应该用于发送数据;理想情况下,每个非读取操作都应通过 POST 执行;使用 GET 发送数据是 20 年前诞生并且从未消亡的老坏习惯:/ 使用 POST 的原因是隐藏 URL、更高的负载能力、发送二进制数据的能力等...

也就是说,一个类似的 URLhttp://foo.com/Struts2Example/getCustomerAction?customerId=2应该是可见的(例如,要添加书签),并且理想情况下应该是美化的(REST 风格,如 StackOverflow):类似于http://foo.com/Struts2Example/Customer/2/

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

如果您在source页面的IDs 中打印,则不需要向用户隐藏它们;

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

希望有帮助

于 2013-02-19T09:38:29.677 回答
1

另一种方法是加密用户 ID 并将其发送回 HTML 页面。在客户端维护映射。当您提交请求时,POST 加密值。解密/加密逻辑将在服务器端。这将增加系统开销,但与安全性相比,这是一个足够体面的性能折衷。另请查看@jcryption.org/info,它在 MIT 和 GPL 许可证下。

一个更简单的解决方案是将其转换为“POST”操作,以便在 HTTP 请求正文中传递值。如果它通过 HTTPS ,它将被加密但是您仍然可以使用 Google Developer Tools 或 IE9 开发人员模式进行用户 ID 查找

于 2013-02-19T04:20:31.030 回答