簡體   English   中英

僅使用一個servlet

[英]Using only one servlet

我正在制作一個帶有登錄系統和后台頁面的網頁。 問題是,兩者都使用方法“doPost”(登錄用於autenticate,后台用於在db中插入數據)。 我如何只為兩者使用一個servlet? 我問這個因為兩個都使用doPost,所以我制作了兩個servlet。

如果您想使用單個servlet,則應實現Front Controller Pattern 為此,您將解析請求URL並決定應執行的操作:

public class MySingleServlet extends Servlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        String url = request.getPathInfo();
        //returns the action to handle
        Action action = ActionFactory.getAction(url);
        action.process(request, response);
    }
}

這涉及一個Action接口/抽象類和一個ActionFactory ,它將解析URL並返回正確的實現來處理要執行的操作。

另一個更天真,更難維護的實現是通過發送action參數。 這可能是一個問題,因為攻擊者可能會在將請求發送到URL之前使用代理並更改action參數。 如果這是一個公認的有效action ,並且攻擊者知道要發送什么,那么您就遇到了麻煩。

請注意,有一些MVC框架已經實現了像Spring MVC和JSF這樣的Front Controller模式,因此除非用於學習目的,否則不需要重新發明輪子(否則,您應該使用已經實現此功能的庫)。

您可以在post方法中添加額外的參數(例如action

  • 如果您正在使用表單,則從隱藏的表單字段中檢索
  • 如果使用xml http請求,則為您的請求添加簡單的&action='value'

並根據其值執行適當的操作:

if (action.equals("auth"))
{
     // authenticate
}
else if (action.equals("backoffice"))
{
    // db update
}

您可以根據路由請求從請求對象獲取pathInfo。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM