5

stackoverflowについて多くの調査を行った後、問題の解決策が見つからなかったため、この質問を投稿しています。

要件シナリオ:パラメーターとしての各顧客IDに基づいて、顧客のリストから顧客を更新します。

試行した解決策:jspから受け取った顧客IDに基づいて、Struts2urlタグとしてアクションに渡します。

問題に直面-URLに表示されるクエリ文字列。
http://foo.com/Struts2Example/getCustomerAction?customerId=2

質問:

  1. struts Urlタグを使用する場合、クエリ文字列を非表示にできませんか?
  2. Urlタグの使用中に使用中のクエリ文字列を非表示にできない場合はどうなりますか?上記のシナリオの代替案は何ですか。

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

別の方法は、userIDを暗号化して、HTMLページに送り返すことです。クライアント側でマッピングを維持します。リクエストを送信するときは、暗号化された値をPOSTします。復号化/暗号化ロジックはサーバー側にあります。これにより、システムにオーバーヘッドが追加されますが、セキュリティと比較した場合、これはパフォーマンスに対する十分なトレードオフです。また、MITおよびGPLライセンスの下にある@jcryption.org/infoもご覧ください。

より簡単な解決策は、これを「POST」アクションに変換して、値がHTTPリクエストボディ内に渡されるようにすることです。HTTPS経由の場合は暗号化されますが、GoogleデベロッパーツールまたはIE9デベロッパーモードを使用してユーザーIDルックアップを実行できます。

于 2013-02-19T04:20:31.030 に答える
1

いくつかの順序付けられていない考慮事項:

  • 異なる「アクション」を実行するには、異なるアクション(executeメソッドのみ)または同じアクションの異なるメソッドを使用します。
  • 各アクション/メソッドの名前は、実行される操作と一致し、自明である必要があります。たとえば、顧客editCustomer編集するgetCustomerためのメソッド(またはアクション)と、顧客を取得するためのメソッド(またはアクション)が必要です。
  • データの読み取りにはGETHTTPメソッドを使用し、データの送信にはPOSTHTTPメソッドを使用する必要があります。すべての非読み取り操作、理想的にはPOSTを介して実行する必要があります。GETを使用してデータを送信することは、20年前に生まれ、決して死ぬことのない古い悪い習慣です:/ POSTを使用する理由は、非表示のURL、より高い負荷容量、バイナリデータを送信する機能などです。

とは言うものの、のようなURLhttp://foo.com/Struts2Example/getCustomerAction?customerId=2は表示されている必要があり(たとえばブックマークされる)、理想的にはプリティファイされている必要があります(StackOverflowのようなRESTスタイル):次のようなものhttp://foo.com/Struts2Example/Customer/2/

http://foo.com/Struts2Example/editCustomerAction?customerId=2他のパラメータを渡していないため、のようなURLは機能しません。編集する顧客のIDはわかっていますが、変更するデータはわかりません...次のようになります。これは機能します http://foo.com/Struts2Example/editCustomerAction?customerId=2&name=foo&lastname=bar&age=42が、前述のように(そして質問で尋ねると)非表示にして、POSTで処理する必要があります。

sourceページのsを印刷する場合はID、ユーザーに非表示にする必要はありません。

あなたがする必要があるのは、ユーザーがIDあなたが指定した範囲外でsを変更できないようにすることです。 ページに顧客のリストを描画した場合ID {1,2,3}は、ユーザーがIDを変更して顧客を更新しようとする試みをブロックする必要があります。これを実現するには、ページにデータを入力ID = 4する前にIDのリストを保存するだけです。ページから返されたをリストと照合してくださいsessionIDそれらが一致しない場合は、悪意のある操作をブロックしてください。

お役に立てば幸い

于 2013-02-19T09:38:29.677 に答える