Проверка содержимого-типа запроса HTTP POST к сервлету Java

#java #httpurlconnection

#java #httpurlconnection

Вопрос:

Я написал простой сервлет, который принимает запросы HTTP POST и отправляет короткий ответ. Вот код для сервлета:

 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

    }

}
  

И вот клиент, который я использую для отправки запроса:

 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
     }
}
  

Проблема, с которой я сталкиваюсь, заключается в том, что при запуске клиентской программы я получаю следующий вывод:

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

Я попытался вызвать request.getContentType() и получил «текст / xml» в качестве вывода. Просто пытаюсь выяснить, почему строка не совпадает.

Ответ №1:

Вы неправильно сравниваете строки.

 if (strContentType != "text/xml")
  

Строки не являются примитивами, они являются объектами. При использовании != для сравнения двух объектов он будет проверять, только если они не указывают на одну и ту же ссылку. Однако вас скорее интересует сравнение содержимого двух разных строковых ссылок, а не если они указывают на одну и ту же ссылку.

Затем вы должны использовать equals() метод для этого:

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

Или, лучше, избегать NullPointerException , если Content-Type заголовок отсутствует (и, следовательно, становится null ):

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

Комментарии:

1. является ли это правильным способом определения contenttype запроса HttpServletRequest? Я не очень доволен этим, потому что, когда вы ищете точные совпадения строк, «text / xml» отличается от «text / xml; charset = UTF-8» и отличается от «text / xml; charset = UTF-8» и отличается от «application / xml». итак, есть ли способ чисто просто отличать, например, запросы xml от запросов формы? таким образом, не покрывая вручную все разновидности строк, которые могут представлять разные типы запросов

2. Я получил нарушение приведения в моем методе doPost за то, что он не вызывал метод getContentType внутри … могу ли я использовать его просто по-своему try { String msg=»»; String strContentType = req.getContentType(); if (!»text / xml».equals(strContentType)) msg=»Недопустимый MIME-тип»; }catch(исключение e) { e.printStackTrace(); }

3. как он ведет себя, если getContentType возвращает null