我正在制作一个包含登录系统和后台网页的网页。问题是,两者都使用方法" doPost" (登录用于autenticate,后台用于在db中插入数据)。我如何只为两者使用一个servlet?我问这个因为两个都使用了doPost,所以我制作了两个servlet。
答案 0 :(得分:3)
如果您想使用单个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 Pattern,所以除非是出于学习目的,否则不需要重新发明轮子(否则,你应该使用已经实现的库)这一点)。
答案 1 :(得分:0)
您可以在帖子方法中添加额外参数(例如action
)
&action='value'
并根据其值执行相应的操作:
if (action.equals("auth"))
{
// authenticate
}
else if (action.equals("backoffice"))
{
// db update
}
答案 2 :(得分:0)
您可以根据路由请求从请求对象获取pathInfo。