【问题标题】:How to use the HttpRequestWrapper with a Filter in order to reuse a Request如何将 HttpRequestWrapper 与过滤器一起使用以重用请求
【发布时间】:2015-01-01 17:27:38
【问题描述】:

我需要实现 HttpRequestWrapper 和 Filter 才能重用我的请求。这是因为我首先需要请求查看用户选择的内容,其次需要将文件上传到 tomcat 服务器。现在我有一个为每个用户运行的 Servlet 上传文件“public class UploadFile extends HttpServlet {}”。一旦它返回用户选择的内容,它就会变为空,我无法将文件上传到服务器。只是想知道为了实现 HttpRequestWrapper,我是否必须大量更改我的代码?我是否从“公共类 UploadFile 扩展 HttpServlet {}”更改为“公共类 UploadFile 扩展 HttpRequestWrapper {}”?

【问题讨论】:

  • 你应该永远重用请求对象。它仅对当前请求有效。如果您需要保留一些数据,则将其存储在用户会话中。
  • 你能给我一个如何做到这一点的例子吗,例如我通过“Part myStringPart = request.getPart("ConvertFile");”获取请求信息然后在我的上传方法中,我有“items = upload.parseRequest(request);”这一行但第二个请求为空,因此它不会上传文件。如何实施会话来解决此问题?
  • 不看一些代码是不可能的。请使用您目前编写的代码更新您的问题。
  • 我添加了我的代码作为答案,因为我没有足够的空间。请看下面谢谢你看我很感激。

标签: http servlets httprequest httpresponse


【解决方案1】:
So firstly I check the parameters to see which checkbox has been ticked : 

String ConvertFile = request.getParameter("ConvertFile"); 

String Powershell = request.getParameter("Powershell");

String LMBackup = request.getParameter("LM_Backup");

String Restful_API = request.getParameter("Restful_API");        

if (Powershell != null) {
            Powershell = request.getParameter("Powershell");
        } 

if (LMBackup != null) {
            LMBackup = request.getParameter("LM_Backup");
        }

if (Restful_API != null) {
            Restful_API = request.getParameter("Restful_API");
        }



if (ConvertFile != null && LMBackup == null && Powershell != null && Restful_API == null)
 {
            System.out.println(ConvertFile + " and " + Powershell + " selected");

doUpload(request, response); //Here the request that is being passed is now null because I've used it previously

response.sendRedirect("index.jsp");

        }

//上传方法如图 //Items 保持为空,因为请求已经被使用过

protected void doUpload(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        try {
            System.out.println("Uploading File");
            boolean ismultipart = ServletFileUpload.isMultipartContent(request);
            System.out.println(request + " <<<<<<<<<<<<<+++++++++++++");
            if (ismultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                List<FileItem> items = null;
                try {
                    items = upload.parseRequest(request);
                    System.out.println(items + "<<<<<<<<<--------------");
                } catch (Exception e) {
                    System.out.println(e);
                }

【讨论】:

  • 您确定请求对象为空吗?你得到的错误是什么,它发生在哪一行?那一行是什么语句?
  • items = upload.parseRequest(request); //items 在这一行之后保持为空。如果我在 request.getParameter 之前调用上传,items 会保存所有文件信息。可能是 request.getParameter 命令正在消耗我的输入流
  • 提交文件的表单是否有正确的内容类型?此外,您不应该both 使用request.getParameter ServletFileUpload。查看this post 以获取使用ServletFileUpload 时如何获取表单字段的示例。
猜你喜欢
  • 2021-04-02
  • 2019-09-26
  • 2012-01-28
  • 1970-01-01
  • 2014-01-22
  • 2017-02-27
  • 2018-12-29
  • 2015-11-10
相关资源
最近更新 更多