spring mvc error 400:客户端发送的请求在语法上是不正确的

时间:2017-09-25 11:14:13

标签: spring model-view-controller syntax request client

我在spring mvc项目的控制器中有方法:

//download resume
//----------------------------------------------------------------------  
 //@RequestMapping(value="/download/{fileName}",method=RequestMethod.GET)
 @RequestMapping(value="/downlo",method=RequestMethod.GET)
public void downloadPDFResource(HttpServletRequest request,
        HttpServletResponse response){
       // @PathVariable("fileName") String fileName) {


    //If user is not authorized - he should be thrown out from here itself

    String fileName="Ente Kadha - Madhavikkutty.pdf";

    //Career c=cardao.retrieveProfile(a_id);
    //c.setA_id(a_id);
    //String fileName=c.getResumeDoc();

    System.out.println("filename i got :"+fileName);

    //Authorized user will download the file
    String dataDirectory = request.getServletContext().getRealPath("/WEB-INF/downloads/");
    Path file = Paths.get(dataDirectory, fileName);
    if (Files.exists(file)) {
        response.setContentType("application/pdf");
        response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
        try {
            Files.copy(file, response.getOutputStream());
            response.getOutputStream().flush();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    else
    {
        System.out.println("\n\nFile not found!!\n\n");
        System.out.println(file);
    }
}

此代码实际上有效。文件下载成功当我向上述控制器发送请求时,从下面给出的jsp页面:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Hello</title>
    </head>
    <body>
        <center>

            <h3 name="fileName">Ente Kadha - Madhavikkutty.pdf</h3>
            <h2><a href="downlo">Click here to download the file</a></h2>
        </center>
    </body>
</html>

但是当下载请求从不同的jsp页面转到同一个控制器时,如下所示:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html;charset=UTF8">
            <title>Profile</title>
        </head>
        <body>

        <table>

            <th><h3>${profile.name}</h3></th>
        <tr>
            <td>Application Id :</td>
            <td>${profile.a_id}</td>
        </tr>
        <tr>
            <td>Name :</td>
            <td>${profile.name}</td>
        </tr>
        <tr>
            <td>Address :</td>
            <td>${profile.address}</td>
        </tr>
        <tr>
            <td>Email:</td>
            <td>${profile.email}</td>
        </tr>
        <tr>
            <td>Phone:</td>
            <td>${profile.phone}</td>
        </tr>
        <tr>
            <td>Vacancy id:</td>
            <td></td>
        </tr>
        <tr>
            <td>Date Applied :</td>
            <td>${profile.dateApplied}</td>
        </tr>
        <tr>
            <td>Resume :  ${profile.resumePath}${profile.resumeDoc} </td>
            <td><a href="downlo">Click here to download the file</a></td> 
        </tr>

    </table>

</body>
</html>

但现在,这给了我一个错误:

  

HTTP状态400 -

     

输入状态报告

     

消息

     

description客户端发送的请求是语法上的   不正确。

     

Apache Tomcat / 8.0.3

我真的很困惑为什么会出现这个错误?!! 我请求的方式是一样的,控制器方法是相同的,甚至在两种情况下要下载的文件都是相同的!!

仍然发生错误。任何人都可以帮助我吗? PLS ....

1 个答案:

答案 0 :(得分:0)

根据您的问题(和评论)中发布的信息,我认为如下:

  • 在您的控制器中,downloadPDFResource方法正在侦听网址:/downlo。如果您的控制器在其类定义上没有其他@RequestMapping注释,则意味着可以从应用程序的根目录访问下载URL,例如:localhost:8084/IntelliLabsWeb/downlo。你能证实一下吗?

  • 由于您在<a>标记中使用了相对链接,因此对于第一种情况,文件恰好位于应用程序的根目录中,因此<a>标记指向正确的下载URL :localhost:8084/IntelliLabsWeb/downlo

  • 但是,在第二种情况下,您的文件可能位于最可能名为oneProfile的子文件夹中,<a href>标记的相对链接指向localhost:8084/IntelliLabsWeb/oneProfile/downlo,这是没有从downloadPDFResource方法提供,因此您收到错误400。

尝试将您的第二个链接更改为

<a href="../downlo">Click here to download the file</a>