检查HTTP POST请求的内容类型到Java servlet [英] Checking Content-Type of HTTP POST Request to Java servlet

查看:239
本文介绍了检查HTTP POST请求的内容类型到Java servlet的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一个简单的servlet,它接受HTTP POST请求并发回一个简短的响应。这是servlet的代码:

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>

我试过调用request.getContentType()并得到text / xml作为输出。只是想弄清楚为什么字符串不匹配。

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.

推荐答案

你正在以错误的方式比较字符串。

You're comparing strings the wrong way.

if (strContentType != "text/xml")

字符串不是原语,它们是< a href =http://download.oracle.com/javase/6/docs/api/java/lang/Object.html\"rel =noreferrer>对象。当使用!= 来比较两个对象时,它只会测试它们是否指向相同的引用。但是,您对比较两个不同字符串引用的内容非常感兴趣,而不是它们指向相同的引用。

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"))

或者,更好的是,如果 Content-Type 标头不存在,则避免 NullPointerException (因此变为 null ):

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

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

这篇关于检查HTTP POST请求的内容类型到Java servlet的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆