📄 cmsflexresponse.java
字号:
}
header.append(CmsDateUtil.getOldCookieDate(time));
} else {
// new RFC 2109 format
header.append("; Max-Age=");
header.append(cookie.getMaxAge());
}
}
// path
if (cookie.getPath() != null) {
header.append("; Path=");
header.append(cookie.getPath());
}
// secure
if (cookie.getSecure()) {
header.append("; Secure");
}
addHeader("Set-Cookie", header.toString());
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, long)
*/
public void addDateHeader(String name, long date) {
addHeader(name, CmsDateUtil.getHeaderDate(date));
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, java.lang.String)
*/
public void addHeader(String name, String value) {
if (isSuspended()) {
return;
}
if (CmsRequestUtil.HEADER_CONTENT_TYPE.equalsIgnoreCase(name)) {
setContentType(value);
return;
}
if (m_cachingRequired && !m_includeMode) {
addHeaderList(m_bufferHeaders, name, value);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_FLEXRESPONSE_ADDING_HEADER_TO_ELEMENT_BUFFER_2,
name,
value));
}
}
if (m_writeOnlyToBuffer) {
addHeaderList(m_headers, name, value);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_FLEXRESPONSE_ADDING_HEADER_TO_HEADERS_2,
name,
value));
}
} else {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_FLEXRESPONSE_ADDING_HEADER_TO_PARENT_RESPONSE_2,
name,
value));
}
m_res.addHeader(name, value);
}
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, int)
*/
public void addIntHeader(String name, int value) {
addHeader(name, String.valueOf(value));
}
/**
* Adds an inclusion target to the list of include results.<p>
*
* Should be used only in inclusion-scenarios
* like the JSP cms:include tag processing.<p>
*
* @param target the include target name to add
* @param parameterMap the map of parameters given with the include command
*/
public void addToIncludeList(String target, Map parameterMap) {
if (m_includeList == null) {
m_includeList = new ArrayList(10);
m_includeListParameters = new ArrayList(10);
}
m_includeListParameters.add(parameterMap);
m_includeList.add(target);
}
/**
* Returns the value of the encoding used for this response.<p>
*
* @return the value of the encoding used for this response
*/
public String getEncoding() {
return m_encoding;
}
/**
* Provides access to the header cache of the top wrapper.<p>
*
* @return the Map of cached headers
*/
public Map getHeaders() {
return m_headers;
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.ServletResponse#getOutputStream()
*/
public ServletOutputStream getOutputStream() throws IOException {
if (m_out == null) {
initStream();
}
return m_out;
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.ServletResponse#getWriter()
*/
public PrintWriter getWriter() throws IOException {
if (m_writer == null) {
initStream();
}
return m_writer;
}
/**
* Returns the bytes that have been written on the current writers output stream.<p>
*
* @return the bytes that have been written on the current writers output stream
*/
public byte[] getWriterBytes() {
if (isSuspended()) {
// No output whatsoever if the response is suspended
return new byte[0];
}
if (m_cacheBytes != null) {
// Optimization for cached "leaf" nodes, here I re-use the array from the cache
return m_cacheBytes;
}
if (m_out == null) {
// No output was written so far, just return an empty array
return new byte[0];
}
if (m_writer != null) {
// Flush the writer in case something was written on it
m_writer.flush();
}
return m_out.getBytes();
}
/**
* This flag indicates if the response is suspended or not.<p>
*
* A suspended response mut not write further output to any stream or
* process a cache entry for itself.<p>
*
* Currently, a response is only suspended if it is redirected.<p>
*
* @return true if the response is suspended, false otherwise
*/
public boolean isSuspended() {
return m_suspended;
}
/**
* Returns <code>true</code> if this response has been constructed for the
* top level element of this request, <code>false</code> if it was
* constructed for an included sub-element.<p>
*
* @return <code>true</code> if this response has been constructed for the
* top level element of this request, <code>false</code> if it was
* constructed for an included sub-element.
*/
public boolean isTopElement() {
return m_isTopElement;
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String)
*/
public void sendRedirect(String location) throws IOException {
// Ignore any redirects after the first one
if (isSuspended() && (!location.equals(m_bufferRedirect))) {
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXRESPONSE_SENDREDIRECT_1, location));
}
if (m_cachingRequired && !m_includeMode) {
m_bufferRedirect = location;
}
if (!m_cachingRequired) {
// If caching is required a cached entry will be constructed first and redirect will
// be called after this is completed and stored in the cache
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXRESPONSE_TOPRESPONSE_SENDREDIRECT_1, location));
}
if (LOG.isWarnEnabled()) {
if (m_controller.getResponseStackSize() > 2) {
// sendRedirect in a stacked response scenario, this may cause issues in some appservers
LOG.warn(Messages.get().getBundle().key(
Messages.LOG_FLEXRESPONSE_REDIRECTWARNING_3,
m_controller.getCmsResource().getRootPath(),
m_controller.getCurrentRequest().getElementUri(),
location));
}
}
// use top response for redirect
HttpServletResponse topRes = m_controller.getTopResponse();
// add all headers found to make sure cookies can be set before redirect
processHeaders(getHeaders(), topRes);
topRes.sendRedirect(location);
}
m_controller.suspendFlexResponse();
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.ServletResponse#setContentType(java.lang.String)
*/
public void setContentType(String type) {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXRESPONSE_SETTING_CONTENTTYPE_1, type));
}
// only if this is the "Top-Level" element, do set the content type
// otherwise an included JSP could reset the type with some unwanted defaults
if (!m_typeSet && m_isTopElement) {
// type must be set only once, otherwise some Servlet containers (not Tomcat) generate errors
m_typeSet = true;
super.setContentType(type);
return;
}
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, long)
*/
public void setDateHeader(String name, long date) {
setHeader(name, CmsDateUtil.getHeaderDate(date));
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, java.lang.String)
*/
public void setHeader(String name, String value) {
if (isSuspended()) {
return;
}
if (CmsRequestUtil.HEADER_CONTENT_TYPE.equalsIgnoreCase(name)) {
setContentType(value);
return;
}
if (m_cachingRequired && !m_includeMode) {
setHeaderList(m_bufferHeaders, name, value);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_FLEXRESPONSE_SETTING_HEADER_IN_ELEMENT_BUFFER_2,
name,
value));
}
}
if (m_writeOnlyToBuffer) {
setHeaderList(m_headers, name, value);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_FLEXRESPONSE_SETTING_HEADER_IN_HEADERS_2,
name,
value));
}
} else {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_FLEXRESPONSE_SETTING_HEADER_IN_PARENT_RESPONSE_2,
name,
value));
}
m_res.setHeader(name, value);
}
}
/**
* Method overlodad from the standard HttpServletRequest API.<p>
*
* @see javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, int)
*/
public void setIntHeader(String name, int value) {
setHeader(name, "" + value);
}
/**
* Sets buffering status of the response.<p>
*
* This must be done before the first output is written.
* Buffering is needed to process elements that can not be written
* directly to the output stream because their sub - elements have to
* be processed seperatly. Which is so far true only for JSP pages.<p>
*
* If buffering is on, nothing is written to the output stream
* even if streaming for this resonse is enabled.<p>
*
* @param value the value to set
*/
public void setOnlyBuffering(boolean value) {
m_writeOnlyToBuffer = value && !m_controller.isForwardMode();
if (m_writeOnlyToBuffer) {
setCmsCachingRequired(true);
}
}
/**
* Adds some bytes to the list of include results.<p>
*
* Should be used only in inclusion-scenarios
* like the JSP cms:include tag processing.<p>
*
* @param result the byte array to add
*/
void addToIncludeResults(byte[] result) {
if (m_includeResults == null) {
m_includeResults = new ArrayList(10);
}
m_includeResults.add(result);
}
/**
* Returns the cache key for to this response.<p>
*
* @return the cache key for to this response
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -