我正在处理的工具只能发送GET请求,我需要使用请求中包含的信息来处理繁重的操作。然后,这些操作返回一个String,其中包含我将用于重定向的URL。
在做了一些研究之后,我发现doGet()方法更多地用于预处理请求,而doPost()可以用于后处理。
有什么办法可以使用doGet()方法进行这些繁重的操作?如果我必须使用doPost()方法,如何将我的请求“转”为POST请求?
感谢。
编辑:我已经尝试在doGet方法中处理这些繁重的操作。但似乎servlet不会等到生成用于重定向的url String。我已经读过尝试在性能方面同步你的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 );
}
}
答案 0 :(得分:1)
我已经尝试在doGet方法中处理这些繁重的操作。但似乎servlet不会等到我用于重定向的url String生成
听起来好像你正在开一个新线程并完全忘记它。这在Java EE环境中是一个非常糟糕的主意。不要那样做。只需在同一个线程中进行处理(即根本不创建new Thread()
)。如果你真的想以异步方式进行,那么你应该使用例如EJB上的@Asynchronous
方法,然后使用轮询或推送来通知客户端进度/结果。
无论您是在GET还是POST请求中执行此操作都无关紧要。关键是,GET请求是幂等的,可收藏的,可重新执行的,每次都具有完全相同的结果。考虑SQL SELECT
查询。 POST请求不是。它们将用于操纵服务器端的数据。考虑执行SQL UPDATE
或DELETE
查询。您不希望在每个F5印刷机上修改或删除您的数据,或者甚至在搜索机器人出现索引GET链接时,对吗?
答案 1 :(得分:0)
如果您想将请求“转”为POST
请求,您只需从doPost
调用doGet
方法,但如果您想要{{}},则不会更改任何内容{1}}功能。
如果您的工具正在发送大量请求参数,那么所有参数都将附加在url中,这根本不安全。
如果POST
请求,可成功管理的网址长度也会因容器而异。
正如The New Idiot所说,幂等性意味着一遍又一遍地执行相同的操作而不会产生任何副作用。
方法GET
是幂等的,因为它只是要求资源并反复请求资源不会导致任何问题,但GET
包括表单提交和多次输入表单数据可以造成严重问题。
尝试考虑一下您的资金交易多次购买单个onlien 时的例子。
资源的简单链接是POST
个请求,您可以将它们加入书签并一遍又一遍地请求。
GET请求的安全性较低,因为所有参数都在网址中可见,而GET
请求更安全,因为它们未显示在网址的任何位置。
大多数情况下,POST
网址可以是2048个字符,这意味着您可以发送有限的数据。
在GET
方法的情况下,要发送的数据没有限制
答案 2 :(得分:0)
恕我直言,重度操作没有POST
和GET
方法的分类。GET
是幂等的,而POST
不是。 GET是幂等意义,因此多次应用的相同操作应产生相同的结果,而POST则具有副作用。
GET顾名思义用于从服务器获取内容,而POST应该用于将数据发布到服务器以进行进一步处理。但是,没有人可以阻止你实现非幂等GET方法。
根据Wikipedia:
GET 请求指定资源的表示。请注意,GET不应用于导致副作用的操作,例如使用它在Web应用程序中执行操作。其中一个原因是机器人或爬虫可以任意使用GET,这不应该考虑请求应该产生的副作用。
POST 将要处理的数据(例如,从HTML表单)提交到标识的资源。数据包含在请求正文中。这可能会导致创建新资源或更新现有资源或两者。
使用GET,您可以使用查询字符串将有限数据发布到服务器,并且由于URL不能具有无限长度,因此它们也受到限制。此外,数据显示在浏览器窗口中。
我已经读过尝试在性能方面同步你的doGet()方法是一件坏事。
你想做什么?每个请求都有自己的线程执行doGet()
方法。