0

The tool I'm working on can only send GET requests, and I need to process heavy operations using the information contained within the request. These operations then return a String containing a URL I will use for redirection.

After doing some researches, I've found that doGet() method is rather used for pre-processing a request, while doPost() can be used for post-processing.

Is there any way I can do these heavy operations using the doGet() method ? If I have to use the doPost() method, how can I "turn" my request into a POST request ?

Thanks.

Edit : I've already tried to process these heavy operations within the doGet method. But it seems the servlet doesn't wait until the url String I use for redirection is generated. I've read it's a bad thing to try to synchronize your doGet() method performance-wise.

Edit 2 - About what I'm trying to do : The tool I'm working on is an Oracle solution. You can launch custom actions within the client, including web applications. Launching a custom action will send a GET request to the application, containing all the information about the page from which you launched the application (user, item selected, etc) and the application then uses this information to process the heavy operations I talked about. Operations consist of creating a new session on the Oracle client using the same IDs, making queries based on the item selected, creating XML Data and even using an external program located on the Oracle server. Finally, it returns a download URL from where you can download a PDF report, and I use this URL to redirect the application.

Here's the servlet code :

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 );
    }

}
4

3 回答 3

1

我已经尝试在 doGet 方法中处理这些繁重的操作。但似乎 servlet 并没有等到生成我用于重定向的 url 字符串

听起来好像您正在触发一个新线程并完全忘记它。在 Java EE 环境中,这是一个非常糟糕的主意。不要那样做。只需在同一个线程中进行处理(即根本不创建 a new Thread())。如果您真的打算异步执行此操作,那么您应该@Asynchronous在 EJB 上使用 eg 方法,然后使用轮询或推送来通知客户端有关进度/结果的信息。

无论您是在 GET 还是 POST 请求中执行此操作都没有关系。关键是,GET 请求是幂等的、可收藏的、可重复执行的,每次都具有完全相同的结果。想想一个 SQLSELECT查询。POST 请求不是。它们将用于在服务器端操作数据。考虑执行 SQLUPDATEDELETE查询。您不希望您的数据在每次按下 F5 时都被修改或删除,甚至当搜索机器人出现索引 GET 链接时,对吗?

于 2013-06-20T16:34:04.877 回答
0

恕我直言,没有基于重型操作POST的分类和方法。是幂等的,而不是。GET 是幂等的,因此多次应用相同的操作应该产生相同的结果,而与 POST 一样,它有副作用。GETGETPOST

GET 顾名思义是用于从服务器取回一些东西,而 POST 应该用于将数据发布到服务器以供进一步处理。但是,没有人可以阻止您实现非幂等 GET 方法。

根据维基百科

GET请求指定资源的表示。请注意,GET 不应用于会导致副作用的操作,例如在 Web 应用程序中使用它来执行操作。这样做的一个原因是 GET 可能被机器人或爬虫任意使用,它们不需要考虑请求应该引起的副作用。

POST将要处理的数据(例如,来自 HTML 表单)提交给识别的资源。数据包含在请求的正文中。这可能导致创建新资源或更新现有资源或两者兼而有之。

使用 GET,您可以使用查询字符串将有限的数据发布到服务器,并且它们再次受到限制,因为 URL 不能是无限长的。数据也显示在浏览器窗口中。

我已经读过尝试在性能方面同步您的 doGet() 方法是一件坏事。

你想做什么 ?每个请求都有自己的线程执行该doGet()方法。

于 2013-06-20T16:22:51.843 回答
0

如果您想将请求“转换”为POST请求,您可以简单地调用该doPost方法,但如果您想要该功能doGet,这不会改变任何内容。POST

如果您的工具正在发送大量请求参数,那么所有参数都将附加在 url 中,这根本不安全。

GET请求的情况下,可以成功管理的 url 的长度也因容器而异。

正如 The New Idiot 所说,幂等性意味着一遍又一遍地执行相同的操作而不会产生任何副作用

该方法GET是幂等的,因为它只是请求资源并且一遍又一遍地请求资源不会导致任何问题,但是POST包括表单提交和多次输入表单数据会导致严重的问题。 当您的货币交易发生不止一次时,请尝试考虑这个例子

资源的简单链接是GET请求,您可以为它们添加书签并一遍又一遍地请求。

GET 请求不太安全,因为所有参数都在 url 中可见,而POST请求更安全,因为它们不会显示在 url 中的任何位置。

大多数情况下,GETurl 可以是 2048 个字符,这意味着您可以发送有限的数据。在POST方法的情况下,发送的数据没有限制

于 2013-06-20T16:19:15.167 回答