- HttpResponse
- Writing HTML
- Headers
- Content-Type
- Writing Text
- Content-Length
- Writing Binary Data
- Redirecting to a Different URL
- HTTP-заголовки
- 6.2 User-Agent
- 6.3 Content-Type
- 6.4 Content-Length
- 6.5 Accept-Encoding
- MIME Type in Java
- MIME Types
- How to Find MIME type in Windows
- Servlet Application Example
- What is a Content Type?
- Headers
- Media Types
HttpResponse
The HttpServlet class request processing methods take two parameters.
For instance, here is the signature of the HttpServlet.doGet() method:
protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
In this text I will look at the HttpResponse object.
The purpose of the HttpResponse object is to represent the HTTP response your web application sends back to the browser, in response to the HTTP request the browser send to your web application.
The HttpResponse object has a lot of methods, so I will just cover the most commonly used here. The rest you can read about in the JavaDoc, if you are interested.
Writing HTML
To send HTML back to the browser, you have to obtain the a PrintWriter from the HttpResponse object. Here is how:
PrintWriter writer = response.getWriter(); writer.write("GET/POST response");
Headers
Just like the request object, the HttpRequest can contain HTTP headers. Headers must be set before any data is written to the response. You set a header on the response object like this:
response.setHeader("Header-Name", "Header Value");
As you can see, a response header is a name, value pair.
Content-Type
The Content-Type header is a response header that tells the browser the type of the content you are sending back to it. For instance, the content type for HTML is text/html . Similarly, if what you send back to the browser is plain text, you use the content type text/plain .
Here is how you set the Content-Type header on the HttpResponse object:
response.setHeader("Content-Type", "text/html");
Writing Text
You can write text back to the browser instead of HTML, like this:
response.setHeader("Content-Type", "text/plain"); PrintWriter writer = response.getWriter(); writer.write("This is just plain text");
First the Content-Type header is set to text/plain . Then a plain text string is written to the writer obtained from the response object.
Content-Length
The Content-Length header tells the browser how many bytes your servlet is sending back. If you are sending binary data back you need to set the content length header. Here is how:
response.setHeader("Content-Length", "31642");
Writing Binary Data
You can also write binary data back to the browser instead of text. For instance, you can send an image back, a PDF file or a Flash file or something like that.
Again, you will first have to set the Content-Type header to the type matching the data you are sending back. For instance, the content type for a PNG image is image/png .
You can search for «mime types» in your favourite search engine to find a list of mime types (content types), so you can find the mime type for the content you are sending back.
In order to write binary data back to the browser you cannot use the Writer obtained from response.getWriter() . Afterall, Writer ‘s are intended for text.
Instead you have to use the OutputStream obtained from the response.getOutputStream() method. Here is how:
OutputStream outputStream = response.getOutputStream(); outputStream.write(. );
Redirecting to a Different URL
You can redirect the browser to a different URL from your servlet. You cannot send any data back to the browser when redirecting. Here is how you redirect:
response.sendRedirect("http://jenkov.com");
HTTP-заголовки
Заголовки http-запроса – это фактически служебная информация для http-клиента и http-сервера. Но она очень важна, и, если ты в них совершенно не разбираешься, это частенько будет выходить тебе боком. Так что придется про них хотя бы почитать.
Все http-заголовки можно разделить на 4 основные группы:
# | Тип заголовка | Описание | Примечание |
---|---|---|---|
1 | General Headers | Общие заголовки | Используются в запросах и ответах |
2 | Request Headers | Заголовки запроса | Используются только в запросах |
3 | Response Headers | Заголовки ответа | Используются только в ответах |
4 | Entity Headers | Заголовки сущности | Сопровождают каждую сущность сообщения |
6.2 User-Agent
Самый важный и популярный заголовок – это User-Agent. Это специальная строка, которая описывает, какой клиент выполняет запрос на сервер. Такое себе имя клиента.
Часто сервер немного подстраивает свой ответ под запрашивающего. Например, если из запроса ясно, что запрос пришел из браузера мобильного телефона, то ему можно отдать мобильную версию HTML-страницы.
Спам-боты, менеджеры закачек и некоторые браузеры нередко шлют подложные User-Agent-строки, чтобы выдать себя за порядочных клиентов. Эта ситуация известна, как подмена или подделка пользовательского агента (user agent spoofing).
Например, мой User-Agent выглядит сейчас так:
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
В нем содержится информация о браузере, операционной системе и web-движке браузера.
6.3 Content-Type
Второй по популярности заголовок – это Content-Type. Он используется для того, чтобы определить MIME тип ресурса, который отдает сервер.
Еще на заре интернета для удобства были стандартизированы типы передаваемого медиа контента. Их называют Internet Media Types или сокращенно MimeTypes. Они делятся на 9 категорий:
Категория | Тип | Описание |
---|---|---|
audio | audio/mp4 | Аудио-файл в формате mp4 |
audio/aac | Аудио-файл в формате AAC | |
image | image/gif | Картинка gif |
image/jpeg | Картинка jpeg | |
image/png | Картинка png | |
text | text/css | CSS-файл |
text/html | HTML-файл | |
video | video/mpeg | Video-файл в формате mpeg |
video/webm | Video-файл в формате webm | |
video/3gpp | Video-файл в формате 3gpp | |
application | application/x-www-form-urlencoded | Закодированные данные |
application/zip | Архив zip | |
application/javascript | JavaScript | |
application/xml | XML |
Обычно сервер знает, какие данные он отдает. Но если ты самостоятельно генерируешь ответ сервера своим кодом, то тебе нужно указать тип ответа (Content-Type) твоего сервера.
6.4 Content-Length
Этот заголовок задает длину ответа сервера. Если по-простому, то размер отдаваемого файла. Вручную этот параметр устанавливать не нужно. Хотя бывает полезно посмотреть на то, что отдал сервер, если по каким-то причинам ответ пришел не весь.
6.5 Accept-Encoding
С помощью этого заголовка клиент может указать серверу, что он поддерживает различные алгоритмы сжатия контента. Таким образом сервер может сначала заархивировать контент, например, zip-архивом, затем переслать его клиенту и клиент сможет правильно восстановить оригинальный контент.
Преимущество архивации состоит в том, что чем меньше файл, тем быстрее передается. Минусы архивации – дополнительная нагрузка на клиент и на сервер. Архивация имеет смысл при передаче больших файлов и часто не имеет смысла при передаче маленьких.
Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5
Где deflate и gzip – это поддерживаемые алгоритмы сжатия данных, а q обозначает степень сжатия.
MIME Type in Java
MIME Type in Java | The MIME represents Multipurpose Internet Mail Extension and is also called a content type. A MIME type is a label used to identify a type of data. It is used so the software can know how to handle the data. It serves the same purpose on the Internet that file extensions do on Microsoft Windows.
The servlet component gives instruction to the browser along with the response (output) through the response object, web container, webserver to display the received output/response in the MIME type format.
Based on this content type instruction, the browser software becomes ready to display the web page in different formats on the browser. Example:-
res.setContentType("text/html");
In this example, the servlet component gives instructions to the browser to treat the received output as HTML tags-based text content. So, the web page will be displayed on the browser by recognizing the HTML tags of the output text.
In most of the browsers “text/html” will be taken as the default MIME type. Therefore if we don’t set any MIME type explicitly in our servlet component then it will be displayed in HTML format.
MIME Types
Some of the popular MIME type in Java while working with web applications are,
- application/vnd.ms-excel
- application/jar
- application/pdf
- application/octet-stream
- application/x-zip
- images/jpeg
- images/png
- images/gif
- audio/mp3
- video/mp4
- video/quicktime and e.t.c.
IANA is the official registry of MIME media types and maintains a list of all the official MIME types, see the list here.
How to Find MIME type in Windows
In the Windows operating system, we can find all available MIME types by using regedit (Registry Editor) tool. There we can get MIME types of different file types.
We can get to through:- Open run (WinKey + R) => Search “regedit”. It will open the registry editor. Inside the registry editor, in the “HKEY_CLASSES_ROOT” folder, all extensions are available. Most of those extensions don’t have any MIME type.
Servlet Application Example
Develop a web application having multiple servlet components generating the response in different formats.
See the code at GitHub. In this example, some results (Excel and Word content type) can’t be displayed directly to the browser. After giving a request to those components, the result will be downloaded to our computer.
If you enjoyed this post, share it with your friends. Do you want to share more information about the topic discussed above or do you find anything incorrect? Let us know in the comments. Thank you!
What is a Content Type?
Content types also known as MIME type or media types are a two part identifier for file formats. The HTTP header Content-Type is responsible for telling the HTTP client or server what type of data is being sent.
Headers
Two main headers are involved when it comes to content types
- Accept — When a HTTP client requests data from a server it can send a comma separated list of media types. For example the headers value could be text/html, text/plain. This hints to the server what the client is looking for. Basically the client is asking the server to respond with text/html and if it cannot handle that try responding with text/plain. Whether or not the server can handle or will honor this is up to the server.
- Content-Type — The content type header tells the client or server what format the data is being transferred in. If the client asked for text/html and the server handled it properly the data should come back with the Content-Type: text/html header. This header is how your browser knows when to render the html vs just displaying raw text. This is also used for images / files.
$ curl -v http://www.google.com * Rebuilt URL to: http://www.google.com/ * Trying 172.217.1.68. * Connected to www.google.com (172.217.1.68) port 80 (#0) > GET / HTTP/1.1 > Host: www.google.com > User-Agent: curl/7.49.1 > Accept: */* > < HTTP/1.1 200 OK < Date: Tue, 10 Jan 2017 02:42:41 GMT < Expires: -1 < Cache-Control: private, max-age=0 < Content-Type: text/html; charset=ISO-8859-1
Notice the Accept: */*, This means accept any format. The Content-Type: text/html header tells the client the server responded with HTML.
Media Types
- text/plain - Simple Raw text
- text/html - Standard HTML, when a browser gets this media type it knows to render the page as HTML instead of raw text. This includes fetching external files such as javascript, css, and images.
- application/octet-stream - A binary file format often used to download files. If a browser gets this media type it automatically downloads the file instead of trying to display / render it.
- application/json - The JSON data format.
- application/pdf - PDF file.
- image/[png,jpeg,gif] - Standard image formats.
These are only some of the formats. As you can see the difference between rendering html vs showing raw text vs downloading a file is all controlled with a simple header. Handling content types with Undertow