#mdStyle()

<a name="Web-ApacheShiroWebSupport"></a>
Apache Shiro Web Support
========================

*   [Configuration](#Web-Configuration)

    *   [`web.xml`](#Web-%7B%7Bweb.xml%7D%7D)

        *   [Shiro 1.2 and later](#Web-Shiro1.2andlater)

            *   [Custom `WebEnvironment` Class](#Web-Custom%7B%7BWebEnvironment%7D%7DClass)
            *   [Custom Configuration Locations](#Web-CustomConfigurationLocations)

        *   [Shiro 1.1 and earlier](#Web-Shiro1.1andearlier)

            *   [Custom Path](#Web-CustomPath)
            *   [Inline Config](#Web-InlineConfig)

    *   [Web INI configuration](#Web-WebINIconfiguration)

        *   [`[urls]`](#Web-%7B%7B%5Curls%5C%7D%7D)

            *   [URL Path Expressions](#Web-URLPathExpressions)
            *   [Filter Chain Definitions](#Web-FilterChainDefinitions)

                *   [Available Filters](#Web-AvailableFilters)

*   [Default Filters](#Web-DefaultFilters)
*   [Enabling and Disabling Filters](#Web-EnablingandDisablingFilters)

    *   [General Enabling/Disabling](#Web-GeneralEnabling%2FDisabling)
    *   [Request-specific Enabling/Disabling](#Web-RequestspecificEnabling%2FDisabling)
    *   [Path-specific Enabling/Disabling](#Web-PathspecificEnabling%2FDisabling)
    *   [Global Filters](#Web-globalFilters)
    *   [HTTP Strict Transport Security (HSTS)](#Web-HSTS)

*   [Session Management](#Web-SessionManagement)

    *   [Servlet Container Sessions](#Web-ServletContainerSessions)

        *   [Servlet Container Session Timeout](#Web-ServletContainerSessionTimeout)

    *   [Native Sessions](#Web-NativeSessions)

        *   [`DefaultWebSessionManager`](#Web-%7B%7BDefaultWebSessionManager%7D%7D)

            *   [Native Session Timeout](#Web-NativeSessionTimeout)
            *   [Session Cookie](#Web-SessionCookie)

                *   [Session Cookie Configuration](#Web-SessionCookieConfiguration)
                *   [Disabling the Session Cookie](#Web-DisablingtheSessionCookie)

*   [Remember Me Services](#Web-RememberMeServices)

    *   [Programmatic Support](#Web-ProgrammaticSupport)
    *   [Form-based Login](#Web-FormbasedLogin)
    *   [Cookie configuration](#Web-Cookieconfiguration)
    *   [Custom `RememberMeManager`](#Web-Custom%7B%7BRememberMeManager%7D%7D)

*   [JSP / GSP Tag Library](#Web-JSP%2FGSPTagLibrary)

    *   [Tag Library Configuration](#Web-TagLibraryConfiguration)
    *   [The `guest` tag](#Web-The%7B%7Bguest%7D%7Dtag)
    *   [The `user` tag](#Web-The%7B%7Buser%7D%7Dtag)
    *   [The `authenticated` tag](#Web-The%7B%7Bauthenticated%7D%7Dtag)
    *   [The `notAuthenticated` tag](#Web-The%7B%7BnotAuthenticated%7D%7Dtag)
    *   [The `principal` tag](#Web-The%7B%7Bprincipal%7D%7Dtag)

        *   [Typed principal](#Web-Typedprincipal)
        *   [Principal property](#Web-Principalproperty)

    *   [The `hasRole` tag](#Web-The%7B%7BhasRole%7D%7Dtag)
    *   [The `lacksRole` tag](#Web-The%7B%7BlacksRole%7D%7Dtag)
    *   [The `hasAnyRole` tag](#Web-The%7B%7BhasAnyRole%7D%7Dtag)
    *   [The `hasPermission` tag](#Web-The%7B%7BhasPermission%7D%7Dtag)
    *   [The `lacksPermission` tag](#Web-The%7B%7BlacksPermission%7D%7Dtag)


<a name="Web-configuration"></a>
<a name="Web-Configuration"></a>
Configuration
-------------

The simplest way to integrate Shiro into any web application is to configure a Servlet ContextListener and Filter in web.xml that understands how to read Shiro's INI configuration. The bulk of the INI config format itself is defined in the Configuration pages's [INI Sections](configuration.html#[[#]]#Configuration-INISections) section, but we'll cover some additional web-specific sections here.

#info('Using Spring?', 'Spring Framework users will not perform this setup.  If you use Spring, you will want to read about <a href="spring-boot.html#web-applications">Spring-specific web configuration</a> instead.')

<a name="Web-%7B%7Bweb.xml%7D%7D"></a>
#[[###`web.xml`]]#

<a name="Web-Shiro1.2andlater"></a>
#[[####Shiro 1.2 and later]]#

In Shiro 1.2 and later, standard web applications initialize Shiro by adding the following XML chunks to `web.xml`:

``` xml
<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

...

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
```

This assumes a Shiro INI [Configuration](configuration.html "Configuration") file is located at either of the following two locations, using whichever is found first:

1.  `/WEB-INF/shiro.ini`
2.  `shiro.ini` file at the root of the classpath.

Here is what the above config does:

*   The `EnvironmentLoaderListener` initializes a Shiro `WebEnvironment` instance (which contains everything Shiro needs to operate, including the `SecurityManager`) and makes it accessible in the `ServletContext`. If you need to obtain this `WebEnvironment` instance at any time, you can call `WebUtils.getRequiredWebEnvironment(servletContext)`.

*   The `ShiroFilter` will use this `WebEnvironment` to perform all necessary security operations for any filtered request.

*   Finally, the `filter-mapping` definition ensures that all requests are filtered by the `ShiroFilter`, recommended for most web applications to ensure that any request can be secured.

#tip('ShiroFilter filter-mapping', 'It is usually desirable to define the `ShiroFilter filter-mapping` before any other `filter-mapping` declarations to ensure that Shiro can function in those filters as well.')

#tip('ShiroFilter default encoding', 'The shiro filter is a standard servlet filter, with a default encoding of ISO-8859-1 according to the <a href="https://javaee.github.io/servlet-spec/downloads/servlet-4.0/servlet-4_0_FINAL.pdf">servlet specification</a>. However, the client can choose to send authentication data with a different encoding using the <code>charset</code> attribute of the <code>Content-Type</code> header.')

<a name="Web-Custom%7B%7BWebEnvironment%7D%7DClass"></a>
#[[#####Custom `WebEnvironment` Class]]#

By default the `EnvironmentLoaderListener` will create an `IniWebEnvironment` instance, which assumes Shiro's INI-based [Configuration](configuration.html "Configuration"). If you like, you may specify a custom `WebEnvironment` instance instead by specifying a `ServletContext` `context-param` in `web.xml`:

``` xml
<context-param>
    <param-name>shiroEnvironmentClass</param-name>
    <param-value>com.foo.bar.shiro.MyWebEnvironment</param-value>
</context-param>
```

This allows you to customize how a configuration format is parsed and represented as a `WebEnvironment` instance. You could subclass the existing `IniWebEnvironment` for custom behavior, or support different configuration formats entirely. For example, if someone wanted to configure Shiro in XML instead of INI, they could create an XML-based implementation, e.g. `com.foo.bar.shiro.XmlWebEnvironment`.

<a name="Web-CustomConfigurationLocations"></a>
#[[#####Custom Configuration Locations]]#

The `IniWebEnvironment` class expects to read and load INI configuration files. By default, this class will automatically look in the following two locations for the Shiro `.ini` configuration (in order):

1.  `/WEB-INF/shiro.ini`
2.  `classpath:shiro.ini`

It will use whichever is found first.

However, if you wish to place your config in another location, you may specify that location with another `context-param` in `web.xml`:

``` xml
<context-param>
    <param-name>shiroConfigLocations</param-name>
    <param-value>YOUR_RESOURCE_LOCATION_HERE</param-value>
</context-param>
```

By default, the `param-value` is expected to be resolvable by the rules defined by `ServletContext.`[`getResource`](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#[[#]]#getResource-java.lang.String-) method. For example, `/WEB-INF/some/path/shiro.ini`

But you may also specify specific file-system, classpath or URL locations by using an appropriate resource prefix supported by Shiro's [ResourceUtils class](static/current/apidocs/org/apache/shiro/io/ResourceUtils.html), for example:

*   `file:/home/foobar/myapp/shiro.ini`
*   `classpath:com/foo/bar/shiro.ini`
*   `url:http://confighost.mycompany.com/myapp/shiro.ini`

<a name="Web-Shiro1.1andearlier"></a>
#[[####Shiro 1.1 and earlier]]#

The simplest way to enable Shiro in a 1.1 or earlier web application is to define the IniShiroFilter and specify a `filter-mapping`:

``` xml
<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
</filter>

...

<!-- Make sure any request you want accessible to Shiro is filtered. /* catches all -->
<!-- requests.  Usually this filter mapping is defined first (before all others) to -->
<!-- ensure that Shiro works in subsequent filters in the filter chain:             -->
<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
```

This definition expects your INI configuration to be in a shiro.ini file at the root of the classpath (e.g. `classpath:shiro.ini`).

<a name="Web-CustomPath"></a>
#[[#####Custom Path]]#

If you do not want to place your INI config in `/WEB-INF/shiro.ini` or `classpath:shiro.ini`, you may specify a custom resource location as necessary. Add a `configPath init-param` and specify a resource location:

``` xml
<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
    <init-param>
        <param-name>configPath</param-name>
        <param-value>/WEB-INF/anotherFile.ini</param-value>
    </init-param>
</filter>

...
```

Unqualified (schemeless or 'non-prefixed') `configPath` values are assumed to be `ServletContext` resource paths, resolvable via the rules defined by the
`ServletContext.`[`getResource`](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#[[#]]#getResource-java.lang.String-) method.

#warning('ServletContext resource paths - Shiro 1.2+', 'ServletContext resource paths are available in Shiro 1.2 and later. In 1.1 and earlier, all <code>configPath</code> definitions must specify a <code>classpath:</code>, <code>file:</code> or <code>url:</code> prefix.')

You may also specify other non-`ServletContext` resource locations by using `classpath:`, `url:`, or `file:` prefixes indicating classpath, url, or filesystem locations respectively. For example:

``` xml
...
<init-param>
    <param-name>configPath</param-name>
    <param-value>url:http://configHost/myApp/shiro.ini</param-value>
</init-param>
...
```

<a name="Web-InlineConfig"></a>
#[[#####Inline Config]]#

Finally, it is also possible to embed your INI configuration inline in web.xml without using an INI file at all. You do this by using the `config init-param` instead of `configPath`:

``` xml
<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
    <init-param><param-name>config</param-name><param-value>

    # INI Config Here

    </param-value></init-param>
</filter>
...
```

Inline config is often fine for small or simple applications, but it is usually more convenient to externalize it in a dedicated shiro.ini file for the following reasons:

*   You might edit security configuration a lot and don't want to add revision control 'noise' to the web.xml file
*   You might want to separate security config from the rest of web.xml config
*   Your security configuration might become large and you want to keep web.xml lean and easier to read
*   You have a complex build system where the same shiro config might need to be referenced in multiple places

It is up to you - use what makes sense for your project.

<a name="Web-webini"></a>
<a name="Web-WebINIconfiguration"></a>
#[[###Web INI configuration]]#

In addition to the standard `[main]`, `[users]` and `[roles]` sections already described in the main [Configuration](configuration.html "Configuration") chapter, you can additionally specify a web-specific `[urls]` section in your `shiro.ini` file:

``` ini
# [main], [users] and [roles] above here
...
[urls]
...
```

The `[urls]` section allows you to do something that doesn't exist in any web framework that we've seen yet: the ability to define ad-hoc filter chains for any matching URL path in your application!

This is _far_ more flexible, powerful and concise than how you define filter chains normally in `web.xml`: even if you never used any other feature that Shiro provided and used only this, it alone would make it worth using.

<a name="Web-%7B%7B%5Curls%5C%7D%7D"></a>
#[[####`[urls]`]]#

The format of each line in the `urls` section is as follows:

``` ini
_URL_Ant_Path_Expression_ = _Path_Specific_Filter_Chain_
```

For example:

``` ini
...
[urls]

/index.html = anon
/user/create = anon
/user/** = authc
/admin/** = authc, roles[administrator]
/rest/** = authc, rest
/remoting/rpc/** = authc, perms["remote:invoke"]
```

Next we'll cover exactly what these lines mean.

##### <a name="Web-URLPathExpressions"></a>URL Path Expressions

The token on the left of the equals sign (=) is an [Ant](http://ant.apache.org)-style path expression relative to your web application's context root.

For example, let's say you had the following `[urls]` line:

``` ini
/account/** = ssl, authc
```

This line states that "Any request to my application's path of `/account` or any of it's sub paths (`/account/foo`, `/account/bar/baz`, etc) will trigger the 'ssl, authc' filter chain". We'll cover filter chains below.

Note that all path expressions are relative to your application's context root. This means that if you deploy your application one day to, say, `www.somehost.com/myapp` and then later deploy it to `www.anotherhost.com` (no 'myapp' sub-path), the pattern matching will still work. All paths are relative to the [HttpServletRequest.getContextPath()](http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletRequest.html#[[#]]#getContextPath--) value.

#warning('Order Matters!', 'URL path expressions are evaluated against an incoming request in the order they are defined and the <em>FIRST MATCH WINS</em>.  For example, let''s asume that there are the following chain definitions:

<pre><code class="ini">/account/** = ssl, authc
/account/signup = anon
</code></pre>
<p>If an incoming request is intended to reach <code>/account/signup/index.html</code> (accessible by all ''anon''ymous users), <em>it will never be handled!</em>.  The reason is that the <code>/account/**</code> pattern matched the incoming request first and ''short-circuited'' all remaining definitions.</p>
<p>Always remember to define your filter chains based on a <em>FIRST MATCH WINS</em> policy!</p>')

<a name="Web-FilterChainDefinitions"></a>
#[[#####Filter Chain Definitions]]#

The token on the right of the equals sign (=) is comma-delimited list of filters to execute for a request matching that path. It must match the following format:

``` ini
filter1[optional_config1], filter2[optional_config2], ..., filterN[optional_configN]
```

where:

*   _filterN_ is the name of a filter bean defined in the `[main]` section and
*   `[optional_configN]` is an optional bracketed string that has meaning for that particular filter for _that particular path_ (per-filter, _path-specific_ configuration!). If the filter does not need specific config for that URL path, you may discard the brackets so `filterN[]` just becomes `filterN`.

And because filter tokens define chains (aka a List), remember that order matters! Define your comma-delimited list in the order that you want the request to flow through the chain.

Finally, each filter is free to handle the response however it wants if its necessary conditions are not met (e.g. perform a redirect, respond with an HTTP error code, direct rendering, etc). Otherwise it is expected to allow the request to continue through the chain on to the final destination view.

#tip('Tip', 'Being able to react to path specific configuration, i.e. the <code>[optional_configN]</code> part of a filter token, is a unique feature available to Shiro filters.
<p>If you want to create your own <code>javax.servlet.Filter</code> implementation that can also do this, make sure your filter subclasses <a class="external-link" href="static/current/apidocs/org/apache/shiro/web/filter/PathMatchingFilter.html">org.apache.shiro.web.filter.PathMatchingFilter</a></p>')

<a name="Web-AvailableFilters"></a>
#[[######Available Filters]]#

The 'pool' of filters available for use in filter chain definitions are defined in the `[main]` section. The name assigned to them in the main section is the name to use in the filter chain definitions. For example:

``` ini
[main]
...
myFilter = com.company.web.some.FilterImplementation
myFilter.property1 = value1
...

[urls]
...
/some/path/** = myFilter
```

<a name="Web-defaultfilters"></a>
<a name="Web-DefaultFilters"></a>
Default Filters
---------------

When running a web-app, Shiro will create some useful default `Filter` instances and make them available in the `[main]` section automatically. You can configure them in `main` as you would any other bean and reference them in your chain definitions. For example:

``` ini
[main]
...
# Notice how we didn't define the class for the FormAuthenticationFilter ('authc') - it is instantiated and available already:
authc.loginUrl = /login.jsp
...

[urls]
...
# make sure the end-user is authenticated.  If not, redirect to the 'authc.loginUrl' above,
# and after successful authentication, redirect them back to the original account page they
# were trying to view:
/account/** = authc
...
```

The default Filter instances available automatically are defined by the [DefaultFilter enum](static/current/apidocs/org/apache/shiro/web/filter/mgt/DefaultFilter.html) and the enum's `name` field is the name available for configuration. They are:

| Filter Name | Class |
| ----------- | ----- |
| anon | [org.apache.shiro.web.filter.authc.AnonymousFilter](static/current/apidocs/org/apache/shiro/web/filter/authc/AnonymousFilter.html) |
| authc | [org.apache.shiro.web.filter.authc.FormAuthenticationFilter](static/current/apidocs/org/apache/shiro/web/filter/authc/FormAuthenticationFilter.html) |
| authcBasic | [org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter](static/current/apidocs/org/apache/shiro/web/filter/authc/BasicHttpAuthenticationFilter.html) |
| authcBearer | [org.apache.shiro.web.filter.authc.BearerHttpAuthenticationFilter](static/current/apidocs/org/apache/shiro/web/filter/authc/BearerHttpAuthenticationFilter.html) |
| invalidRequest | [org.apache.shiro.web.filter.InvalidRequestFilter](static/current/apidocs/org/apache/shiro/web/filter/InvalidRequestFilter.html) |
| logout | [org.apache.shiro.web.filter.authc.LogoutFilter](static/current/apidocs/org/apache/shiro/web/filter/authc/LogoutFilter.html) |
| noSessionCreation | [org.apache.shiro.web.filter.session.NoSessionCreationFilter](static/current/apidocs/org/apache/shiro/web/filter/session/NoSessionCreationFilter.html) |
| perms | [org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter](static/current/apidocs/org/apache/shiro/web/filter/authz/PermissionsAuthorizationFilter.html) |
| port | [org.apache.shiro.web.filter.authz.PortFilter](static/current/apidocs/org/apache/shiro/web/filter/authz/PortFilter.html) |
| rest| [org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter](static/current/apidocs/org/apache/shiro/web/filter/authz/HttpMethodPermissionFilter.html) |
| roles |[org.apache.shiro.web.filter.authz.RolesAuthorizationFilter](static/current/apidocs/org/apache/shiro/web/filter/authz/RolesAuthorizationFilter.html) |
| ssl | [org.apache.shiro.web.filter.authz.SslFilter](static/current/apidocs/org/apache/shiro/web/filter/authz/SslFilter.html) |
| user | [org.apache.shiro.web.filter.authc.UserFilter](static/current/apidocs/org/apache/shiro/web/filter/authc/UserFilter.html) |

<a name="Web-EnablingandDisablingFilters"></a>
Enabling and Disabling Filters
------------------------------

As is the case with any filter chain definition mechanism (`web.xml`, Shiro's INI, etc), you enable a filter just by including it in the filter chain definition, and you disable it by removing it from the chain definition.

But a new feature added in Shiro 1.2 is the ability to enable or disable filters without removing them from the filter chain. If enabled (the default setting), then a request will be filtered as expected. If disabled, then the filter will allow the request to pass through immediately to the next element in the `FilterChain`. You can trigger a filter's enabled state generally based on a configuration property, or you can even trigger it on a _per request_ basis.

This is a powerful concept because it is often more convenient to enable or disable a filter based on certain requirements than to change the static filter chain definition, which would be permanent and inflexible.

Shiro accomplishes this via its [OncePerRequestFilter](static/current/apidocs/org/apache/shiro/web/servlet/OncePerRequestFilter.html) abstract parent class. All of Shiro's out-of-the-box Filter implementations subclass this one and therefore are able to be enabled or disabled without removing them from the filter chain. You can subclass this class for your own filter implementations if you need this functionality as well*.

*[SHIRO-224](https://issues.apache.org/jira/browse/SHIRO-224) will hopefully enable this feature for any filter, not just those subclassing `OncePerRequestFilter`. If this is important to you, please vote for the issue.

<a name="Web-GeneralEnabling%2FDisabling"></a>
#[[###General Enabling/Disabling]]#

The [OncePerRequestFilter](static/current/apidocs/org/apache/shiro/web/servlet/OncePerRequestFilter.html) (and all of its subclasses) supports enabling/disabling across all requests as well as on a per-request basis.

General enabling or disabling of a filter for all requests is done by setting its `enabled` property to true or false. The default setting is `true` since most filters inherently need to execute if they are configured in a chain.

For example, in shiro.ini:

``` ini
[main]
...
# configure Shiro's default 'ssl' filter to be disabled while testing:
ssl.enabled = false

[urls]
...
/some/path = ssl, authc
/another/path = ssl, roles[admin]
...
```

This example shows that potentially many URL paths can all require that a request must be secured by an SSL connection. Setting up SSL while in development can be frustrating and time consuming. While in development, you can disable the ssl filter. When deploying to production, you can enable it with one configuration property - something that is much easier than manually changing all of the URL paths or maintaining two Shiro configurations.

<a name="Web-RequestspecificEnabling%2FDisabling"></a>
#[[###Request-specific Enabling/Disabling]]#

`OncePerRequestFilter` actually determines if the filter is enabled or disabled based on its `isEnabled(request, response)` method.

This method defaults to returning the value of the `enabled` property, which is used for generally enabling/disabling all requests as mentioned above. If you wanted to enable or disable a filter based on _request specific_ criteria, you can override the `OncePerRequestFilter` `isEnabled(request,response)` method to perform more specific checks.

<a name="Web-PathspecificEnabling%2FDisabling"></a>
#[[###Path-specific Enabling/Disabling]]#

Shiro's [PathMatchingFilter](static/current/apidocs/org/apache/shiro/web/filter/PathMatchingFilter.html) (a subclass of `OncePerRequestFilter` has the ability to react to configuration based on a _specific path_ being filtered. This means you can enable or disable a filter based on the path and the path-specific configuration in addition to the incoming request and response.

If you need to be able to react to the matching path and the path-specific configuration to determine if a filter is enabled or disabled, instead of overriding `OncePerRequestFilter` `isEnabled(request,response)` method, you would override the `PathMatchingFilter` `isEnabled(request,response,path,pathConfig)` method instead.

<a name="Web-globalFilters"></a>
#[[###Global Filters]]#

Starting with Shiro 1.6 the ability to define global filters has been added.  Adding "global filters" will add additional filters to ALL routes, this includes previously configured filter chains as well as unconfigured paths.

By default, the global filters contains the `invalidRequest` filter.  This filter blocks known malicious attacks, see below for configuration details.

Global filters can be customized or disabled, for example

``` ini
[main]
...
# disable Global Filters
filterChainResolver.globalFilters = null
```

Define the list of global filters:

``` ini
[main]
...
filterChainResolver.globalFilters = invalidRequest, port
```

The `invalidRequest` filter blocks requests with non-ascii characters, semicolons, and backslashes, each of these can be disabled independently to allow for backward compatibility.

```ini
[main]
...
invalidRequest.blockBackslash = true
invalidRequest.blockSemicolon = true
invalidRequest.blockNonAscii = true
...
```

#info('Note', 'If you currently allowing URL rewriting to allow for a <code>jsessionid</code> in the URL, you must set <code>blockSemicolon</code> to <code>false</code>.<BR/><BR/>URL rewriting for <code>jsessionid</code> is defined in section "7.1.3" of the Java Servlet Specification, but it is generally NOT recommended.')

<a name="Web-HSTS"></a>
#[[###HTTP Strict Transport Security (HSTS)]]#

The [SslFilter](static/current/apidocs/org/apache/shiro/web/filter/authz/SslFilter.html) (and all of its subclasses) supports enabling/disabling HTTP Strict Transport Security (HSTS).

For example, in shiro.ini:

``` ini
[main]
...
# configure Shiro's default 'ssl' filter to enabled HSTS:
ssl.enabled = true
ssl.hsts.enabled = true
ssl.hsts.includeSubDomains = true

[urls]
...
/some/path = ssl, authc
/another/path = ssl, roles[admin]
...
```

<a name="Web-sessionManagement"></a>
<a name="Web-SessionManagement"></a>
Session Management
------------------

<a name="Web-ServletContainerSessions"></a>
#[[###Servlet Container Sessions]]#

In web environments, Shiro's default session manager [`SessionManager`](static/current/apidocs/org/apache/shiro/session/mgt/SessionManager.html) implementation is the [`ServletContainerSessionManager`](static/current/apidocs/org/apache/shiro/web/session/mgt/ServletContainerSessionManager.html). This very simple implementation delegates all session management duties (including session clustering if the servlet container supports it) to the runtime Servlet container. It is essentially a bridge for Shiro's session API to the servlet container and does little else.

A benefit of using this default is that apps that work with existing servlet container session configuration (timeout, any container-specific clustering mechanisms, etc) will work as expected.

A downside of this default is that you are tied to the servlet container's specific session behavior. For example, if you wanted to cluster sessions, but you used Jetty for testing and Tomcat in production, your container-specific configuration (or code) would not be portable.

<a name="Web-ServletContainerSessionTimeout"></a>
#[[####Servlet Container Session Timeout]]#

If using the default servlet container support, you configure session timeout as expected in your web application's `web.xml` file. For example:

``` xml
<session-config>
  <!-- web.xml expects the session timeout in minutes: -->
  <session-timeout>30</session-timeout>
</session-config>
```

<a name="Web-NativeSessions"></a>
#[[###Native Sessions]]#

If you want your session configuration settings and clustering to be portable across servlet containers (e.g. Jetty in testing, but Tomcat or JBoss in production), or you want to control specific session/clustering features, you can enable Shiro's native session management.

The word 'Native' here means that Shiro's own enterprise session management implementation will be used to support all `Subject` and `HttpServletRequest` sessions and bypass the servlet container completely. But rest assured - Shiro implements the relevant parts of the Servlet specification directly so any existing web/http related code works as expected and never needs to 'know' that Shiro is transparently managing sessions.

<a name="Web-%7B%7BDefaultWebSessionManager%7D%7D"></a>
#[[####`DefaultWebSessionManager`]]#

To enable native session management for your web application, you will need to configure a native web-capable session manager to override the default servlet container-based one. You can do that by configuring an instance of [`DefaultWebSessionManager`](static/current/apidocs/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.html) on Shiro's `SecurityManager`. For example, in `shiro.ini`:

**shiro.ini native web session management**

``` ini
[main]
...
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
# configure properties (like session timeout) here if desired

# Use the configured native session manager:
securityManager.sessionManager = $sessionManager
```

Once declared, you can configure the `DefaultWebSessionManager` instance with native session options like session timeout and clustering configuration as described in the [Session Management](session-management.html "Session Management") section.

<a name="Web-NativeSessionTimeout"></a>
#[[#####Native Session Timeout]]#

After configuring the `DefaultWebSessionManager` instance, session timeout is configured as described in [Session Management: Session Timeout](session-management.html#[[#]]#SessionManagement-sessionTimeout)

<a name="Web-SessionCookie"></a>
#[[#####Session Cookie]]#

The `DefaultWebSessionManager` supports two web-specific configuration properties:

*   `sessionIdCookieEnabled` (a boolean)
*   `sessionIdCookie`, a [Cookie](static/current/apidocs/org/apache/shiro/web/servlet/Cookie.html) instance.

#info('Cookie as a template', 'The <code>sessionIdCookie</code> property is essentially a template - you configure the <code>Cookie</code> instance properties, and this template will be used to set the actual HTTP `Cookie` header at runtime with an appropriate session ID value.')

<a name="Web-SessionCookieConfiguration"></a>
#[[######Session Cookie Configuration]]#

The DefaultWebSessionManager's `sessionIdCookie` default instance is a [`SimpleCookie`](static/current/apidocs/org/apache/shiro/web/servlet/SimpleCookie.html). This simple implementation allows JavaBeans-style property configuration for all of the relevant properties you would want to configure on an http Cookie.

For example, you could set the Cookie domain:

``` ini
[main]
...
securityManager.sessionManager.sessionIdCookie.domain = foo.com
```

See the [SimpleCookie JavaDoc](static/current/apidocs/org/apache/shiro/web/servlet/SimpleCookie.html) for additional properties.

The cookie's default name is `JSESSIONID` in accordance with the servlet specification. Additionally, Shiro's cookie supports the [`HttpOnly`](https://en.wikipedia.org/wiki/HTTP_cookie#HttpOnly_cookie) and [`SameSite`](https://en.wikipedia.org/wiki/HTTP_cookie#Same-site_cookie) flags. The `sessionIdCookie` sets `HttpOnly` to `true` and `SameSite` to `LAX` by default for extra security.

#info('Note', 'Shiro''s <code>Cookie</code> concept supports the <code>HttpOnly</code> flag even in Servlet 2.4 and 2.5 environments (whereas the Servlet API only supports it natively in 2.6 or later).')

<a name="Web-DisablingtheSessionCookie"></a>
#[[######Disabling the Session Cookie]]#

If you do not want session cookies to be used, you can disable their use by configuring the `sessionIdCookieEnabled` property to false. For example:

**Disabling native session cookies**

``` ini
[main]
...
securityManager.sessionManager.sessionIdCookieEnabled = false
```

<a name="Web-rememberme"></a>
<a name="Web-RememberMeServices"></a>
Remember Me Services
--------------------

Shiro will perform 'rememberMe' services if the `AuthenticationToken` implements the [`org.apache.shiro.authc.RememberMeAuthenticationToken`](static/current/apidocs/org/apache/shiro/authc/RememberMeAuthenticationToken.html) interface. This interface specifies a method:

``` java
boolean isRememberMe();
```

If this method returns `true`, Shiro will remember the end-user's identity across sessions.

#tip('UsernamePasswordToken and RememberMe', 'The frequently-used <code>UsernamePasswordToken</code> already implements the <code>RememberMeAuthenticationToken</code> interface and supports rememberMe logins.')

<a name="Web-ProgrammaticSupport"></a>
#[[###Programmatic Support]]#

To use rememberMe programmatically, you can set the value to `true` on a class that supports this configuration. For example, using the standard `UsernamePasswordToken`:

``` java
UsernamePasswordToken token = new UsernamePasswordToken(username, password);

token.setRememberMe(true);

SecurityUtils.getSubject().login(token);
...
```

<a name="Web-FormbasedLogin"></a>
#[[###Form-based Login]]#

For web applications, the `authc` filter is by default a [`FormAuthenticationFilter`](static/current/apidocs/org/apache/shiro/web/filter/authc/FormAuthenticationFilter.html). This supports reading the 'rememberMe' boolean as a form/request parameter. By default, it expects the request param to be named `rememberMe`. Here is an example shiro.ini config supporting this:

``` ini
[main]
authc.loginUrl = /login.jsp

[urls]

# your login form page here:
login.jsp = authc
```

And in your web form, have a checkbox named 'rememberMe':

``` html
<form ...>

   Username: <input type="text" name="username"/> <br/>
   Password: <input type="password" name="password"/>
    ...
   <input type="checkbox" name="rememberMe" value="true"/>Remember Me?
   ...
</form>
```

By default, the `FormAuthenticationFilter` will look for request parameters named `username`, `password` and `rememberMe`. If these are different than the form field names that you use in your form, you'll want to configure the names on the `FormAuthenticationFilter`. For example, in `shiro.ini`:

``` ini
[main]
...
authc.loginUrl = /whatever.jsp
authc.usernameParam = somethingOtherThanUsername
authc.passwordParam = somethingOtherThanPassword
authc.rememberMeParam = somethingOtherThanRememberMe
...
```

<a name="Web-Cookieconfiguration"></a>
#[[###Cookie configuration]]#

You can configure how the `rememberMe` cookie functions by setting the default {{RememberMeManager}}s various cookie properties. For example, in shiro.ini:

``` ini
[main]
...

securityManager.rememberMeManager.cookie.name = foo
securityManager.rememberMeManager.cookie.maxAge = blah
...
```

See the [`CookieRememberMeManager`](static/current/apidocs/org/apache/shiro/web/mgt/CookieRememberMeManager.html) and the supporting [`SimpleCookie`](static/current/apidocs/src-html/org/apache/shiro/web/servlet/SimpleCookie.html) JavaDoc for configuration properties.

<a name="Web-Custom%7B%7BRememberMeManager%7D%7D"></a>
#[[###Custom `RememberMeManager`]]#

It should be noted that if the default cookie-based `RememberMeManager` implementation does not meet your needs, you can plug in any you like in to the `securityManager` like you would configure any other object reference:

``` ini
[main]
...
rememberMeManager = com.my.impl.RememberMeManager
securityManager.rememberMeManager = $rememberMeManager
```
<a name="Web-taglibrary"></a>
<a name="Web-JSP%2FGSPTagLibrary"></a>
JSP / GSP Tag Library
---------------------

Apache Shiro provides a `Subject`-aware JSP/GSP tag library that allows you to control your JSP, JSTL or GSP page output based on the current Subject's state. This is quite useful for personalizing views based on the identity and authorization state of the current user viewing the web page.

<a name="Web-taglibrary"></a>
<a name="Web-TagLibraryConfiguration"></a>
#[[###Tag Library Configuration]]#

The Tag Library Descriptor (TLD) file is bundled in `shiro-web.jar` in the `META-INF/shiro.tld` file. To use any of the tags, add the following line to the top of your JSP page (or wherever you define page directives):

``` html
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
```

We've used the `shiro` prefix to indicate the shiro tag library namespace, but you can assign whatever name you like.

Now we'll cover each tag and show how it might be used to render a page.

<a name="Web-guesttag"></a>
<a name="Web-The%7B%7Bguest%7D%7Dtag"></a>
#[[### The `guest` tag]]#

The `guest` tag will display its wrapped content only if the current `Subject` is considered a 'guest'. A guest is any `Subject` that does not have an identity. That is, we don't know who the user is because they have not logged in and they are not remembered (from Remember Me services) from a previous site visit.

Example:

``` html
<shiro:guest>
    Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!
</shiro:guest>
```

The `guest` tag is the logical opposite of the [`user`](#Web-usertag) tag.

<a name="Web-usertag"></a>
<a name="Web-The%7B%7Buser%7D%7Dtag"></a>
#[[###The `user` tag]]#

The `user` tag will display its wrapped content only if the current `Subject` is considered a 'user'. A 'user' in this context is defined as a `Subject` with a known identity, either from a successful authentication or from 'RememberMe' services. Note that this tag is semantically different from the [authenticated](#Web-authenticatedtag) tag, which is more restrictive than this tag.

Example:

``` html
<shiro:user>
    Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.
</shiro:user>
```

The `user` tag is the logical opposite of the [`guest`](#Web-guesttag) tag.

<a name="Web-authenticatedtag"></a>
<a name="Web-The%7B%7Bauthenticated%7D%7Dtag"></a>
#[[###The `authenticated` tag]]#

Displays body content only if the current user has successfully authenticated _during their current session_. It is more restrictive than the 'user' tag. It is logically opposite to the 'notAuthenticated' tag.

The `authenticated` tag will display its wrapped content only if the current `Subject` has successfully authenticated _during their current session_. It is a more restrictive tag than the [user](#Web-usertag), which is used to guarantee identity in sensitive workflows.

Example:

``` html
<shiro:authenticated>
    <a href="updateAccount.jsp">Update your contact information</a>.
</shiro:authenticated>
```

The `authenticated` tag is the logical opposite of the [`notAuthenticated`](#Web-notauthenticatedtag) tag.

<a name="Web-notauthenticatedtag"></a>
<a name="Web-The%7B%7BnotAuthenticated%7D%7Dtag"></a>
#[[###The `notAuthenticated` tag]]#

The `notAuthenticated` tag will display its wrapped content if the current `Subject` has **NOT** yet successfully authenticated during the current session.

Example:

``` html
<shiro:notAuthenticated>
    Please <a href="login.jsp">login</a> in order to update your credit card information.
</shiro:notAuthenticated>
```

The `notAuthenticated` tag is the logical opposite of the [`authenticated`](#Web-authenticatedtag) tag.

<a name="Web-principaltag"></a>
<a name="Web-The%7B%7Bprincipal%7D%7Dtag"></a>
#[[###The `principal` tag]]#

The `principal` tag will output the Subject's [`principal`](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#getPrincipal--) (identifying attribute) or a property of that principal.

Without any tag attributes, the tag will render the `toString()` value of the principal. For example (assuming the principal is a String username):

``` html
Hello, <shiro:principal/>, how are you today?
```

This is (mostly) equivalent to the following:

``` html
Hello, <%= SecurityUtils.getSubject().getPrincipal().toString() %>, how are you today?
```

<a name="Web-Typedprincipal"></a>
#[[####Typed principal]]#

The `principal` tag assumes by default that the principal to print is the `subject.getPrincipal()` value. But if you wanted to print a value that is _not_ the primary principal, but another in the Subject's {[principal collection](static/current/apidocs/org/apache/shiro/subject/Subject.html#[[#]]#getPrincipals--), you can acquire that principal by type and print that value instead.

For example, printing the Subject's user ID (and not the username), assuming the ID was in the principal collection:

``` html
User ID: <principal type="java.lang.Integer"/>
```

This is (mostly) equivalent to the following:

``` html
User ID: <%= SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString() %>
```

<a name="Web-Principalproperty"></a>
#[[####Principal property]]#

But what if the principal (either the default primary principal or 'typed' principal above) is a complex object and not a simple string, and you wanted to reference a property on that principal? You can use the `property` attribute to indicate the name of the property to read (must be accessible via a JavaBeans-compatible getter method). For example (assuming the primary principal is a User object):

``` html
Hello, <shiro:principal property="firstName"/>, how are you today?
```

This is (mostly) equivalent to the following:

``` html
Hello, <%= SecurityUtils.getSubject().getPrincipal().getFirstName().toString() %>, how are you today?
```

Or, combined with the type attribute:

``` html
Hello, <shiro:principal type="com.foo.User" property="firstName"/>, how are you today?
```

this is largely equivalent to the following:

``` html
Hello, <%= SecurityUtils.getSubject().getPrincipals().oneByType(com.foo.User.class).getFirstName().toString() %>, how are you today?
```

<a name="Web-hasroletag"></a>
<a name="Web-The%7B%7BhasRole%7D%7Dtag"></a>
#[[###The `hasRole` tag]]#

The `hasRole` tag will display its wrapped content only if the current `Subject` is assigned the specified role.

For example:

``` html
<shiro:hasRole name="administrator">
    <a href="admin.jsp">Administer the system</a>
</shiro:hasRole>
```

The `hasRole` tag is the logical opposite of the [lacksRole](#Web-lacksroletag) tag.

<a name="Web-lacksroletag"></a>
<a name="Web-The%7B%7BlacksRole%7D%7Dtag"></a>
#[[###The `lacksRole` tag]]#

The `lacksRole` tag will display its wrapped content only if the current `Subject` **is NOT** assigned the specified role.

For example:

``` html
<shiro:lacksRole name="administrator">
    Sorry, you are not allowed to administer the system.
</shiro:lacksRole>
```

The `lacksRole` tag is the logical opposite of the [hasRole](#Web-hasroletag) tag.

<a name="Web-hasanyroletag"></a>
<a name="Web-The%7B%7BhasAnyRole%7D%7Dtag"></a>
#[[###The `hasAnyRole` tag]]#

The `hasAnyRole` tag will display its wrapped content if the current `Subject` is assigned _any_ of the specified roles from a comma-delimited list of role names.

For example:

``` html
<shiro:hasAnyRoles name="developer, project manager, administrator">
    You are either a developer, project manager, or administrator.
</shiro:hasAnyRoles>
```

The `hasAnyRole` tag does not currently have a logically opposite tag.

<a name="Web-haspermissiontag"></a>
<a name="Web-The%7B%7BhasPermission%7D%7Dtag"></a>
#[[###The `hasPermission` tag]]#

The `hasPermission` tag will display its wrapped content only if the current `Subject` 'has' (implies) the specified permission. That is, the user has the specified ability.

For example:

``` html
<shiro:hasPermission name="user:create">
    <a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>
```

The `hasPermission` tag is the logical opposite of the [lacksPermission](#Web-lackspermissiontag) tag.

<a name="Web-lackspermissiontag"></a>
<a name="Web-The%7B%7BlacksPermission%7D%7Dtag"></a>
#[[###The `lacksPermission` tag]]#

The `lacksPermission` tag will display its wrapped content only if the current `Subject` **DOES NOT** have (imply) the specified permission. That is, the user **DOES NOT** have the specified ability.

For example:

``` html
<shiro:lacksPermission name="user:delete">
    Sorry, you are not allowed to delete user accounts.
</shiro:lacksPermission>
```

The `lacksPermission` tag is the logical opposite of the [hasPermission](#Web-haspermissiontag) tag.

#lendAHandDoc()

<input type="hidden" id="ghEditPage" value="web.md.vtl"></input>
