检查HTTP POST请求的内容类型到Java servlet [英] Checking Content-Type of HTTP POST Request to 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屋!