繁体   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