我正在使用的工具只能发送GET请求,我需要使用请求中包含的信息来处理繁重的操作。然后,这些操作返回一个包含我将用于重定向的URL的字符串。
经过一些研究,我发现doGet()方法用于预处理请求,而doPost()则可以用于后处理。
有任何方法可以使用doGet()方法来执行这些繁重的操作吗?如果我必须使用doPost()方法,如何将我的请求“转换”为POST请求?
谢谢。
编辑:我已经尝试在doGet方法中处理这些繁重的操作。但是,servlet似乎不会等到生成了用于重定向的url字符串。我已经看到,尝试从性能上同步doGet()方法是一件坏事。
编辑2-关于我要做的事情:我正在使用的工具是Oracle解决方案。您可以在客户端内启动自定义操作,包括web应用程序。启动自定义操作将向应用程序发送GET请求,其中包含启动应用程序的页面的所有信息(用户、选定的项等),然后应用程序使用这些信息处理我谈到的繁重操作。操作包括使用相同的ID在Oracle客户端上创建一个新会话,根据所选项进行查询,创建XML数据,甚至使用位于Oracle服务器上的外部程序。最后,它返回一个下载URL,您可以从那里下载PDF报告,我使用这个URL重定向应用程序。
以下是servlet代码:
package com.servlets;
import java.io.IOException;
import javax.naming.InitialContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.actions.agileSessionHandler;
import com.actions.BOMComparisonReport;
public class DefaultServlet extends HttpServlet {
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{
agileSessionHandler handler = new agileSessionHandler(...);
BOMComparisonReport report = new BOMComparisonReport(...);
handler.setSessionObject(request);
String url = report.generateBOMReport(...);
request.setAttribute("redirectURL", url);
this.getServletContext().getRequestDispatcher( "/WEB-INF/BOMCompDefault.jsp" ).forward( request, response );
}
}
发布于 2013-06-20 08:34:04
我已经尝试在doGet方法中处理这些繁重的操作。但是,servlet似乎不会等到我用来重定向的url字符串生成之后。
听起来好像你在启动一个新的线程,却完全忘记了它。在Java环境中,这是一个非常糟糕的想法。别干那事。只需在完全相同的线程中进行处理(即根本不创建new Thread()
)。如果您真的打算异步执行,那么您应该在EJB上使用例如@Asynchronous
方法,然后利用轮询或推送将进度/结果通知客户端。
不管你是在GET还是POST请求中都这样做。关键是,GET请求是幂等的、可书签的、可重执行的,每次结果完全相同。考虑一下SQL SELECT
查询。POST请求不是。它们将用于操纵服务器端的数据。请考虑执行SQL UPDATE
或DELETE
查询。您不希望您的数据在每一个F5新闻中都被修改或删除,甚至当搜索机器人来索引get链接时也是如此,对吗?
发布于 2013-06-20 08:19:15
如果要将请求“转换”为POST
请求,只需从doGet
调用doPost
方法即可,但如果需要POST
功能,则不会改变任何内容。
如果您的工具发送了大量的请求参数,那么所有的参数都将被附加到url中,这根本不安全。
对于GET
请求,可以成功地管理的url的长度也因容器而异。
正如The所告诉的,幂等性意味着一次又一次地执行相同的操作,而不会造成任何副作用。
方法GET
是幂等的,因为它只是请求资源,一次又一次地请求资源不会导致任何问题,但是POST
由表单提交组成,并且多次输入表单数据可能会导致严重的问题。当您的货币交易发生超过一次的单一留置权购买时,请尝试考虑该示例。
资源的简单链接是GET
请求,您可以对它们进行书签并一次又一次地请求。
GET请求不太安全,因为所有参数都在url中可见,而POST
请求更安全,因为它们没有显示在url中的任何地方。
大多数情况下,GET
url可以是2048个字符,这意味着您可以发送有限的数据。对于POST
方法,发送的数据没有限制。
发布于 2013-06-20 08:22:51
POST
和GET
方法没有基于重运算的分类,GET
是幂等的,POST
不是幂等的。GET是幂等的意思,因此,相同的操作多次使用应该产生相同的结果,当它与POST一样有副作用。
顾名思义,GET用于从服务器获取一些信息,而POST则用于将数据发送到服务器以供进一步处理。但是,没有人能阻止你实现一个非幂等的GET方法。
根据维基百科的说法:
GET请求指定资源的表示形式。注意,GET不应该用于引起副作用的操作,例如在web应用程序中使用它来执行操作。其中一个原因是GET可能被机器人或爬行器任意使用,它们不需要考虑请求应该造成的副作用。 POST将要处理的数据(例如,从HTML )提交给标识的资源。数据包括在请求正文中。这可能导致创建新资源或更新现有资源,或两者兼而有之。
使用GET,您可以使用查询字符串将有限的数据发布到服务器,而且由于URL不能具有无限长,因此这些数据也是有限的。数据也显示在浏览器窗口中。
我已经看到,尝试从性能上同步doGet()方法是一件坏事。
你想做什么?每个请求都有自己的线程执行doGet()
方法。
https://stackoverflow.com/questions/17218699
复制相似问题