/* * Copyright (c) 1997, 2021 Oracle and/or its affiliates and others. * All rights reserved. * Copyright 2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jakarta.servlet.http; import jakarta.servlet.ServletResponse; import java.io.IOException; import java.util.Collection; import java.util.Map; import java.util.function.Supplier; /** * * Extends the {@link ServletResponse} interface to provide HTTP-specific functionality in sending a response. For * example, it has methods to access HTTP headers and cookies. * *
* The servlet container creates an HttpServletResponse
object and passes it as an argument to the
* servlet's service methods (doGet
, doPost
, etc).
*
*
* @author Various
*
* @see jakarta.servlet.ServletResponse
*
*/
public interface HttpServletResponse extends ServletResponse {
/**
* Adds the specified cookie to the response. This method can be called multiple times to set more than one cookie.
*
* @param cookie the Cookie to return to the client
*
*/
public void addCookie(Cookie cookie);
/**
* Returns a boolean indicating whether the named response header has already been set.
*
* @param name the header name
* @return true
if the named response header has already been set; false
otherwise
*/
public boolean containsHeader(String name);
/**
* Encodes the specified URL by including the session ID, or, if encoding is not needed, returns the URL unchanged. The
* implementation of this method includes the logic to determine whether the session ID needs to be encoded in the URL.
* For example, if the browser supports cookies, or session tracking is turned off, URL encoding is unnecessary.
*
*
* For robust session tracking, all URLs emitted by a servlet should be run through this method. Otherwise, URL * rewriting cannot be used with browsers which do not support cookies. * *
* If the URL is relative, it is always relative to the current HttpServletRequest.
*
* @param url the url to be encoded.
* @return the encoded URL if encoding is needed; the unchanged URL otherwise.
* @exception IllegalArgumentException if the url is not valid
*/
public String encodeURL(String url);
/**
* Encodes the specified URL for use in the sendRedirect
method or, if encoding is not needed, returns the
* URL unchanged. The implementation of this method includes the logic to determine whether the session ID needs to be
* encoded in the URL. For example, if the browser supports cookies, or session tracking is turned off, URL encoding is
* unnecessary. Because the rules for making this determination can differ from those used to decide whether to encode a
* normal link, this method is separated from the encodeURL
method.
*
*
* All URLs sent to the HttpServletResponse.sendRedirect
method should be run through this method.
* Otherwise, URL rewriting cannot be used with browsers which do not support cookies.
*
*
* If the URL is relative, it is always relative to the current HttpServletRequest. * * @param url the url to be encoded. * @return the encoded URL if encoding is needed; the unchanged URL otherwise. * @exception IllegalArgumentException if the url is not valid * * @see #sendRedirect */ public String encodeRedirectURL(String url); /** *
* Sends an error response to the client using the specified status and clears the buffer. The server defaults to * creating the response to look like an HTML-formatted server error page containing the specified message, setting the * content type to "text/html". The caller is not responsible for escaping or re-encoding the message * to ensure it is safe with respect to the current response encoding and content type. This aspect of safety is the * responsibility of the container, as it is generating the error page containing the message. The server will preserve * cookies and may clear or update any headers needed to serve the error page as a valid response. *
* ** If an error-page declaration has been made for the web application corresponding to the status code passed in, it * will be served back in preference to the suggested msg parameter and the msg parameter will be ignored. *
* ** If the response has already been committed, this method throws an IllegalStateException. After using this method, the * response should be considered to be committed and should not be written to. * * @param sc the error status code * @param msg the descriptive message * @exception IOException If an input or output exception occurs * @exception IllegalStateException If the response was committed */ public void sendError(int sc, String msg) throws IOException; /** * Sends an error response to the client using the specified status code and clears the buffer. * * The server will preserve cookies and may clear or update any headers needed to serve the error page as a valid * response. * * If an error-page declaration has been made for the web application corresponding to the status code passed in, it * will be served back the error page * *
* If the response has already been committed, this method throws an IllegalStateException. After using this method, the * response should be considered to be committed and should not be written to. * * @param sc the error status code * @exception IOException If an input or output exception occurs * @exception IllegalStateException If the response was committed before this method call */ public void sendError(int sc) throws IOException; /** * Sends a temporary redirect response to the client using the specified redirect location URL and clears the buffer. * The buffer will be replaced with the data set by this method. Calling this method sets the status code to * {@link #SC_FOUND} 302 (Found). This method can accept relative URLs;the servlet container must convert the relative * URL to an absolute URL before sending the response to the client. If the location is relative without a leading '/' * the container interprets it as relative to the current request URI. If the location is relative with a leading '/' * the container interprets it as relative to the servlet container root. If the location is relative with two leading * '/' the container interprets it as a network-path reference (see RFC * 3986: Uniform Resource Identifier (URI): Generic Syntax, section 4.2 "Relative Reference"). * *
* If the response has already been committed, this method throws an IllegalStateException. After using this method, the
* response should be considered to be committed and should not be written to.
*
* @param location the redirect location URL
* @exception IOException If an input or output exception occurs
* @exception IllegalStateException If the response was committed or if a partial URL is given and cannot be converted
* into a valid URL
*/
public void sendRedirect(String location) throws IOException;
/**
*
* Sets a response header with the given name and date-value. The date is specified in terms of milliseconds since the
* epoch. If the header had already been set, the new value overwrites the previous one. The containsHeader
* method can be used to test for the presence of a header before setting its value.
*
* @param name the name of the header to set
* @param date the assigned date value
*
* @see #containsHeader
* @see #addDateHeader
*/
public void setDateHeader(String name, long date);
/**
*
* Adds a response header with the given name and date-value. The date is specified in terms of milliseconds since the
* epoch. This method allows response headers to have multiple values.
*
* @param name the name of the header to set
* @param date the additional date value
*
* @see #setDateHeader
*/
public void addDateHeader(String name, long date);
/**
*
* Sets a response header with the given name and value. If the header had already been set, the new value overwrites
* the previous one. The containsHeader
method can be used to test for the presence of a header before
* setting its value.
*
* @param name the name of the header
* @param value the header value If it contains octet string, it should be encoded according to RFC 2047
* (http://www.ietf.org/rfc/rfc2047.txt)
*
* @see #containsHeader
* @see #addHeader
*/
public void setHeader(String name, String value);
/**
* Adds a response header with the given name and value. This method allows response headers to have multiple values.
*
* @param name the name of the header
* @param value the additional header value If it contains octet string, it should be encoded according to RFC 2047
* (http://www.ietf.org/rfc/rfc2047.txt)
*
* @see #setHeader
*/
public void addHeader(String name, String value);
/**
* Sets a response header with the given name and integer value. If the header had already been set, the new value
* overwrites the previous one. The containsHeader
method can be used to test for the presence of a header
* before setting its value.
*
* @param name the name of the header
* @param value the assigned integer value
*
* @see #containsHeader
* @see #addIntHeader
*/
public void setIntHeader(String name, int value);
/**
* Adds a response header with the given name and integer value. This method allows response headers to have multiple
* values.
*
* @param name the name of the header
* @param value the assigned integer value
*
* @see #setIntHeader
*/
public void addIntHeader(String name, int value);
/**
* Sets the status code for this response.
*
*
* This method is used to set the return status code when there is no error (for example, for the SC_OK or * SC_MOVED_TEMPORARILY status codes). * *
* If this method is used to set an error code, then the container's error page mechanism will not be triggered. If * there is an error and the caller wishes to invoke an error page defined in the web application, then * {@link #sendError} must be used instead. * *
* This method preserves any cookies and other response headers. * *
* Valid status codes are those in the 2XX, 3XX, 4XX, and 5XX ranges. Other status codes are treated as container * specific. * * @param sc the status code * * @see #sendError */ public void setStatus(int sc); /** * Gets the current status code of this response. * * @return the current status code of this response * * @since Servlet 3.0 */ public int getStatus(); /** * Gets the value of the response header with the given name. * *
* If a response header with the given name exists and contains multiple values, the value that was added first will be * returned. * *
* This method considers only response headers set or added via {@link #setHeader}, {@link #addHeader}, * {@link #setDateHeader}, {@link #addDateHeader}, {@link #setIntHeader}, or {@link #addIntHeader}, respectively. * * @param name the name of the response header whose value to return * * @return the value of the response header with the given name, or null if no header with the given name has * been set on this response * * @since Servlet 3.0 */ public String getHeader(String name); /** * Gets the values of the response header with the given name. * *
* This method considers only response headers set or added via {@link #setHeader}, {@link #addHeader}, * {@link #setDateHeader}, {@link #addDateHeader}, {@link #setIntHeader}, or {@link #addIntHeader}, respectively. * *
* Any changes to the returned
* This method considers only response headers set or added via {@link #setHeader}, {@link #addHeader},
* {@link #setDateHeader}, {@link #addDateHeader}, {@link #setIntHeader}, or {@link #addIntHeader}, respectively.
*
*
* Any changes to the returned
* The trailer header field value is defined as a comma-separated list (see Section 3.2.2 and Section 4.1.2 of RFC
* 7230).
*
* The supplier will be called within the scope of whatever thread/call causes the response content to be completed.
* Typically this will be any thread calling close() on the output stream or writer.
*
* The trailers that run afoul of the provisions of section 4.1.2 of RFC 7230 are ignored.
*
* The RFC requires the name of every key that is to be in the supplied Map is included in the comma separated list that
* is the value of the "Trailer" response header. The application is responsible for ensuring this requirement is met.
* Failure to do so may lead to interoperability failures.
* Collection
must not affect this HttpServletResponse
.
*
* @param name the name of the response header whose values to return
*
* @return a (possibly empty) Collection
of the values of the response header with the given name
*
* @since Servlet 3.0
*/
public CollectionCollection
must not affect this HttpServletResponse
.
*
* @return a (possibly empty) Collection
of the names of the headers of this response
*
* @since Servlet 3.0
*/
public Collection