<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../../jacoco-resources/report.gif" type="image/gif"/><title>DefaultWebSessionContext.java</title><link rel="stylesheet" href="../../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../../index.html" class="el_report">Apache Shiro :: All (aggregate jar)</a> &gt; <a href="../index.html" class="el_bundle">shiro-web</a> &gt; <a href="index.source.html" class="el_package">org.apache.shiro.web.session.mgt</a> &gt; <span class="el_source">DefaultWebSessionContext.java</span></div><h1>DefaultWebSessionContext.java</h1><pre class="source lang-java linenums">/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * &quot;License&quot;); 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
 * &quot;AS IS&quot; 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 org.apache.shiro.web.session.mgt;

import org.apache.shiro.session.mgt.DefaultSessionContext;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.util.Map;

/**
 * Default implementation of the {@link WebSessionContext} interface which provides getters and setters that
 * wrap interaction with the underlying backing context map.
 *
 * @since 1.0
 */
public class DefaultWebSessionContext extends DefaultSessionContext implements WebSessionContext {

    private static final long serialVersionUID = -3974604687792523072L;

<span class="fc" id="L37">    private static final String SERVLET_REQUEST = DefaultWebSessionContext.class.getName() + &quot;.SERVLET_REQUEST&quot;;</span>
<span class="fc" id="L38">    private static final String SERVLET_RESPONSE = DefaultWebSessionContext.class.getName() + &quot;.SERVLET_RESPONSE&quot;;</span>

    public DefaultWebSessionContext() {
<span class="fc" id="L41">        super();</span>
<span class="fc" id="L42">    }</span>

    public DefaultWebSessionContext(Map&lt;String, Object&gt; map) {
<span class="nc" id="L45">        super(map);</span>
<span class="nc" id="L46">    }</span>

    public void setServletRequest(ServletRequest request) {
<span class="pc bpc" id="L49" title="1 of 2 branches missed.">        if (request != null) {</span>
<span class="fc" id="L50">            put(SERVLET_REQUEST, request);</span>
        }
<span class="fc" id="L52">    }</span>

    public ServletRequest getServletRequest() {
<span class="fc" id="L55">        return getTypedValue(SERVLET_REQUEST, ServletRequest.class);</span>
    }

    public void setServletResponse(ServletResponse response) {
<span class="pc bpc" id="L59" title="1 of 2 branches missed.">        if (response != null) {</span>
<span class="fc" id="L60">            put(SERVLET_RESPONSE, response);</span>
        }
<span class="fc" id="L62">    }</span>

    public ServletResponse getServletResponse() {
<span class="fc" id="L65">        return getTypedValue(SERVLET_RESPONSE, ServletResponse.class);</span>
    }
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.7.7.201606060606</span></div></body></html>