blob: 98c02d3252b9b6ddd67144c922ba33331a61e610 [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="fr">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
</head>
<body>
<main role="main">
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span><a id="line.1">/*</a>
<span class="sourceLineNo">002</span><a id="line.2"> * Licensed to the Apache Software Foundation (ASF) under one</a>
<span class="sourceLineNo">003</span><a id="line.3"> * or more contributor license agreements. See the NOTICE file</a>
<span class="sourceLineNo">004</span><a id="line.4"> * distributed with this work for additional information</a>
<span class="sourceLineNo">005</span><a id="line.5"> * regarding copyright ownership. The ASF licenses this file</a>
<span class="sourceLineNo">006</span><a id="line.6"> * to you under the Apache License, Version 2.0 (the</a>
<span class="sourceLineNo">007</span><a id="line.7"> * "License"); you may not use this file except in compliance</a>
<span class="sourceLineNo">008</span><a id="line.8"> * with the License. You may obtain a copy of the License at</a>
<span class="sourceLineNo">009</span><a id="line.9"> *</a>
<span class="sourceLineNo">010</span><a id="line.10"> * http://www.apache.org/licenses/LICENSE-2.0</a>
<span class="sourceLineNo">011</span><a id="line.11"> *</a>
<span class="sourceLineNo">012</span><a id="line.12"> * Unless required by applicable law or agreed to in writing,</a>
<span class="sourceLineNo">013</span><a id="line.13"> * software distributed under the License is distributed on an</a>
<span class="sourceLineNo">014</span><a id="line.14"> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</a>
<span class="sourceLineNo">015</span><a id="line.15"> * KIND, either express or implied. See the License for the</a>
<span class="sourceLineNo">016</span><a id="line.16"> * specific language governing permissions and limitations</a>
<span class="sourceLineNo">017</span><a id="line.17"> * under the License.</a>
<span class="sourceLineNo">018</span><a id="line.18"> */</a>
<span class="sourceLineNo">019</span><a id="line.19">package org.apache.shiro.web.filter;</a>
<span class="sourceLineNo">020</span><a id="line.20"></a>
<span class="sourceLineNo">021</span><a id="line.21">import org.apache.shiro.util.AntPathMatcher;</a>
<span class="sourceLineNo">022</span><a id="line.22">import org.apache.shiro.util.PatternMatcher;</a>
<span class="sourceLineNo">023</span><a id="line.23">import org.apache.shiro.util.StringUtils;</a>
<span class="sourceLineNo">024</span><a id="line.24">import org.apache.shiro.web.servlet.AdviceFilter;</a>
<span class="sourceLineNo">025</span><a id="line.25">import org.apache.shiro.web.util.WebUtils;</a>
<span class="sourceLineNo">026</span><a id="line.26">import org.owasp.encoder.Encode;</a>
<span class="sourceLineNo">027</span><a id="line.27">import org.slf4j.Logger;</a>
<span class="sourceLineNo">028</span><a id="line.28">import org.slf4j.LoggerFactory;</a>
<span class="sourceLineNo">029</span><a id="line.29"></a>
<span class="sourceLineNo">030</span><a id="line.30">import javax.servlet.Filter;</a>
<span class="sourceLineNo">031</span><a id="line.31">import javax.servlet.ServletRequest;</a>
<span class="sourceLineNo">032</span><a id="line.32">import javax.servlet.ServletResponse;</a>
<span class="sourceLineNo">033</span><a id="line.33">import java.util.LinkedHashMap;</a>
<span class="sourceLineNo">034</span><a id="line.34">import java.util.Map;</a>
<span class="sourceLineNo">035</span><a id="line.35"></a>
<span class="sourceLineNo">036</span><a id="line.36">import static org.apache.shiro.util.StringUtils.split;</a>
<span class="sourceLineNo">037</span><a id="line.37"></a>
<span class="sourceLineNo">038</span><a id="line.38">/**</a>
<span class="sourceLineNo">039</span><a id="line.39"> * &lt;p&gt;Base class for Filters that will process only specified paths and allow all others to pass through.&lt;/p&gt;</a>
<span class="sourceLineNo">040</span><a id="line.40"> *</a>
<span class="sourceLineNo">041</span><a id="line.41"> * @since 0.9</a>
<span class="sourceLineNo">042</span><a id="line.42"> */</a>
<span class="sourceLineNo">043</span><a id="line.43">public abstract class PathMatchingFilter extends AdviceFilter implements PathConfigProcessor {</a>
<span class="sourceLineNo">044</span><a id="line.44"></a>
<span class="sourceLineNo">045</span><a id="line.45"> /**</a>
<span class="sourceLineNo">046</span><a id="line.46"> * Log available to this class only</a>
<span class="sourceLineNo">047</span><a id="line.47"> */</a>
<span class="sourceLineNo">048</span><a id="line.48"> private static final Logger log = LoggerFactory.getLogger(PathMatchingFilter.class);</a>
<span class="sourceLineNo">049</span><a id="line.49"></a>
<span class="sourceLineNo">050</span><a id="line.50"> private static final String DEFAULT_PATH_SEPARATOR = "/";</a>
<span class="sourceLineNo">051</span><a id="line.51"></a>
<span class="sourceLineNo">052</span><a id="line.52"> /**</a>
<span class="sourceLineNo">053</span><a id="line.53"> * PatternMatcher used in determining which paths to react to for a given request.</a>
<span class="sourceLineNo">054</span><a id="line.54"> */</a>
<span class="sourceLineNo">055</span><a id="line.55"> protected PatternMatcher pathMatcher = new AntPathMatcher();</a>
<span class="sourceLineNo">056</span><a id="line.56"></a>
<span class="sourceLineNo">057</span><a id="line.57"> /**</a>
<span class="sourceLineNo">058</span><a id="line.58"> * A collection of path-to-config entries where the key is a path which this filter should process and</a>
<span class="sourceLineNo">059</span><a id="line.59"> * the value is the (possibly null) configuration element specific to this Filter for that specific path.</a>
<span class="sourceLineNo">060</span><a id="line.60"> * &lt;p/&gt;</a>
<span class="sourceLineNo">061</span><a id="line.61"> * &lt;p&gt;To put it another way, the keys are the paths (urls) that this Filter will process.</a>
<span class="sourceLineNo">062</span><a id="line.62"> * &lt;p&gt;The values are filter-specific data that this Filter should use when processing the corresponding</a>
<span class="sourceLineNo">063</span><a id="line.63"> * key (path). The values can be null if no Filter-specific config was specified for that url.</a>
<span class="sourceLineNo">064</span><a id="line.64"> */</a>
<span class="sourceLineNo">065</span><a id="line.65"> protected Map&lt;String, Object&gt; appliedPaths = new LinkedHashMap&lt;String, Object&gt;();</a>
<span class="sourceLineNo">066</span><a id="line.66"></a>
<span class="sourceLineNo">067</span><a id="line.67"> /**</a>
<span class="sourceLineNo">068</span><a id="line.68"> * Splits any comma-delmited values that might be found in the &lt;code&gt;config&lt;/code&gt; argument and sets the resulting</a>
<span class="sourceLineNo">069</span><a id="line.69"> * &lt;code&gt;String[]&lt;/code&gt; array on the &lt;code&gt;appliedPaths&lt;/code&gt; internal Map.</a>
<span class="sourceLineNo">070</span><a id="line.70"> * &lt;p/&gt;</a>
<span class="sourceLineNo">071</span><a id="line.71"> * That is:</a>
<span class="sourceLineNo">072</span><a id="line.72"> * &lt;pre&gt;&lt;code&gt;</a>
<span class="sourceLineNo">073</span><a id="line.73"> * String[] values = null;</a>
<span class="sourceLineNo">074</span><a id="line.74"> * if (config != null) {</a>
<span class="sourceLineNo">075</span><a id="line.75"> * values = split(config);</a>
<span class="sourceLineNo">076</span><a id="line.76"> * }</a>
<span class="sourceLineNo">077</span><a id="line.77"> * &lt;p/&gt;</a>
<span class="sourceLineNo">078</span><a id="line.78"> * this.{@link #appliedPaths appliedPaths}.put(path, values);</a>
<span class="sourceLineNo">079</span><a id="line.79"> * &lt;/code&gt;&lt;/pre&gt;</a>
<span class="sourceLineNo">080</span><a id="line.80"> *</a>
<span class="sourceLineNo">081</span><a id="line.81"> * @param path the application context path to match for executing this filter.</a>
<span class="sourceLineNo">082</span><a id="line.82"> * @param config the specified for &lt;em&gt;this particular filter only&lt;/em&gt; for the given &lt;code&gt;path&lt;/code&gt;</a>
<span class="sourceLineNo">083</span><a id="line.83"> * @return this configured filter.</a>
<span class="sourceLineNo">084</span><a id="line.84"> */</a>
<span class="sourceLineNo">085</span><a id="line.85"> public Filter processPathConfig(String path, String config) {</a>
<span class="sourceLineNo">086</span><a id="line.86"> String[] values = null;</a>
<span class="sourceLineNo">087</span><a id="line.87"> if (config != null) {</a>
<span class="sourceLineNo">088</span><a id="line.88"> values = split(config);</a>
<span class="sourceLineNo">089</span><a id="line.89"> }</a>
<span class="sourceLineNo">090</span><a id="line.90"></a>
<span class="sourceLineNo">091</span><a id="line.91"> this.appliedPaths.put(path, values);</a>
<span class="sourceLineNo">092</span><a id="line.92"> return this;</a>
<span class="sourceLineNo">093</span><a id="line.93"> }</a>
<span class="sourceLineNo">094</span><a id="line.94"></a>
<span class="sourceLineNo">095</span><a id="line.95"> /**</a>
<span class="sourceLineNo">096</span><a id="line.96"> * Returns the context path within the application based on the specified &lt;code&gt;request&lt;/code&gt;.</a>
<span class="sourceLineNo">097</span><a id="line.97"> * &lt;p/&gt;</a>
<span class="sourceLineNo">098</span><a id="line.98"> * This implementation merely delegates to</a>
<span class="sourceLineNo">099</span><a id="line.99"> * {@link WebUtils#getPathWithinApplication(javax.servlet.http.HttpServletRequest) WebUtils.getPathWithinApplication(request)},</a>
<span class="sourceLineNo">100</span><a id="line.100"> * but can be overridden by subclasses for custom logic.</a>
<span class="sourceLineNo">101</span><a id="line.101"> *</a>
<span class="sourceLineNo">102</span><a id="line.102"> * @param request the incoming &lt;code&gt;ServletRequest&lt;/code&gt;</a>
<span class="sourceLineNo">103</span><a id="line.103"> * @return the context path within the application.</a>
<span class="sourceLineNo">104</span><a id="line.104"> */</a>
<span class="sourceLineNo">105</span><a id="line.105"> protected String getPathWithinApplication(ServletRequest request) {</a>
<span class="sourceLineNo">106</span><a id="line.106"> return WebUtils.getPathWithinApplication(WebUtils.toHttp(request));</a>
<span class="sourceLineNo">107</span><a id="line.107"> }</a>
<span class="sourceLineNo">108</span><a id="line.108"></a>
<span class="sourceLineNo">109</span><a id="line.109"> /**</a>
<span class="sourceLineNo">110</span><a id="line.110"> * Returns &lt;code&gt;true&lt;/code&gt; if the incoming &lt;code&gt;request&lt;/code&gt; matches the specified &lt;code&gt;path&lt;/code&gt; pattern,</a>
<span class="sourceLineNo">111</span><a id="line.111"> * &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">112</span><a id="line.112"> * &lt;p/&gt;</a>
<span class="sourceLineNo">113</span><a id="line.113"> * The default implementation acquires the &lt;code&gt;request&lt;/code&gt;'s path within the application and determines</a>
<span class="sourceLineNo">114</span><a id="line.114"> * if that matches:</a>
<span class="sourceLineNo">115</span><a id="line.115"> * &lt;p/&gt;</a>
<span class="sourceLineNo">116</span><a id="line.116"> * &lt;code&gt;String requestURI = {@link #getPathWithinApplication(javax.servlet.ServletRequest) getPathWithinApplication(request)};&lt;br/&gt;</a>
<span class="sourceLineNo">117</span><a id="line.117"> * return {@link #pathsMatch(String, String) pathsMatch(path,requestURI)}&lt;/code&gt;</a>
<span class="sourceLineNo">118</span><a id="line.118"> *</a>
<span class="sourceLineNo">119</span><a id="line.119"> * @param path the configured url pattern to check the incoming request against.</a>
<span class="sourceLineNo">120</span><a id="line.120"> * @param request the incoming ServletRequest</a>
<span class="sourceLineNo">121</span><a id="line.121"> * @return &lt;code&gt;true&lt;/code&gt; if the incoming &lt;code&gt;request&lt;/code&gt; matches the specified &lt;code&gt;path&lt;/code&gt; pattern,</a>
<span class="sourceLineNo">122</span><a id="line.122"> * &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">123</span><a id="line.123"> */</a>
<span class="sourceLineNo">124</span><a id="line.124"> protected boolean pathsMatch(String path, ServletRequest request) {</a>
<span class="sourceLineNo">125</span><a id="line.125"> String requestURI = getPathWithinApplication(request);</a>
<span class="sourceLineNo">126</span><a id="line.126"> if (requestURI != null &amp;&amp; requestURI.endsWith(DEFAULT_PATH_SEPARATOR)) {</a>
<span class="sourceLineNo">127</span><a id="line.127"> requestURI = requestURI.substring(0, requestURI.length() - 1);</a>
<span class="sourceLineNo">128</span><a id="line.128"> }</a>
<span class="sourceLineNo">129</span><a id="line.129"> if (path != null &amp;&amp; path.endsWith(DEFAULT_PATH_SEPARATOR)) {</a>
<span class="sourceLineNo">130</span><a id="line.130"> path = path.substring(0, path.length() - 1);</a>
<span class="sourceLineNo">131</span><a id="line.131"> }</a>
<span class="sourceLineNo">132</span><a id="line.132"> log.trace("Attempting to match pattern '{}' with current requestURI '{}'...", path, Encode.forHtml(requestURI));</a>
<span class="sourceLineNo">133</span><a id="line.133"> return pathsMatch(path, requestURI);</a>
<span class="sourceLineNo">134</span><a id="line.134"> }</a>
<span class="sourceLineNo">135</span><a id="line.135"></a>
<span class="sourceLineNo">136</span><a id="line.136"> /**</a>
<span class="sourceLineNo">137</span><a id="line.137"> * Returns &lt;code&gt;true&lt;/code&gt; if the &lt;code&gt;path&lt;/code&gt; matches the specified &lt;code&gt;pattern&lt;/code&gt; string,</a>
<span class="sourceLineNo">138</span><a id="line.138"> * &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">139</span><a id="line.139"> * &lt;p/&gt;</a>
<span class="sourceLineNo">140</span><a id="line.140"> * Simply delegates to</a>
<span class="sourceLineNo">141</span><a id="line.141"> * &lt;b&gt;&lt;code&gt;this.pathMatcher.{@link PatternMatcher#matches(String, String) matches(pattern,path)}&lt;/code&gt;&lt;/b&gt;,</a>
<span class="sourceLineNo">142</span><a id="line.142"> * but can be overridden by subclasses for custom matching behavior.</a>
<span class="sourceLineNo">143</span><a id="line.143"> *</a>
<span class="sourceLineNo">144</span><a id="line.144"> * @param pattern the pattern to match against</a>
<span class="sourceLineNo">145</span><a id="line.145"> * @param path the value to match with the specified &lt;code&gt;pattern&lt;/code&gt;</a>
<span class="sourceLineNo">146</span><a id="line.146"> * @return &lt;code&gt;true&lt;/code&gt; if the &lt;code&gt;path&lt;/code&gt; matches the specified &lt;code&gt;pattern&lt;/code&gt; string,</a>
<span class="sourceLineNo">147</span><a id="line.147"> * &lt;code&gt;false&lt;/code&gt; otherwise.</a>
<span class="sourceLineNo">148</span><a id="line.148"> */</a>
<span class="sourceLineNo">149</span><a id="line.149"> protected boolean pathsMatch(String pattern, String path) {</a>
<span class="sourceLineNo">150</span><a id="line.150"> return pathMatcher.matches(pattern, path);</a>
<span class="sourceLineNo">151</span><a id="line.151"> }</a>
<span class="sourceLineNo">152</span><a id="line.152"></a>
<span class="sourceLineNo">153</span><a id="line.153"> /**</a>
<span class="sourceLineNo">154</span><a id="line.154"> * Implementation that handles path-matching behavior before a request is evaluated. If the path matches and</a>
<span class="sourceLineNo">155</span><a id="line.155"> * the filter</a>
<span class="sourceLineNo">156</span><a id="line.156"> * {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse, String, Object) isEnabled} for</a>
<span class="sourceLineNo">157</span><a id="line.157"> * that path/config, the request will be allowed through via the result from</a>
<span class="sourceLineNo">158</span><a id="line.158"> * {@link #onPreHandle(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Object) onPreHandle}. If the</a>
<span class="sourceLineNo">159</span><a id="line.159"> * path does not match or the filter is not enabled for that path, this filter will allow passthrough immediately</a>
<span class="sourceLineNo">160</span><a id="line.160"> * to allow the {@code FilterChain} to continue executing.</a>
<span class="sourceLineNo">161</span><a id="line.161"> * &lt;p/&gt;</a>
<span class="sourceLineNo">162</span><a id="line.162"> * In order to retain path-matching functionality, subclasses should not override this method if at all</a>
<span class="sourceLineNo">163</span><a id="line.163"> * possible, and instead override</a>
<span class="sourceLineNo">164</span><a id="line.164"> * {@link #onPreHandle(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Object) onPreHandle} instead.</a>
<span class="sourceLineNo">165</span><a id="line.165"> *</a>
<span class="sourceLineNo">166</span><a id="line.166"> * @param request the incoming ServletRequest</a>
<span class="sourceLineNo">167</span><a id="line.167"> * @param response the outgoing ServletResponse</a>
<span class="sourceLineNo">168</span><a id="line.168"> * @return {@code true} if the filter chain is allowed to continue to execute, {@code false} if a subclass has</a>
<span class="sourceLineNo">169</span><a id="line.169"> * handled the request explicitly.</a>
<span class="sourceLineNo">170</span><a id="line.170"> * @throws Exception if an error occurs</a>
<span class="sourceLineNo">171</span><a id="line.171"> */</a>
<span class="sourceLineNo">172</span><a id="line.172"> protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {</a>
<span class="sourceLineNo">173</span><a id="line.173"></a>
<span class="sourceLineNo">174</span><a id="line.174"> if (this.appliedPaths == null || this.appliedPaths.isEmpty()) {</a>
<span class="sourceLineNo">175</span><a id="line.175"> if (log.isTraceEnabled()) {</a>
<span class="sourceLineNo">176</span><a id="line.176"> log.trace("appliedPaths property is null or empty. This Filter will passthrough immediately.");</a>
<span class="sourceLineNo">177</span><a id="line.177"> }</a>
<span class="sourceLineNo">178</span><a id="line.178"> return true;</a>
<span class="sourceLineNo">179</span><a id="line.179"> }</a>
<span class="sourceLineNo">180</span><a id="line.180"></a>
<span class="sourceLineNo">181</span><a id="line.181"> for (String path : this.appliedPaths.keySet()) {</a>
<span class="sourceLineNo">182</span><a id="line.182"> // If the path does match, then pass on to the subclass implementation for specific checks</a>
<span class="sourceLineNo">183</span><a id="line.183"> //(first match 'wins'):</a>
<span class="sourceLineNo">184</span><a id="line.184"> if (pathsMatch(path, request)) {</a>
<span class="sourceLineNo">185</span><a id="line.185"> log.trace("Current requestURI matches pattern '{}'. Determining filter chain execution...", path);</a>
<span class="sourceLineNo">186</span><a id="line.186"> Object config = this.appliedPaths.get(path);</a>
<span class="sourceLineNo">187</span><a id="line.187"> return isFilterChainContinued(request, response, path, config);</a>
<span class="sourceLineNo">188</span><a id="line.188"> }</a>
<span class="sourceLineNo">189</span><a id="line.189"> }</a>
<span class="sourceLineNo">190</span><a id="line.190"></a>
<span class="sourceLineNo">191</span><a id="line.191"> //no path matched, allow the request to go through:</a>
<span class="sourceLineNo">192</span><a id="line.192"> return true;</a>
<span class="sourceLineNo">193</span><a id="line.193"> }</a>
<span class="sourceLineNo">194</span><a id="line.194"></a>
<span class="sourceLineNo">195</span><a id="line.195"> /**</a>
<span class="sourceLineNo">196</span><a id="line.196"> * Simple method to abstract out logic from the preHandle implementation - it was getting a bit unruly.</a>
<span class="sourceLineNo">197</span><a id="line.197"> *</a>
<span class="sourceLineNo">198</span><a id="line.198"> * @since 1.2</a>
<span class="sourceLineNo">199</span><a id="line.199"> */</a>
<span class="sourceLineNo">200</span><a id="line.200"> @SuppressWarnings({"JavaDoc"})</a>
<span class="sourceLineNo">201</span><a id="line.201"> private boolean isFilterChainContinued(ServletRequest request, ServletResponse response,</a>
<span class="sourceLineNo">202</span><a id="line.202"> String path, Object pathConfig) throws Exception {</a>
<span class="sourceLineNo">203</span><a id="line.203"></a>
<span class="sourceLineNo">204</span><a id="line.204"> if (isEnabled(request, response, path, pathConfig)) { //isEnabled check added in 1.2</a>
<span class="sourceLineNo">205</span><a id="line.205"> if (log.isTraceEnabled()) {</a>
<span class="sourceLineNo">206</span><a id="line.206"> log.trace("Filter '{}' is enabled for the current request under path '{}' with config [{}]. " +</a>
<span class="sourceLineNo">207</span><a id="line.207"> "Delegating to subclass implementation for 'onPreHandle' check.",</a>
<span class="sourceLineNo">208</span><a id="line.208"> new Object[]{getName(), path, pathConfig});</a>
<span class="sourceLineNo">209</span><a id="line.209"> }</a>
<span class="sourceLineNo">210</span><a id="line.210"> //The filter is enabled for this specific request, so delegate to subclass implementations</a>
<span class="sourceLineNo">211</span><a id="line.211"> //so they can decide if the request should continue through the chain or not:</a>
<span class="sourceLineNo">212</span><a id="line.212"> return onPreHandle(request, response, pathConfig);</a>
<span class="sourceLineNo">213</span><a id="line.213"> }</a>
<span class="sourceLineNo">214</span><a id="line.214"></a>
<span class="sourceLineNo">215</span><a id="line.215"> if (log.isTraceEnabled()) {</a>
<span class="sourceLineNo">216</span><a id="line.216"> log.trace("Filter '{}' is disabled for the current request under path '{}' with config [{}]. " +</a>
<span class="sourceLineNo">217</span><a id="line.217"> "The next element in the FilterChain will be called immediately.",</a>
<span class="sourceLineNo">218</span><a id="line.218"> new Object[]{getName(), path, pathConfig});</a>
<span class="sourceLineNo">219</span><a id="line.219"> }</a>
<span class="sourceLineNo">220</span><a id="line.220"> //This filter is disabled for this specific request,</a>
<span class="sourceLineNo">221</span><a id="line.221"> //return 'true' immediately to indicate that the filter will not process the request</a>
<span class="sourceLineNo">222</span><a id="line.222"> //and let the request/response to continue through the filter chain:</a>
<span class="sourceLineNo">223</span><a id="line.223"> return true;</a>
<span class="sourceLineNo">224</span><a id="line.224"> }</a>
<span class="sourceLineNo">225</span><a id="line.225"></a>
<span class="sourceLineNo">226</span><a id="line.226"> /**</a>
<span class="sourceLineNo">227</span><a id="line.227"> * This default implementation always returns {@code true} and should be overridden by subclasses for custom</a>
<span class="sourceLineNo">228</span><a id="line.228"> * logic if necessary.</a>
<span class="sourceLineNo">229</span><a id="line.229"> *</a>
<span class="sourceLineNo">230</span><a id="line.230"> * @param request the incoming ServletRequest</a>
<span class="sourceLineNo">231</span><a id="line.231"> * @param response the outgoing ServletResponse</a>
<span class="sourceLineNo">232</span><a id="line.232"> * @param mappedValue the filter-specific config value mapped to this filter in the URL rules mappings.</a>
<span class="sourceLineNo">233</span><a id="line.233"> * @return {@code true} if the request should be able to continue, {@code false} if the filter will</a>
<span class="sourceLineNo">234</span><a id="line.234"> * handle the response directly.</a>
<span class="sourceLineNo">235</span><a id="line.235"> * @throws Exception if an error occurs</a>
<span class="sourceLineNo">236</span><a id="line.236"> * @see #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse, String, Object)</a>
<span class="sourceLineNo">237</span><a id="line.237"> */</a>
<span class="sourceLineNo">238</span><a id="line.238"> protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {</a>
<span class="sourceLineNo">239</span><a id="line.239"> return true;</a>
<span class="sourceLineNo">240</span><a id="line.240"> }</a>
<span class="sourceLineNo">241</span><a id="line.241"></a>
<span class="sourceLineNo">242</span><a id="line.242"> /**</a>
<span class="sourceLineNo">243</span><a id="line.243"> * Path-matching version of the parent class's</a>
<span class="sourceLineNo">244</span><a id="line.244"> * {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse)} method, but additionally allows</a>
<span class="sourceLineNo">245</span><a id="line.245"> * for inspection of any path-specific configuration values corresponding to the specified request. Subclasses</a>
<span class="sourceLineNo">246</span><a id="line.246"> * may wish to inspect this additional mapped configuration to determine if the filter is enabled or not.</a>
<span class="sourceLineNo">247</span><a id="line.247"> * &lt;p/&gt;</a>
<span class="sourceLineNo">248</span><a id="line.248"> * This method's default implementation ignores the {@code path} and {@code mappedValue} arguments and merely</a>
<span class="sourceLineNo">249</span><a id="line.249"> * returns the value from a call to {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}.</a>
<span class="sourceLineNo">250</span><a id="line.250"> * It is expected that subclasses override this method if they need to perform enable/disable logic for a specific</a>
<span class="sourceLineNo">251</span><a id="line.251"> * request based on any path-specific config for the filter instance.</a>
<span class="sourceLineNo">252</span><a id="line.252"> *</a>
<span class="sourceLineNo">253</span><a id="line.253"> * @param request the incoming servlet request</a>
<span class="sourceLineNo">254</span><a id="line.254"> * @param response the outbound servlet response</a>
<span class="sourceLineNo">255</span><a id="line.255"> * @param path the path matched for the incoming servlet request that has been configured with the given {@code mappedValue}.</a>
<span class="sourceLineNo">256</span><a id="line.256"> * @param mappedValue the filter-specific config value mapped to this filter in the URL rules mappings for the given {@code path}.</a>
<span class="sourceLineNo">257</span><a id="line.257"> * @return {@code true} if this filter should filter the specified request, {@code false} if it should let the</a>
<span class="sourceLineNo">258</span><a id="line.258"> * request/response pass through immediately to the next element in the {@code FilterChain}.</a>
<span class="sourceLineNo">259</span><a id="line.259"> * @throws Exception in the case of any error</a>
<span class="sourceLineNo">260</span><a id="line.260"> * @since 1.2</a>
<span class="sourceLineNo">261</span><a id="line.261"> */</a>
<span class="sourceLineNo">262</span><a id="line.262"> @SuppressWarnings({"UnusedParameters"})</a>
<span class="sourceLineNo">263</span><a id="line.263"> protected boolean isEnabled(ServletRequest request, ServletResponse response, String path, Object mappedValue)</a>
<span class="sourceLineNo">264</span><a id="line.264"> throws Exception {</a>
<span class="sourceLineNo">265</span><a id="line.265"> return isEnabled(request, response);</a>
<span class="sourceLineNo">266</span><a id="line.266"> }</a>
<span class="sourceLineNo">267</span><a id="line.267">}</a>
</pre>
</div>
</main>
</body>
</html>