我应该使用会话来实现搜索框吗?

Ale*_*io1 0 java session struts2

我有一个包含以下字段的搜索表单

price, status, owner
Run Code Online (Sandbox Code Playgroud)

当用户填写所有字段时,请求将被发送到后端以显示具有指定价​​格,状态和所有者的产品的类别列表.用户可以单击每个类别以查看其产品列表.

为了实现它,我有以下方法来检索类别,并将搜索字段(价格,状态,所有者)放入会话中以在搜索的下一页中可用(当选择类别时).

参数的值可能太长了,我更喜欢将它们作为GET来轻松地为结果添加书签.

public String retrieveCategories(){
        //... here I retrieve categories which their products are matched 
        //with the search fields
        Map session = ActionContext.getContext().getSession();
        session.put("Items", this.items);
        return "SUCCESS";
   }
Run Code Online (Sandbox Code Playgroud)

显示所有类别后,用户可以单击每个类别以查看其产品.类别的名称将发送到后端,因此我将从会话中检索值以搜索具有所选类别的相同规格的产品.

public String retrieveProductsOfSelectedCategory(){
        Map session = ActionContext.getContext().getSession();
        this.items = (Items) session.get("Items");
        //... here I retrieve products of the selected category based on values retrieved
       // from session
   }
Run Code Online (Sandbox Code Playgroud)

我想知道如果不是你的建议,实施它是否是一个好习惯?

JB *_*zet 8

不,我不会使用会话来实现它.使用会话有几个不便之处:

  • 它使您的应用程序有状态,这使得集群变得更难:来自给定客户端的每个请求都必须转到同一服务器,或者会话必须是持久的或复制的.你在会话中投入的越多,内存,存储和带宽的成本就越高
  • 由于您使用硬编码会话密钥来存储搜索条件和项目,因此您无法在同一搜索页面上打开多个选项卡:它们将共享相同的条件和项目.
  • 清理会话很复杂:何时进行?如果在许多用例中应用此模式,则会在会话中最终出现大量无用数据.对于其生命周期为整个会话的数据,应该对该会话提起诉讼.不是将数据从特定页面传递到下一页.

干净的解决方案并不那么难.只需使用隐藏字段或请求参数即可将页面中的数据传递到页面:

第一页:

<input type="text" name="price" />
<input type="text" name="owner" />
Run Code Online (Sandbox Code Playgroud)

第二页

Please choose a category:

<ul>
    <li><a href="/products?name=foo&price=12&category=first"></a></li>
    <li><a href="/products?name=foo&price=12&category=second"></a></li>
    <li><a href="/products?name=foo&price=12&category=third"></a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

映射到/ products的操作然后可以从请求参数中检索名称,价格和类别,并显示结果.并且没有任何内容存储在会话中.