Checking Content-Type of HTTP POST Request to Java servlet

被刻印的时光 ゝ 提交于 2019-12-12 08:58:19

问题


I've written a simple servlet that accepts HTTP POST requests and sends back a short response. Here's the code for the servlet:

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.*;

/**
 * Servlet implementation class MapleTAServlet
 */
@WebServlet(description = "Receives XML request text containing grade data and returns     response in XML", urlPatterns = { "/MapleTAServlet" })
public class MapleTAServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private Log log = LogFactory.getLog(MapleTAServlet.class);

   /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {       
        String strXMLResponse = "<Response><code>";
        String strMessage = "";
        int intCode = 0;
        ServletOutputStream stream = null;
        BufferedInputStream buffer = null;

    try
    {   
        String strContentType = request.getContentType();   

        // Make sure that the incoming request is XML data, otherwise throw up a red flag
        if (strContentType != "text/xml")
        {
            strMessage = "Incorrect MIME type";
        }
        else
        {
            intCode = 1;        
        } // end if

        strXMLResponse += intCode + "</code><message>" + strMessage + "</message></Response>";

        response.setContentType("text/xml");
        response.setContentLength(strXMLResponse.length());

        int intReadBytes = 0;

        stream = response.getOutputStream();

        // Converts the XML string to an input stream of a byte array
        ByteArrayInputStream bs = new ByteArrayInputStream(strXMLResponse.getBytes());
        buffer = new BufferedInputStream(bs);

        while ((intReadBytes = buffer.read()) != -1)
        {
            stream.write(intReadBytes);
        } // end while
    }
    catch (IOException e)
    {
        log.error(e.getMessage());
    }
    catch (Exception e)
    {
        log.error(e.getMessage());
    }
    finally 
    {
        stream.close();
        buffer.close();
    } // end try-catch

    }

}

And here's the client that I'm using to send the request:

import java.net.HttpURLConnection;
import java.net.URL;
import java.io.*;

public class TestClient 
{

   /**
    * @param args
    */
    public static void main(String[] args) 
    {
        BufferedReader inStream = null;

        try
            {
        // Connect to servlet
        URL url = new URL("http://localhost/mapleta/mtaservlet");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        // Initialize the connection 
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setRequestMethod("POST");
        conn.setUseCaches(false);
        conn.setRequestProperty("Content-Type", "text/xml");
        //conn.setRequestProperty("Connection", "Keep-Alive");

        conn.connect();

        OutputStream out = conn.getOutputStream();

        inStream = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        String strXMLRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Request></Request>";
        out.write(strXMLRequest.getBytes());
        out.flush();
        out.close();

        String strServerResponse = "";

        System.out.println("Server says: ");
        while ((strServerResponse = inStream.readLine()) != null)
        {
            System.out.println(strServerResponse);
        } // end while

        inStream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        } // end try catch
     }
}

The issue I'm having is that when I run the client program, I'm getting the following output:

Server says: 
<Response><code>0</code><message>Incorrect MIME type</message></Response>

I've tried calling request.getContentType() and have gotten "text/xml" as the output. Just trying to figure out why the string isn't matching up.


回答1:


You're comparing strings the wrong way.

if (strContentType != "text/xml")

Strings are not primitives, they are objects. When using != to compare two objects, it will only test if they do not point to the same reference. However, you're rather interested in comparing the content of two different string references, not if they point to the same reference.

You should then use the equals() method for this:

if (!strContentType.equals("text/xml"))

Or, better, to avoid NullPointerException if the Content-Type header is not present (and thus becomes null):

if (!"text/xml".equals(strContentType))


来源:https://stackoverflow.com/questions/7663457/checking-content-type-of-http-post-request-to-java-servlet

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!