You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shiro.apache.org by lp...@apache.org on 2026/06/17 12:56:34 UTC
(shiro) 03/08: Set pom version to 3.0.0-SNAPSHOT
This is an automated email from the ASF dual-hosted git repository.
lprimak pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shiro.git
commit 2b75a3bda83412d59e6f9784d9164c3564fdb0f4
Author: francois papon <fp...@apache.org>
AuthorDate: Mon Aug 12 10:47:51 2024 +0200
Set pom version to 3.0.0-SNAPSHOT
---
.github/dependabot.yml | 68 ++--
.github/workflows/codeql.yml | 6 +
.github/workflows/maven.yml | 14 +-
.jenkins.groovy | 9 +-
.jenkins_maven_args | 2 +-
.mvn/maven.config | 1 +
.pre-commit-config.yaml | 2 +-
NOTICE | 2 +-
RELEASE-NOTES | 5 +
bom/pom.xml | 128 -------
.../apache/shiro/cache/AbstractCacheManager.java | 4 +-
.../src/main/java/org/apache/shiro/config/Ini.java | 6 +-
.../shiro/config/ogdl/ReflectionBuilder.java | 71 ++--
crypto/cipher/pom.xml | 4 -
.../shiro/crypto/hash/AbstractCryptHash.java | 5 +-
.../org/apache/shiro/crypto/hash/AbstractHash.java | 5 +-
.../shiro/crypto/hash/DefaultHashService.java | 3 +-
.../org/apache/shiro/crypto/hash/SimpleHash.java | 9 +-
.../hash/format/DefaultHashFormatFactory.java | 8 +-
crypto/support/hashes/argon2/pom.xml | 2 +-
.../crypto/support/hashes/argon2/Argon2Hash.java | 2 +
crypto/support/hashes/bcrypt/pom.xml | 2 +-
.../crypto/support/hashes/bcrypt/BCryptHash.java | 5 +-
.../support/hashes/bcrypt/BCryptProvider.java | 4 +-
.../shiro/event/support/DefaultEventBus.java | 16 +-
.../shiro/event/support/EventClassComparator.java | 8 +-
.../event/support/EventListenerComparator.java | 6 +-
.../support/SingleArgumentMethodEventListener.java | 6 +-
.../shiro/event/support/TypedEventListener.java | 2 +-
integration-tests/guice3/pom.xml | 141 --------
integration-tests/guice4/pom.xml | 150 ---------
jitpack.yml | 6 +-
lang/pom.xml | 8 +-
.../org/apache/shiro/lang/codec/CodecSupport.java | 38 +--
.../org/apache/shiro/lang/io/ResourceUtils.java | 61 ++--
.../java/org/apache/shiro/lang/util/Assert.java | 18 +-
.../org/apache/shiro/lang/util/ByteSource.java | 24 +-
.../apache/shiro/lang/util/ByteSourceWrapper.java | 8 +-
.../java/org/apache/shiro/lang/util/ByteUtils.java | 6 +-
.../org/apache/shiro/lang/util/ClassUtils.java | 55 ++-
.../shiro/lang/util/JspEngineDependency.java | 2 +-
.../org/apache/shiro/lang/util/LifecycleUtils.java | 16 +-
.../apache/shiro/lang/util/SimpleByteSource.java | 5 +-
.../org/apache/shiro/lang/util/SoftHashMap.java | 28 +-
.../org/apache/shiro/lang/util/StringUtils.java | 23 +-
.../org/apache/shiro/lang/util/ClassUtilsTest.java | 18 +-
lang/src/test/resources/test-data/file.json | 4 +
pom.xml | 367 +++++++--------------
samples/spring-boot-3-web/pom.xml | 170 ----------
samples/web-jakarta/pom.xml | 200 -----------
shiro.doap.rdf | 14 +
src/suppressions.xml | 1 +
support/ehcache/pom.xml | 86 -----
support/hazelcast/pom.xml | 89 -----
test-coverage/pom.xml | 2 +-
tools/hasher/pom.xml | 2 +-
.../org/apache/shiro/tools/hasher/HasherTest.java | 4 +-
web/pom.xml | 26 +-
.../web/config/IniFilterChainResolverFactory.java | 28 +-
.../shiro/web/config/ShiroFilterConfiguration.java | 2 +-
.../web/config/WebIniSecurityManagerFactory.java | 3 +-
.../shiro/web/env/DefaultWebEnvironment.java | 2 +-
.../apache/shiro/web/env/EnvironmentLoader.java | 12 +-
.../shiro/web/env/EnvironmentLoaderListener.java | 6 +-
.../apache/shiro/web/env/IniWebEnvironment.java | 9 +-
.../shiro/web/env/MutableWebEnvironment.java | 2 +-
.../org/apache/shiro/web/env/WebEnvironment.java | 2 +-
.../shiro/web/filter/AccessControlFilter.java | 22 +-
.../shiro/web/filter/InvalidRequestFilter.java | 8 +-
.../shiro/web/filter/PathConfigProcessor.java | 2 +-
.../shiro/web/filter/PathMatchingFilter.java | 20 +-
.../shiro/web/filter/authc/AnonymousFilter.java | 4 +-
.../web/filter/authc/AuthenticatingFilter.java | 6 +-
.../web/filter/authc/AuthenticationFilter.java | 6 +-
.../authc/BasicHttpAuthenticationFilter.java | 17 +-
.../authc/BearerHttpAuthenticationFilter.java | 4 +-
.../web/filter/authc/FormAuthenticationFilter.java | 8 +-
.../web/filter/authc/HttpAuthenticationFilter.java | 10 +-
.../shiro/web/filter/authc/LogoutFilter.java | 16 +-
.../shiro/web/filter/authc/NoAccessFilter.java | 48 +++
.../filter/authc/PassThruAuthenticationFilter.java | 4 +-
.../apache/shiro/web/filter/authc/UserFilter.java | 14 +-
.../shiro/web/filter/authc/package-info.java | 2 +-
.../web/filter/authz/AuthorizationFilter.java | 12 +-
.../apache/shiro/web/filter/authz/HostFilter.java | 4 +-
.../filter/authz/HttpMethodPermissionFilter.java | 10 +-
.../apache/shiro/web/filter/authz/IpFilter.java | 4 +-
.../authz/PermissionsAuthorizationFilter.java | 4 +-
.../apache/shiro/web/filter/authz/PortFilter.java | 6 +-
.../web/filter/authz/RolesAuthorizationFilter.java | 4 +-
.../apache/shiro/web/filter/authz/SslFilter.java | 18 +-
.../shiro/web/filter/authz/package-info.java | 2 +-
.../apache/shiro/web/filter/mgt/DefaultFilter.java | 14 +-
.../web/filter/mgt/DefaultFilterChainManager.java | 33 +-
.../shiro/web/filter/mgt/FilterChainManager.java | 28 +-
.../shiro/web/filter/mgt/FilterChainResolver.java | 8 +-
.../shiro/web/filter/mgt/NamedFilterList.java | 4 +-
.../mgt/PathMatchingFilterChainResolver.java | 10 +-
.../web/filter/mgt/SimpleNamedFilterList.java | 4 +-
.../org/apache/shiro/web/filter/package-info.java | 2 +-
.../filter/session/NoSessionCreationFilter.java | 4 +-
.../shiro/web/mgt/CookieRememberMeManager.java | 6 +-
.../shiro/web/mgt/DefaultWebSecurityManager.java | 24 +-
.../web/mgt/DefaultWebSessionStorageEvaluator.java | 2 +-
.../shiro/web/mgt/DefaultWebSubjectFactory.java | 4 +-
.../apache/shiro/web/servlet/AbstractFilter.java | 16 +-
.../shiro/web/servlet/AbstractShiroFilter.java | 44 +--
.../org/apache/shiro/web/servlet/AdviceFilter.java | 34 +-
.../java/org/apache/shiro/web/servlet/Cookie.java | 4 +-
.../apache/shiro/web/servlet/IniShiroFilter.java | 4 +-
.../apache/shiro/web/servlet/NameableFilter.java | 10 +-
.../shiro/web/servlet/OncePerRequestFilter.java | 20 +-
.../shiro/web/servlet/ProxiedFilterChain.java | 10 +-
.../shiro/web/servlet/ServletContextSupport.java | 2 +-
.../shiro/web/servlet/ShiroHttpServletRequest.java | 23 +-
.../web/servlet/ShiroHttpServletResponse.java | 10 +-
.../apache/shiro/web/servlet/ShiroHttpSession.java | 43 +--
.../org/apache/shiro/web/servlet/SimpleCookie.java | 18 +-
.../shiro/web/session/HttpServletSession.java | 12 +-
.../web/session/mgt/DefaultWebSessionContext.java | 4 +-
.../web/session/mgt/DefaultWebSessionManager.java | 8 +-
.../mgt/ServletContainerSessionManager.java | 6 +-
.../shiro/web/session/mgt/WebSessionContext.java | 4 +-
.../shiro/web/session/mgt/WebSessionKey.java | 4 +-
.../org/apache/shiro/web/subject/WebSubject.java | 4 +-
.../shiro/web/subject/WebSubjectContext.java | 4 +-
.../subject/support/DefaultWebSubjectContext.java | 4 +-
.../web/subject/support/WebDelegatingSubject.java | 13 +-
.../apache/shiro/web/tags/AuthenticatedTag.java | 4 +-
.../java/org/apache/shiro/web/tags/GuestTag.java | 4 +-
.../apache/shiro/web/tags/NotAuthenticatedTag.java | 4 +-
.../org/apache/shiro/web/tags/PermissionTag.java | 4 +-
.../org/apache/shiro/web/tags/PrincipalTag.java | 7 +-
.../java/org/apache/shiro/web/tags/RoleTag.java | 4 +-
.../java/org/apache/shiro/web/tags/SecureTag.java | 4 +-
.../java/org/apache/shiro/web/tags/UserTag.java | 2 +-
.../java/org/apache/shiro/web/util/CorsUtils.java | 2 +-
.../org/apache/shiro/web/util/RedirectView.java | 24 +-
.../apache/shiro/web/util/RequestPairSource.java | 4 +-
.../org/apache/shiro/web/util/SavedRequest.java | 2 +-
.../java/org/apache/shiro/web/util/WebUtils.java | 51 +--
.../IniFilterChainResolverFactoryTest.groovy | 6 +-
.../shiro/web/env/EnvironmentLoaderTest.groovy | 2 +-
.../apache/shiro/web/env/MockWebEnvironment.groovy | 2 +-
.../web/filter/InvalidRequestFilterTest.groovy | 7 +-
.../BearerHttpFilterAuthenticationTest.groovy | 14 +-
.../shiro/web/filter/authc/LogoutFilterTest.groovy | 8 +-
.../mgt/DefaultFilterChainManagerTest.groovy | 15 +-
.../session/NoSessionCreationFilterTest.groovy | 4 +-
.../DefaultWebSessionStorageEvaluatorTest.groovy | 4 +-
.../web/servlet/AbstractShiroFilterTest.groovy | 4 +-
.../shiro/web/servlet/IniShiroFilterTest.groovy | 6 +-
.../shiro/web/servlet/ShiroFilterTest.groovy | 4 +-
.../servlet/ShiroHttpServletResponseTest.groovy | 6 +-
.../mgt/DefaultWebSessionManagerTest.groovy | 6 +-
.../mgt/ServletContainerSessionManagerTest.groovy | 6 +-
.../apache/shiro/web/util/SavedRequestTest.groovy | 2 +-
.../org/apache/shiro/web/util/WebUtilsTest.groovy | 2 +-
.../test/java/org/apache/shiro/web/WebTest.java | 4 +-
.../config/WebIniSecurityManagerFactoryTest.java | 2 +-
.../web/env/EnvironmentLoaderServiceTest.java | 2 +-
.../java/org/apache/shiro/web/env/FilterStub.java | 12 +-
.../apache/shiro/web/env/WebEnvironmentStub.java | 2 +-
.../PathMatchingFilterParameterizedTest.java | 6 +-
.../shiro/web/filter/PathMatchingFilterTest.java | 6 +-
.../authc/BasicHttpFilterAuthenticationTest.java | 5 +-
.../web/filter/authz/AuthorizationFilterTest.java | 8 +-
.../shiro/web/filter/authz/IpFilterTest.java | 2 +-
.../shiro/web/filter/authz/PortFilterTest.java | 4 +-
.../shiro/web/filter/authz/SslFilterTest.java | 4 +-
.../mgt/PathMatchingFilterChainResolverTest.java | 12 +-
.../web/filter/mgt/SimpleNamedFilterListTest.java | 8 +-
.../shiro/web/mgt/CookieRememberMeManagerTest.java | 6 +-
.../web/mgt/DefaultWebSecurityManagerTest.java | 14 +-
.../web/servlet/OncePerRequestFilterTest.java | 8 +-
.../web/servlet/ShiroHttpServletRequestTest.java | 4 +-
.../apache/shiro/web/servlet/SimpleCookieTest.java | 10 +-
.../shiro/web/session/HttpServletSessionTest.java | 2 +-
.../org/apache/shiro/web/util/CorsUtilsTest.java | 2 +-
web/src/test/resources/log4j2-test.xml | 2 +-
180 files changed, 1061 insertions(+), 2020 deletions(-)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 407c1d16b..bdabba195 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -18,12 +18,28 @@
---
version: 2
updates:
- # Dependencies for Maven
+ # Dependencies for Maven - main branch
- package-ecosystem: 'maven'
directory: '/'
schedule:
interval: 'weekly'
open-pull-requests-limit: 50
+ groups:
+ maven-dependencies:
+ patterns:
+ - '*'
+
+ # Dependencies for Maven - 2.x branch
+ - package-ecosystem: 'maven'
+ directory: '/'
+ target-branch: '2.x'
+ schedule:
+ interval: 'monthly'
+ open-pull-requests-limit: 50
+ groups:
+ maven-dependencies:
+ patterns:
+ - '*'
ignore:
- dependency-name: "jakarta.platform:*"
update-types: [ "version-update:semver-major" ]
@@ -70,51 +86,23 @@ updates:
- dependency-name: "com.hazelcast:*"
update-types: [ "version-update:semver-minor" ]
- # Dependencies for Maven - on 1.13.x
- - package-ecosystem: 'maven'
+ # Dependencies for GitHub Actions
+ - package-ecosystem: 'github-actions'
directory: '/'
- target-branch: '1.13.x'
schedule:
- interval: 'monthly'
- open-pull-requests-limit: 50
- ignore:
- - dependency-name: "jakarta.servlet.*:*"
- update-types: [ "version-update:semver-major" ]
- - dependency-name: "javax.servlet:javax.servlet-api"
- update-types: [ "version-update:semver-major" ]
- - dependency-name: "org.glassfish.web:jakarta.servlet.jsp.jstl"
- update-types: [ "version-update:semver-major" ]
- - dependency-name: "org.glassfish.jersey.*:*"
- update-types: [ "version-update:semver-major" ]
-
- - dependency-name: "org.jasig.cas.client:*"
- update-types: [ "version-update:semver-minor" ]
- - dependency-name: "org.slf4j:*"
- update-types: [ "version-update:semver-major" ]
- - dependency-name: "org.codehaus.groovy:*"
- update-types: [ "version-update:semver-major" ]
- - dependency-name: "ch.qos.logback:logback-classic"
- update-types: [ "version-update:semver-minor" ]
- - dependency-name: "com.hazelcast:hazelcast"
- update-types: [ "version-update:semver-major" ]
- - dependency-name: "org.aspectj:*"
- update-types: [ "version-update:semver-patch" ]
-
- - dependency-name: "org.springframework*:*"
- update-types: [ "version-update:semver-major" ]
-
- - dependency-name: "org.eclipse.jetty:*"
- update-types: [ "version-update:semver-major" ]
- - dependency-name: "com.github.mjeanroy:junit-servers-jetty"
- update-types: [ "version-update:semver-minor" ]
- - dependency-name: "com.hazelcast:*"
- update-types: [ "version-update:semver-minor" ]
+ interval: 'weekly'
+ open-pull-requests-limit: 10
+ groups:
+ github-actions-dependencies:
+ patterns:
+ - '*'
- # Dependencies for GitHub Actions
+ # Dependencies for GitHub Actions - on 2.x
- package-ecosystem: 'github-actions'
directory: '/'
+ target-branch: '2.x'
schedule:
- interval: 'weekly'
+ interval: 'monthly'
open-pull-requests-limit: 10
groups:
github-actions-dependencies:
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 7f089051b..eeb55e923 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -66,6 +66,12 @@ jobs:
with:
persist-credentials: false
+ - name: Set up JDK
+ uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
+ with:
+ java-version: 25
+ distribution: temurin
+
- name: Cache local Maven repository
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 5d67fc596..792c079fb 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -24,9 +24,9 @@ permissions:
on:
workflow_dispatch: { }
push:
- branches: [ main, '1.13.x', '1.12.x', '1.11.x', '1.10.x' ]
+ branches: [ main, '3.x', '4.x' ]
pull_request:
- branches: [ main, '1.13.x', '1.12.x', '1.11.x', '1.10.x' ]
+ branches: [ main ]
jobs:
build:
@@ -51,7 +51,7 @@ jobs:
# zizmor: ignore[template-injection]
run: >-
./mvnw verify --show-version --errors --batch-mode --no-transfer-progress -Pdocs
- -Pskip_jakarta_ee_tests -Dgh_user=${{ github.actor }} -Dgh_token=${{ secrets.GITHUB_TOKEN }}
+ -Dgh_user=${{ github.actor }} -Dgh_token=${{ secrets.GITHUB_TOKEN }}
build-all:
needs: build
@@ -59,7 +59,7 @@ jobs:
strategy:
matrix:
os: [ 'ubuntu-latest', 'windows-latest', 'macOS-latest' ]
- jdk: [ 11, 17, 21, 25 ]
+ jdk: [ 21, 25 ]
dist: [ 'temurin', 'adopt-openj9', 'zulu' ]
exclude:
# was already built
@@ -95,14 +95,14 @@ jobs:
distribution: ${{ matrix.dist }}
- name: Build with Maven (Linux)
- if: matrix.os == 'ubuntu-latest' && matrix.jdk <= 21
+ if: matrix.os == 'ubuntu-latest' && matrix.jdk >= 21
# zizmor: ignore[template-injection]
run: >-
./mvnw verify --show-version --errors --batch-mode --no-transfer-progress
-Dgh_user=${{ github.actor }} -Dgh_token=${{ secrets.GITHUB_TOKEN }}
- - name: Build with Maven (non-Linux or JDK > 21)
- if: matrix.os != 'ubuntu-latest' || matrix.jdk > 21
+ - name: Build with Maven (non-Linux)
+ if: matrix.os != 'ubuntu-latest' || matrix.jdk < 21
run: >-
./mvnw verify --show-version --errors --batch-mode --no-transfer-progress
-Pskip_jakarta_ee_tests
diff --git a/.jenkins.groovy b/.jenkins.groovy
index d89fb3057..dc680ebfd 100644
--- a/.jenkins.groovy
+++ b/.jenkins.groovy
@@ -17,7 +17,7 @@
* under the License.
*/
-def deployableBranch = env.BRANCH_NAME ==~ /(1.12.x|1.11.x|1.10.x|main|3.x)/
+def deployableBranch = env.BRANCH_NAME ==~ /(1.13.x|2.x|3.x|4.x|main)/
def latestSupportedJDK = 'jdk_25_latest'
def builtinVersion = '999-SNAPSHOT'
def nextVersion
@@ -39,7 +39,7 @@ pipeline {
axis {
// https://cwiki.apache.org/confluence/display/INFRA/JDK+Installation+Matrix
name 'MATRIX_JDK'
- values 'jdk_25_latest', 'jdk_11_latest', 'jdk_17_latest', 'jdk_21_latest'
+ values 'jdk_26_latest', 'jdk_25_latest', 'jdk_21_latest'
}
// Additional axes, like OS and maven version can be configured here.
}
@@ -107,6 +107,9 @@ pipeline {
def parts = latestRelease.tokenize('.')
def nextPatch = parts[2].toInteger() + 1
nextVersion = "${parts[0]}.${parts[1]}.${nextPatch}-SNAPSHOT"
+ if (env.BRANCH_NAME == '2.x') {
+ nextVersion = '2.0.0-SNAPSHOT'
+ }
if (env.BRANCH_NAME == '3.x') {
nextVersion = '3.0.0-SNAPSHOT'
}
@@ -130,7 +133,7 @@ pipeline {
steps {
echo 'Building'
sh './mvnw verify --show-version --errors --batch-mode --no-transfer-progress \
- -Dmaven.test.failure.ignore=true -Pskip_jakarta_ee_tests'
+ -Dmaven.test.failure.ignore=true -Pskip_jakarta_ee_tests -Djdk.version=17 -Djapicmp.skip=true'
}
post {
always {
diff --git a/.jenkins_maven_args b/.jenkins_maven_args
index 130416653..c7750edfb 100644
--- a/.jenkins_maven_args
+++ b/.jenkins_maven_args
@@ -1 +1 @@
--Dmaven.compiler.release=11
+-Dmaven.compiler.release=17 -Djapicmp.skip=true
diff --git a/.mvn/maven.config b/.mvn/maven.config
new file mode 100644
index 000000000..ac68ccb77
--- /dev/null
+++ b/.mvn/maven.config
@@ -0,0 +1 @@
+-Djapicmp.skip=true
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4b3d61885..db449c120 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -156,7 +156,7 @@ repos:
description: check PNG files with oxipng
args: ['--fix', '-o', '4', '--strip', 'safe', '--alpha']
- repo: https://github.com/python-jsonschema/check-jsonschema
- rev: f805888065fdb6162e1f800e50bb9460cbd223d6 # frozen: 0.37.2
+ rev: 5030dca3047414c338091455ac41803200ec1f0f # frozen: 0.37.3
hooks:
- id: check-citation-file-format
name: run check-citation-file-format
diff --git a/NOTICE b/NOTICE
index 1a356397f..f97e27feb 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
Apache Shiro
-Copyright 2008-2022 The Apache Software Foundation
+Copyright 2008-2026 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index cfb076513..bfa32ebd0 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -15,6 +15,11 @@
# specific language governing permissions and limitations
# under the License.
+#### DEPRECATED ####
+Currently Apache Shiro uses GitHub releases for release notes, so this file is no longer being updated.
+It will be removed in a future release.
+#### DEPRECATED ####
+
This is not an official release notes document. It exists for Shiro developers
to jot down their notes while working in the source code. These notes will be
combined with Jira’s auto-generated release notes during a release for the
diff --git a/bom/pom.xml b/bom/pom.xml
deleted file mode 100644
index 299a0f44e..000000000
--- a/bom/pom.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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
- ~ "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.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>shiro-root</artifactId>
- <groupId>org.apache.shiro</groupId>
- <version>999-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>shiro-bom</artifactId>
- <name>Apache Shiro :: BOM</name>
- <packaging>pom</packaging>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-core</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-web</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.shiro</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-jakarta-ee</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.shiro</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-cdi</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.shiro</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-jaxrs</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.shiro</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.shiro</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring-boot-web-starter</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.shiro</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring-boot-starter</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.shiro</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
- </dependencyManagement>
-</project>
diff --git a/cache/src/main/java/org/apache/shiro/cache/AbstractCacheManager.java b/cache/src/main/java/org/apache/shiro/cache/AbstractCacheManager.java
index 62550c258..9f27fd6bb 100644
--- a/cache/src/main/java/org/apache/shiro/cache/AbstractCacheManager.java
+++ b/cache/src/main/java/org/apache/shiro/cache/AbstractCacheManager.java
@@ -94,7 +94,7 @@ public abstract class AbstractCacheManager implements CacheManager, Destroyable
*/
public void destroy() throws Exception {
while (!caches.isEmpty()) {
- for (Cache cache : caches.values()) {
+ for (Cache<?, ?> cache : caches.values()) {
LifecycleUtils.destroy(cache);
}
caches.clear();
@@ -108,7 +108,7 @@ public abstract class AbstractCacheManager implements CacheManager, Destroyable
.append(caches.size())
.append(" cache(s)): [");
int i = 0;
- for (Cache cache : values) {
+ for (Cache<?, ?> cache : values) {
if (i > 0) {
sb.append(", ");
}
diff --git a/config/core/src/main/java/org/apache/shiro/config/Ini.java b/config/core/src/main/java/org/apache/shiro/config/Ini.java
index b854c5e7b..bc1a897ce 100644
--- a/config/core/src/main/java/org/apache/shiro/config/Ini.java
+++ b/config/core/src/main/java/org/apache/shiro/config/Ini.java
@@ -446,8 +446,7 @@ public final class Ini implements Map<String, Ini.Section> {
}
public boolean equals(Object obj) {
- if (obj instanceof Ini) {
- Ini ini = (Ini) obj;
+ if (obj instanceof Ini ini) {
return this.sections.equals(ini.sections);
}
return false;
@@ -710,8 +709,7 @@ public final class Ini implements Map<String, Ini.Section> {
@Override
public boolean equals(Object obj) {
- if (obj instanceof Section) {
- Section other = (Section) obj;
+ if (obj instanceof Section other) {
return getName().equals(other.getName()) && this.props.equals(other.props);
}
return false;
diff --git a/config/ogdl/src/main/java/org/apache/shiro/config/ogdl/ReflectionBuilder.java b/config/ogdl/src/main/java/org/apache/shiro/config/ogdl/ReflectionBuilder.java
index c5f575b45..aa350452e 100644
--- a/config/ogdl/src/main/java/org/apache/shiro/config/ogdl/ReflectionBuilder.java
+++ b/config/ogdl/src/main/java/org/apache/shiro/config/ogdl/ReflectionBuilder.java
@@ -232,14 +232,14 @@ public class ReflectionBuilder {
//prefer a named object first:
Object value = objects.get(EVENT_BUS_NAME);
- if (value instanceof EventBus) {
- return (EventBus) value;
+ if (value instanceof EventBus bus) {
+ return bus;
}
//couldn't find a named 'eventBus' EventBus object. Try to find the first typed value we can:
for (Object v : objects.values()) {
- if (v instanceof EventBus) {
- return (EventBus) v;
+ if (v instanceof EventBus bus) {
+ return bus;
}
}
@@ -247,8 +247,8 @@ public class ReflectionBuilder {
}
private boolean applyEventBusIfNecessary(Object value) {
- if (value instanceof EventBusAware) {
- ((EventBusAware) value).setEventBus(this.eventBus);
+ if (value instanceof EventBusAware aware) {
+ aware.setEventBus(this.eventBus);
return true;
}
return false;
@@ -357,8 +357,8 @@ public class ReflectionBuilder {
Object instance;
try {
instance = ClassUtils.newInstance(value);
- if (instance instanceof Nameable) {
- ((Nameable) instance).setName(name);
+ if (instance instanceof Nameable nameable) {
+ nameable.setName(name);
}
} catch (Exception e) {
instance = alternateObjectSupplier.apply(value);
@@ -371,13 +371,13 @@ public class ReflectionBuilder {
objects.put(name, instance);
}
- protected void applyProperty(String key, String value, Map objects) {
+ protected void applyProperty(String key, String value, Map<?, ?> objects) {
int index = key.indexOf('.');
if (index >= 0) {
String name = key.substring(0, index);
- String property = key.substring(index + 1, key.length());
+ String property = key.substring(index + 1);
if (GLOBAL_PROPERTY_PREFIX.equalsIgnoreCase(name)) {
applyGlobalProperty(objects, property, value);
@@ -391,7 +391,7 @@ public class ReflectionBuilder {
}
}
- protected void applyGlobalProperty(Map objects, String property, String value) {
+ protected void applyGlobalProperty(Map<?, ?> objects, String property, String value) {
for (Object instance : objects.values()) {
try {
PropertyDescriptor pd = beanUtilsBean.getPropertyUtils().getPropertyDescriptor(instance, property);
@@ -407,7 +407,7 @@ public class ReflectionBuilder {
}
}
- protected void applySingleProperty(Map objects, String name, String property, String value) {
+ protected void applySingleProperty(Map<?, ?> objects, String name, String property, String value) {
Object instance = objects.get(name);
if (property.equals("class")) {
throw new IllegalArgumentException("Property keys should not contain 'class' properties since these "
@@ -455,8 +455,8 @@ public class ReflectionBuilder {
String id = getId(reference);
LOGGER.debug("Encountered object reference '{}'. Looking up object with id '{}'", reference, id);
final Object referencedObject = getReferencedObject(id);
- if (referencedObject instanceof Factory) {
- return ((Factory) referencedObject).getInstance();
+ if (referencedObject instanceof Factory<?> factory) {
+ return factory.getInstance();
}
return referencedObject;
}
@@ -492,15 +492,15 @@ public class ReflectionBuilder {
//SHIRO-423: check to see if the value is a referenced Set already, and if so, return it immediately:
if (tokens.length == 1 && isReference(tokens[0])) {
Object reference = resolveReference(tokens[0]);
- if (reference instanceof Set) {
- return (Set) reference;
+ if (reference instanceof Set<?> set) {
+ return set;
}
}
- Set<String> setTokens = new LinkedHashSet<String>(Arrays.asList(tokens));
+ Set<String> setTokens = new LinkedHashSet<>(Arrays.asList(tokens));
//now convert into correct values and/or references:
- Set<Object> values = new LinkedHashSet<Object>(setTokens.size());
+ Set<Object> values = new LinkedHashSet<>(setTokens.size());
for (String token : setTokens) {
Object value = resolveValue(token);
values.add(value);
@@ -518,12 +518,12 @@ public class ReflectionBuilder {
//SHIRO-423: check to see if the value is a referenced Map already, and if so, return it immediately:
if (tokens.length == 1 && isReference(tokens[0])) {
Object reference = resolveReference(tokens[0]);
- if (reference instanceof Map) {
- return (Map) reference;
+ if (reference instanceof Map<?, ?> map) {
+ return map;
}
}
- Map<String, String> mapTokens = new LinkedHashMap<String, String>(tokens.length);
+ Map<String, String> mapTokens = new LinkedHashMap<>(tokens.length);
for (String token : tokens) {
String[] kvPair = StringUtils.split(token, MAP_KEY_VALUE_DELIMITER);
if (kvPair == null || kvPair.length != 2) {
@@ -536,7 +536,7 @@ public class ReflectionBuilder {
}
//now convert into correct values and/or references:
- Map<Object, Object> map = new LinkedHashMap<Object, Object>(mapTokens.size());
+ Map<Object, Object> map = new LinkedHashMap<>(mapTokens.size());
for (Map.Entry<String, String> entry : mapTokens.entrySet()) {
Object key = resolveValue(entry.getKey());
Object value = resolveValue(entry.getValue());
@@ -556,13 +556,13 @@ public class ReflectionBuilder {
//SHIRO-423: check to see if the value is a referenced Collection already, and if so, return it immediately:
if (tokens.length == 1 && isReference(tokens[0])) {
Object reference = resolveReference(tokens[0]);
- if (reference instanceof Collection) {
- return (Collection) reference;
+ if (reference instanceof Collection<?> collection) {
+ return collection;
}
}
//now convert into correct values and/or references:
- List<Object> values = new ArrayList<Object>(tokens.length);
+ List<Object> values = new ArrayList<>(tokens.length);
for (String token : tokens) {
Object value = resolveValue(token);
values.add(value);
@@ -579,13 +579,13 @@ public class ReflectionBuilder {
//SHIRO-423: check to see if the value is a referenced List already, and if so, return it immediately:
if (tokens.length == 1 && isReference(tokens[0])) {
Object reference = resolveReference(tokens[0]);
- if (reference instanceof List) {
- return (List) reference;
+ if (reference instanceof List<?> list) {
+ return list;
}
}
//now convert into correct values and/or references:
- List<Object> values = new ArrayList<Object>(tokens.length);
+ List<Object> values = new ArrayList<>(tokens.length);
for (String token : tokens) {
Object value = resolveValue(token);
values.add(value);
@@ -670,11 +670,10 @@ public class ReflectionBuilder {
@SuppressWarnings("unchecked")
var map = (Map<Object, Object>) getProperty(object, mapPropertyPath);
Object mapKey = resolveValue(keyString);
- //noinspection unchecked
map.put(mapKey, value);
} else {
//must be an array property. Convert the key string to an index:
- int index = Integer.valueOf(keyString);
+ int index = Integer.parseInt(keyString);
setIndexedProperty(object, mapPropertyPath, index, value);
}
}
@@ -683,12 +682,12 @@ public class ReflectionBuilder {
//recursively call this method with the remaining property path
Object referencedValue = null;
if (isTypedProperty(object, mapPropertyPath, Map.class)) {
- Map map = (Map) getProperty(object, mapPropertyPath);
+ Map<?, ?> map = (Map<?, ?>) getProperty(object, mapPropertyPath);
Object mapKey = resolveValue(keyString);
referencedValue = map.get(mapKey);
} else {
//must be an array property:
- int index = Integer.valueOf(keyString);
+ int index = Integer.parseInt(keyString);
referencedValue = getIndexedProperty(object, mapPropertyPath, index);
}
@@ -806,8 +805,7 @@ public class ReflectionBuilder {
//we execute bean configuration statements in the order they are declared.
statements.add(statement);
- if (statement instanceof InstantiationStatement) {
- InstantiationStatement is = (InstantiationStatement) statement;
+ if (statement instanceof InstantiationStatement is) {
beanConfigurations.add(new BeanConfiguration(is));
} else {
AssignmentStatement as = (AssignmentStatement) statement;
@@ -1052,12 +1050,11 @@ public class ReflectionBuilder {
//////////////////////////
// CollectionUtils cannot be removed from shiro-core until 2.0 as it has a dependency on PrincipalCollection
- private static boolean isEmpty(Map m) {
+ private static boolean isEmpty(Map<?, ?> m) {
return m == null || m.isEmpty();
}
- private static boolean isEmpty(Collection c) {
+ private static boolean isEmpty(Collection<?> c) {
return c == null || c.isEmpty();
}
-
}
diff --git a/crypto/cipher/pom.xml b/crypto/cipher/pom.xml
index 1adc24c60..6dfadc820 100644
--- a/crypto/cipher/pom.xml
+++ b/crypto/cipher/pom.xml
@@ -54,10 +54,6 @@
</instructions>
</configuration>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- </plugin>
</plugins>
</build>
diff --git a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/AbstractCryptHash.java b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/AbstractCryptHash.java
index 631505b8d..9d13435b6 100644
--- a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/AbstractCryptHash.java
+++ b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/AbstractCryptHash.java
@@ -23,6 +23,7 @@ import org.apache.shiro.lang.codec.Base64;
import org.apache.shiro.lang.codec.Hex;
import org.apache.shiro.lang.util.ByteSource;
+import java.io.Serial;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
@@ -49,6 +50,7 @@ public abstract class AbstractCryptHash implements Hash, Serializable {
protected static final Pattern DELIMITER = Pattern.compile("\\$");
+ @Serial
private static final long serialVersionUID = 2483214646921027859L;
private final String algorithmName;
@@ -215,8 +217,7 @@ public abstract class AbstractCryptHash implements Hash, Serializable {
*/
@Override
public boolean equals(final Object other) {
- if (other instanceof AbstractCryptHash) {
- final AbstractCryptHash that = (AbstractCryptHash) other;
+ if (other instanceof AbstractCryptHash that) {
return this.formatToCryptString().equals(that.formatToCryptString());
}
return false;
diff --git a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/AbstractHash.java b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/AbstractHash.java
index e8ccce52d..ef5b5750b 100644
--- a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/AbstractHash.java
+++ b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/AbstractHash.java
@@ -24,6 +24,7 @@ import org.apache.shiro.lang.codec.CodecException;
import org.apache.shiro.lang.codec.CodecSupport;
import org.apache.shiro.lang.codec.Hex;
+import java.io.Serial;
import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -46,6 +47,7 @@ import java.util.Arrays;
@Deprecated
public abstract class AbstractHash extends CodecSupport implements Hash, Serializable {
+ @Serial
private static final long serialVersionUID = -4723044219611288405L;
/**
* The hashed data
@@ -283,8 +285,7 @@ public abstract class AbstractHash extends CodecSupport implements Hash, Seriali
*/
@Override
public boolean equals(Object o) {
- if (o instanceof Hash) {
- Hash other = (Hash) o;
+ if (o instanceof Hash other) {
return MessageDigest.isEqual(getBytes(), other.getBytes());
}
return false;
diff --git a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/DefaultHashService.java b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/DefaultHashService.java
index 0b3c363bb..3514efd52 100644
--- a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/DefaultHashService.java
+++ b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/DefaultHashService.java
@@ -30,11 +30,12 @@ import java.util.Random;
* understood by the JDK
* {@link java.security.MessageDigest#getInstance(String) MessageDigest.getInstance(String algorithmName)} method
* will work, or any Hash algorithm implemented by any loadable {@link HashSpi}. The default is {@code argon2}.
- * </p>
+ * <p>
* A hash and the salt used to compute it are often stored together. If an attacker is ever able to access
* the hash (e.g. during password cracking) and it has the full salt value, the attacker has all of the input necessary
* to try to brute-force crack the hash (source + complete salt).
* <p/>
+ * <p>
* However, if part of the salt is not available to the attacker (because it is not stored with the hash), it is
* <em>much</em> harder to crack the hash value since the attacker does not have the complete inputs necessary.
* <p/>
diff --git a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/SimpleHash.java b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/SimpleHash.java
index a6249a599..3049249f3 100644
--- a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/SimpleHash.java
+++ b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/SimpleHash.java
@@ -29,6 +29,7 @@ import org.apache.shiro.lang.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.Serial;
import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -50,6 +51,7 @@ import static java.util.Objects.requireNonNull;
public class SimpleHash extends CodecSupport implements Hash, Serializable {
private static final int DEFAULT_ITERATIONS = 1;
+ @Serial
private static final long serialVersionUID = -6689895264902387303L;
private static final Logger LOG = LoggerFactory.getLogger(SimpleHash.class);
@@ -245,8 +247,8 @@ public class SimpleHash extends CodecSupport implements Hash, Serializable {
* @since 1.2
*/
protected ByteSource toByteSource(Object object) {
- if (object instanceof ByteSource) {
- return (ByteSource) object;
+ if (object instanceof ByteSource source) {
+ return source;
}
byte[] bytes = toBytes(object);
return ByteSource.Util.bytes(bytes);
@@ -460,8 +462,7 @@ public class SimpleHash extends CodecSupport implements Hash, Serializable {
*/
@Override
public boolean equals(Object o) {
- if (o instanceof Hash) {
- Hash other = (Hash) o;
+ if (o instanceof Hash other) {
return MessageDigest.isEqual(getBytes(), other.getBytes());
}
return false;
diff --git a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/format/DefaultHashFormatFactory.java b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/format/DefaultHashFormatFactory.java
index bfaad0de6..ae48c2f0c 100644
--- a/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/format/DefaultHashFormatFactory.java
+++ b/crypto/hash/src/main/java/org/apache/shiro/crypto/hash/format/DefaultHashFormatFactory.java
@@ -185,9 +185,9 @@ public class DefaultHashFormatFactory implements HashFormatFactory {
* @param token the string token from which a class name will be heuristically determined.
* @return the discovered HashFormat class implementation or {@code null} if no class could be heuristically determined.
*/
- protected Class getHashFormatClass(String token) {
+ protected Class<?> getHashFormatClass(String token) {
- Class clazz = null;
+ Class<?> clazz = null;
//check to see if the token is a configured FQCN alias. This is faster than searching packages,
//so we try this first:
@@ -324,7 +324,7 @@ public class DefaultHashFormatFactory implements HashFormatFactory {
return null;
}
- protected final void assertHashFormatImpl(Class clazz) {
+ protected final void assertHashFormatImpl(Class<?> clazz) {
if (!HashFormat.class.isAssignableFrom(clazz) || clazz.isInterface()) {
throw new IllegalArgumentException("Discovered class [" + clazz.getName() + "] is not a "
+ HashFormat.class.getName() + " implementation.");
@@ -332,7 +332,7 @@ public class DefaultHashFormatFactory implements HashFormatFactory {
}
- protected final HashFormat newHashFormatInstance(Class clazz) {
+ protected final HashFormat newHashFormatInstance(Class<?> clazz) {
assertHashFormatImpl(clazz);
return (HashFormat) ClassUtils.newInstance(clazz);
}
diff --git a/crypto/support/hashes/argon2/pom.xml b/crypto/support/hashes/argon2/pom.xml
index 58b38a25d..7f7b29c87 100644
--- a/crypto/support/hashes/argon2/pom.xml
+++ b/crypto/support/hashes/argon2/pom.xml
@@ -69,7 +69,7 @@
<Import-Package>
org.apache.shiro*;version="${shiro.osgi.importRange}",
org.aopalliance*;version="[1.0.0, 2.0.0)",
- com.google.inject*;version="1.3",
+ com.google.inject*;version="[7.0.0, 8.0.0)",
*
</Import-Package>
<Require-Capability>
diff --git a/crypto/support/hashes/argon2/src/main/java/org/apache/shiro/crypto/support/hashes/argon2/Argon2Hash.java b/crypto/support/hashes/argon2/src/main/java/org/apache/shiro/crypto/support/hashes/argon2/Argon2Hash.java
index ce786916b..010845039 100644
--- a/crypto/support/hashes/argon2/src/main/java/org/apache/shiro/crypto/support/hashes/argon2/Argon2Hash.java
+++ b/crypto/support/hashes/argon2/src/main/java/org/apache/shiro/crypto/support/hashes/argon2/Argon2Hash.java
@@ -28,6 +28,7 @@ import org.bouncycastle.crypto.params.Argon2Parameters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.Serial;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Base64.Encoder;
@@ -86,6 +87,7 @@ class Argon2Hash extends AbstractCryptHash {
*/
public static final int DEFAULT_MEMORY_KIB = 64 * 1024;
+ @Serial
private static final long serialVersionUID = 2647354947284558921L;
private static final Logger LOG = LoggerFactory.getLogger(Argon2Hash.class);
diff --git a/crypto/support/hashes/bcrypt/pom.xml b/crypto/support/hashes/bcrypt/pom.xml
index 937b34ced..fd4cb21a8 100644
--- a/crypto/support/hashes/bcrypt/pom.xml
+++ b/crypto/support/hashes/bcrypt/pom.xml
@@ -69,7 +69,7 @@
<Import-Package>
org.apache.shiro*;version="${shiro.osgi.importRange}",
org.aopalliance*;version="[1.0.0, 2.0.0)",
- com.google.inject*;version="1.3",
+ com.google.inject*;version="[7.0.0, 8.0.0)",
*
</Import-Package>
<Require-Capability>
diff --git a/crypto/support/hashes/bcrypt/src/main/java/org/apache/shiro/crypto/support/hashes/bcrypt/BCryptHash.java b/crypto/support/hashes/bcrypt/src/main/java/org/apache/shiro/crypto/support/hashes/bcrypt/BCryptHash.java
index febe8ae99..28db6812e 100644
--- a/crypto/support/hashes/bcrypt/src/main/java/org/apache/shiro/crypto/support/hashes/bcrypt/BCryptHash.java
+++ b/crypto/support/hashes/bcrypt/src/main/java/org/apache/shiro/crypto/support/hashes/bcrypt/BCryptHash.java
@@ -23,10 +23,10 @@ import org.apache.shiro.crypto.hash.AbstractCryptHash;
import org.apache.shiro.lang.util.ByteSource;
import org.apache.shiro.lang.util.SimpleByteSource;
import org.bouncycastle.crypto.generators.OpenBSDBCrypt;
-import org.checkerframework.checker.nullness.qual.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.Serial;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Arrays;
@@ -48,6 +48,7 @@ class BCryptHash extends AbstractCryptHash {
public static final int SALT_LENGTH = 16;
+ @Serial
private static final long serialVersionUID = 6957869292324606101L;
private static final Logger LOG = LoggerFactory.getLogger(AbstractCryptHash.class);
@@ -212,7 +213,7 @@ class BCryptHash extends AbstractCryptHash {
.toString();
}
- private static @NonNull String getBcryptVersion(String algorithmName) {
+ private static String getBcryptVersion(String algorithmName) {
if (algorithmName.startsWith(BCRYPT_ALGORITHM_BASE)) {
algorithmName = algorithmName.substring(BCRYPT_ALGORITHM_BASE.length());
}
diff --git a/crypto/support/hashes/bcrypt/src/main/java/org/apache/shiro/crypto/support/hashes/bcrypt/BCryptProvider.java b/crypto/support/hashes/bcrypt/src/main/java/org/apache/shiro/crypto/support/hashes/bcrypt/BCryptProvider.java
index 6a31c432d..3b87b6240 100644
--- a/crypto/support/hashes/bcrypt/src/main/java/org/apache/shiro/crypto/support/hashes/bcrypt/BCryptProvider.java
+++ b/crypto/support/hashes/bcrypt/src/main/java/org/apache/shiro/crypto/support/hashes/bcrypt/BCryptProvider.java
@@ -90,7 +90,7 @@ public class BCryptProvider implements HashSpi {
final Optional<String> optCostStr = Optional.ofNullable(parameters.get(Parameters.PARAMETER_COST))
.map(obj -> (String) obj);
- if (!optCostStr.isPresent()) {
+ if (optCostStr.isEmpty()) {
return BCryptHash.DEFAULT_COST;
}
@@ -117,7 +117,7 @@ public class BCryptProvider implements HashSpi {
final Optional<String> optSaltBase64 = Optional.ofNullable(parameters.get(Parameters.PARAMETER_SALT))
.map(obj -> (String) obj);
- if (!optSaltBase64.isPresent()) {
+ if (optSaltBase64.isEmpty()) {
return BCryptHash.createSalt(random);
}
diff --git a/event/src/main/java/org/apache/shiro/event/support/DefaultEventBus.java b/event/src/main/java/org/apache/shiro/event/support/DefaultEventBus.java
index e22b9bc6a..418e11097 100644
--- a/event/src/main/java/org/apache/shiro/event/support/DefaultEventBus.java
+++ b/event/src/main/java/org/apache/shiro/event/support/DefaultEventBus.java
@@ -95,14 +95,14 @@ public class DefaultEventBus implements EventBus {
//and the lock provides thread-safety in probably a much simpler mechanism than attempting to write a
//EventBus-specific Comparator. This technique is also likely to be faster than a ConcurrentSkipListMap, which
//is about 3-5 times slower than a standard ConcurrentMap.
- final Map<Object, Subscription> registry;
+ private final Map<Object, Subscription> registry;
private final Lock registryReadLock;
private final Lock registryWriteLock;
private EventListenerResolver eventListenerResolver;
public DefaultEventBus() {
//not thread safe, so we need locks:
- this.registry = new LinkedHashMap<Object, Subscription>();
+ this.registry = new LinkedHashMap<>();
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
this.registryReadLock = rwl.readLock();
this.registryWriteLock = rwl.writeLock();
@@ -117,6 +117,15 @@ public class DefaultEventBus implements EventBus {
this.eventListenerResolver = eventListenerResolver;
}
+ public Map<Object, Subscription> getRegistry() {
+ registryReadLock.lock();
+ try {
+ return Map.copyOf(registry);
+ } finally {
+ registryReadLock.unlock();
+ }
+ }
+
public void publish(Object event) {
if (event == null) {
LOGGER.info("Received null event for publishing. Ignoring and returning.");
@@ -200,8 +209,7 @@ public class DefaultEventBus implements EventBus {
for (EventListener listener : this.listeners) {
Object target = listener;
- if (listener instanceof SingleArgumentMethodEventListener) {
- SingleArgumentMethodEventListener singleArgListener = (SingleArgumentMethodEventListener) listener;
+ if (listener instanceof SingleArgumentMethodEventListener singleArgListener) {
target = singleArgListener.getTarget();
}
if (listener.accepts(event) && !delivered.contains(target)) {
diff --git a/event/src/main/java/org/apache/shiro/event/support/EventClassComparator.java b/event/src/main/java/org/apache/shiro/event/support/EventClassComparator.java
index 0fcbba3b4..c85445375 100644
--- a/event/src/main/java/org/apache/shiro/event/support/EventClassComparator.java
+++ b/event/src/main/java/org/apache/shiro/event/support/EventClassComparator.java
@@ -47,10 +47,8 @@ import java.util.Comparator;
*
* @since 1.3
*/
-public class EventClassComparator implements Comparator<Class> {
-
- @SuppressWarnings("unchecked")
- public int compare(Class a, Class b) {
+public class EventClassComparator implements Comparator<Class<?>> {
+ public int compare(Class<?> a, Class<?> b) {
if (a == null) {
if (b == null) {
return 0;
@@ -59,7 +57,7 @@ public class EventClassComparator implements Comparator<Class> {
}
} else if (b == null) {
return 1;
- } else if (a == b || a.equals(b)) {
+ } else if (a == b) {
return 0;
} else {
if (a.isAssignableFrom(b)) {
diff --git a/event/src/main/java/org/apache/shiro/event/support/EventListenerComparator.java b/event/src/main/java/org/apache/shiro/event/support/EventListenerComparator.java
index 06e15ddae..a9a5c616a 100644
--- a/event/src/main/java/org/apache/shiro/event/support/EventListenerComparator.java
+++ b/event/src/main/java/org/apache/shiro/event/support/EventListenerComparator.java
@@ -51,10 +51,8 @@ public class EventListenerComparator implements Comparator<EventListener> {
} else if (a == b || a.equals(b)) {
return 0;
} else {
- if (a instanceof TypedEventListener) {
- TypedEventListener ta = (TypedEventListener) a;
- if (b instanceof TypedEventListener) {
- TypedEventListener tb = (TypedEventListener) b;
+ if (a instanceof TypedEventListener ta) {
+ if (b instanceof TypedEventListener tb) {
return EVENT_CLASS_COMPARATOR.compare(ta.getEventType(), tb.getEventType());
} else {
//TypedEventListeners are 'less than' (higher priority) than non typed
diff --git a/event/src/main/java/org/apache/shiro/event/support/SingleArgumentMethodEventListener.java b/event/src/main/java/org/apache/shiro/event/support/SingleArgumentMethodEventListener.java
index 9475a7ed3..48d59c4bb 100644
--- a/event/src/main/java/org/apache/shiro/event/support/SingleArgumentMethodEventListener.java
+++ b/event/src/main/java/org/apache/shiro/event/support/SingleArgumentMethodEventListener.java
@@ -59,7 +59,7 @@ public class SingleArgumentMethodEventListener implements TypedEventListener {
return event != null && getEventType().isInstance(event);
}
- public Class getEventType() {
+ public Class<?> getEventType() {
return getMethodArgumentType(getMethod());
}
@@ -72,8 +72,8 @@ public class SingleArgumentMethodEventListener implements TypedEventListener {
}
}
- protected Class getMethodArgumentType(Method method) {
- Class[] paramTypes = method.getParameterTypes();
+ protected Class<?> getMethodArgumentType(Method method) {
+ Class<?>[] paramTypes = method.getParameterTypes();
if (paramTypes.length != 1) {
//the default implementation expects a single typed argument and nothing more:
String msg = "Event handler methods must accept a single argument.";
diff --git a/event/src/main/java/org/apache/shiro/event/support/TypedEventListener.java b/event/src/main/java/org/apache/shiro/event/support/TypedEventListener.java
index f266bf398..2b2fe4a30 100644
--- a/event/src/main/java/org/apache/shiro/event/support/TypedEventListener.java
+++ b/event/src/main/java/org/apache/shiro/event/support/TypedEventListener.java
@@ -23,5 +23,5 @@ package org.apache.shiro.event.support;
*/
public interface TypedEventListener extends EventListener {
- Class getEventType();
+ Class<?> getEventType();
}
diff --git a/integration-tests/guice3/pom.xml b/integration-tests/guice3/pom.xml
deleted file mode 100644
index 7b516dc28..000000000
--- a/integration-tests/guice3/pom.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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
- ~ "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.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.shiro.integrationtests</groupId>
- <artifactId>shiro-integration-tests</artifactId>
- <version>999-SNAPSHOT</version>
- </parent>
-
- <artifactId>shiro-its-guice3</artifactId>
- <name>Apache Shiro :: ITs :: Guice 3</name>
- <packaging>war</packaging>
-
- <properties>
- <guice.version>3.0</guice.version>
- </properties>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-spec</artifactId>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-impl</artifactId>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j2-impl</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-guice</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.inject.extensions</groupId>
- <artifactId>guice-servlet</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- <scope>runtime</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-guice</artifactId>
- <version>${project.version}</version>
- <classifier>tests</classifier>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.htmlunit</groupId>
- <artifactId>htmlunit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>apache-jsp</artifactId>
- <version>${jetty.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>apache-jstl</artifactId>
- <version>${jetty.version}</version>
- <type>pom</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro.integrationtests</groupId>
- <artifactId>shiro-its-support</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <profiles>
- <profile>
- <id>jdk17</id>
- <activation>
- <jdk>[17,)</jdk>
- </activation>
- <properties>
- <!-- needed by guice until it is compatible with jdk17+. -->
- <surefire.argLine>--add-opens java.base/java.lang=ALL-UNNAMED</surefire.argLine>
- <failsafe.argLine>--add-opens java.base/java.lang=ALL-UNNAMED</failsafe.argLine>
- </properties>
- </profile>
- </profiles>
-</project>
diff --git a/integration-tests/guice4/pom.xml b/integration-tests/guice4/pom.xml
deleted file mode 100644
index fcf9b735a..000000000
--- a/integration-tests/guice4/pom.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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
- ~ "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.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.shiro.integrationtests</groupId>
- <artifactId>shiro-integration-tests</artifactId>
- <version>999-SNAPSHOT</version>
- </parent>
-
- <artifactId>shiro-its-guice4</artifactId>
- <name>Apache Shiro :: ITs :: Guice 4</name>
- <packaging>war</packaging>
-
- <properties>
- <groups>none()</groups>
- </properties>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <dependenciesToScan>
- <dependency>org.apache.shiro:shiro-guice</dependency>
- </dependenciesToScan>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-spec</artifactId>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-impl</artifactId>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j2-impl</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-guice</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.inject.extensions</groupId>
- <artifactId>guice-servlet</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- <scope>runtime</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-guice</artifactId>
- <version>${project.version}</version>
- <classifier>tests</classifier>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.htmlunit</groupId>
- <artifactId>htmlunit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>apache-jsp</artifactId>
- <version>${jetty.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>apache-jstl</artifactId>
- <version>${jetty.version}</version>
- <type>pom</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro.integrationtests</groupId>
- <artifactId>shiro-its-support</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <profiles>
- <profile>
- <id>jdk17</id>
- <activation>
- <jdk>[17,)</jdk>
- </activation>
- <properties>
- <!-- needed by guice until it is compatible with jdk17+. -->
- <surefire.argLine>--add-opens java.base/java.lang=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow</surefire.argLine>
- <failsafe.argLine>${surefire.argLine}</failsafe.argLine>
- </properties>
- </profile>
- </profiles>
-</project>
diff --git a/jitpack.yml b/jitpack.yml
index a2135f968..7db7f7a85 100644
--- a/jitpack.yml
+++ b/jitpack.yml
@@ -17,10 +17,10 @@
---
jdk:
- - openjdk17
+ - openjdk25
before_install:
- - sdk install java 19.0.2-zulu
- - sdk use java 19.0.2-zulu
+ - sdk install java 25.0.3-zulu
+ - sdk use java 25.0.3-zulu
- sdk install maven
install:
- mvn install -DskipTests -DskipITs
diff --git a/lang/pom.xml b/lang/pom.xml
index 6fa9778c4..893923967 100644
--- a/lang/pom.xml
+++ b/lang/pom.xml
@@ -57,8 +57,8 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-api</artifactId>
+ <groupId>jakarta.servlet.jsp</groupId>
+ <artifactId>jakarta.servlet.jsp-api</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
@@ -73,9 +73,9 @@
<instructions>
<Bundle-SymbolicName>org.apache.shiro.lang</Bundle-SymbolicName>
<Export-Package>org.apache.shiro.lang.*;version=${project.version}</Export-Package>
- <!-- javax.servlet.jsp* marked as optional per SHIRO-390: -->
+ <!-- jakarta.servlet.jsp* marked as optional per SHIRO-390: -->
<Import-Package>
- javax.servlet.jsp*;resolution:=optional,
+ jakarta.servlet.jsp*;resolution:=optional,
*
</Import-Package>
<_removeheaders>Bnd-LastModified</_removeheaders>
diff --git a/lang/src/main/java/org/apache/shiro/lang/codec/CodecSupport.java b/lang/src/main/java/org/apache/shiro/lang/codec/CodecSupport.java
index becf3ce9c..0e1657328 100644
--- a/lang/src/main/java/org/apache/shiro/lang/codec/CodecSupport.java
+++ b/lang/src/main/java/org/apache/shiro/lang/codec/CodecSupport.java
@@ -174,7 +174,7 @@ public abstract class CodecSupport {
* <li>{@link ByteSource}</li>
* <li>{@link String}</li>
* <li>{@link File}</li>
- * </li>{@link InputStream}</li>
+ * <li>{@link InputStream}</li>
* </ul>
*
* @param o the object to test to see if it can be easily converted to a byte array
@@ -204,18 +204,18 @@ public abstract class CodecSupport {
String msg = "Argument for byte conversion cannot be null.";
throw new IllegalArgumentException(msg);
}
- if (object instanceof byte[]) {
- return (byte[]) object;
- } else if (object instanceof ByteSource) {
- return ((ByteSource) object).getBytes();
- } else if (object instanceof char[]) {
- return toBytes((char[]) object);
- } else if (object instanceof String) {
- return toBytes((String) object);
- } else if (object instanceof File) {
- return toBytes((File) object);
- } else if (object instanceof InputStream) {
- return toBytes((InputStream) object);
+ if (object instanceof byte[] bytes) {
+ return bytes;
+ } else if (object instanceof ByteSource source) {
+ return source.getBytes();
+ } else if (object instanceof char[] chars) {
+ return toBytes(chars);
+ } else if (object instanceof String string) {
+ return toBytes(string);
+ } else if (object instanceof File file) {
+ return toBytes(file);
+ } else if (object instanceof InputStream stream) {
+ return toBytes(stream);
} else {
return objectToBytes(object);
}
@@ -238,12 +238,12 @@ public abstract class CodecSupport {
String msg = "Argument for String conversion cannot be null.";
throw new IllegalArgumentException(msg);
}
- if (o instanceof byte[]) {
- return toString((byte[]) o);
- } else if (o instanceof char[]) {
- return new String((char[]) o);
- } else if (o instanceof String) {
- return (String) o;
+ if (o instanceof byte[] bytes) {
+ return toString(bytes);
+ } else if (o instanceof char[] chars) {
+ return new String(chars);
+ } else if (o instanceof String string) {
+ return string;
} else {
return objectToString(o);
}
diff --git a/lang/src/main/java/org/apache/shiro/lang/io/ResourceUtils.java b/lang/src/main/java/org/apache/shiro/lang/io/ResourceUtils.java
index 85937e5a4..3a1a224cb 100644
--- a/lang/src/main/java/org/apache/shiro/lang/io/ResourceUtils.java
+++ b/lang/src/main/java/org/apache/shiro/lang/io/ResourceUtils.java
@@ -18,6 +18,7 @@
*/
package org.apache.shiro.lang.io;
+import java.net.URI;
import org.apache.shiro.lang.util.ClassUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -26,6 +27,7 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
+import java.nio.file.Paths;
/**
* Static helper methods for loading {@code Stream}-backed resources.
@@ -119,44 +121,47 @@ public final class ResourceUtils {
* @throws IOException if there is a problem acquiring the resource at the specified path.
*/
public static InputStream getInputStreamForPath(String resourcePath) throws IOException {
+ URL url = getURLForPath(resourcePath);
+ if (url == null) {
+ throw new IOException("Resource [" + resourcePath + "] could not be found.");
+ }
- InputStream is;
- if (resourcePath.startsWith(CLASSPATH_PREFIX)) {
- is = loadFromClassPath(stripPrefix(resourcePath));
+ return url.openStream();
+ }
- } else if (resourcePath.startsWith(URL_PREFIX)) {
- is = loadFromUrl(stripPrefix(resourcePath));
+ /**
+ * Returns the URL for the resource represented by the specified path, supporting scheme
+ * prefixes that direct how to acquire the input stream
+ * ({@link #CLASSPATH_PREFIX CLASSPATH_PREFIX},
+ * {@link #URL_PREFIX URL_PREFIX}, or {@link #FILE_PREFIX FILE_PREFIX}). If the path is not prefixed by one
+ * of these schemes, the path is assumed to be a file-based path that can be loaded with a
+ * call to {@link Paths#get(String, String...)}.
+ *
+ * @param resourcePath the String path representing the resource to obtain.
+ * @return the URL for the specified resource.
+ * @throws IOException if there is a problem acquiring the resource at the specified path.
+ */
+ public static URL getURLForPath(String resourcePath) throws IOException {
+ URL url;
+ if (resourcePath.startsWith(CLASSPATH_PREFIX)) {
+ url = ClassUtils.getResource(stripPrefix(resourcePath));
+ } else if (resourcePath.startsWith(URL_PREFIX)) {
+ url = URI.create(stripPrefix(resourcePath)).toURL();
} else if (resourcePath.startsWith(FILE_PREFIX)) {
- is = loadFromFile(stripPrefix(resourcePath));
-
+ url = Paths.get(stripPrefix(resourcePath)).toUri().toURL();
} else {
- is = loadFromFile(resourcePath);
+ url = Paths.get(resourcePath).toUri().toURL();
}
- if (is == null) {
- throw new IOException("Resource [" + resourcePath + "] could not be found.");
+ if (url == null) {
+ return null;
}
- return is;
- }
-
- private static InputStream loadFromFile(String path) throws IOException {
- if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("Opening file [" + path + "]...");
+ // throw early if resource cannot be acquired
+ try (InputStream ignored = url.openStream()) {
+ return url;
}
- return new FileInputStream(path);
- }
-
- private static InputStream loadFromUrl(String urlPath) throws IOException {
- LOGGER.debug("Opening url {}", urlPath);
- URL url = new URL(urlPath);
- return url.openStream();
- }
-
- private static InputStream loadFromClassPath(String path) {
- LOGGER.debug("Opening resource from class path [{}]", path);
- return ClassUtils.getResourceAsStream(path);
}
private static String stripPrefix(String resourcePath) {
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/Assert.java b/lang/src/main/java/org/apache/shiro/lang/util/Assert.java
index 0f8bb4af5..b932f6284 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/Assert.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/Assert.java
@@ -282,7 +282,7 @@ public abstract class Assert {
* @param message the exception message to use if the assertion fails
* @throws IllegalArgumentException if the collection is <code>null</code> or has no elements
*/
- public static void notEmpty(Collection collection, String message) {
+ public static void notEmpty(Collection<?> collection, String message) {
if (isEmpty(collection)) {
throw new IllegalArgumentException(message);
}
@@ -296,7 +296,7 @@ public abstract class Assert {
* @param collection the collection to check
* @throws IllegalArgumentException if the collection is <code>null</code> or has no elements
*/
- public static void notEmpty(Collection collection) {
+ public static void notEmpty(Collection<?> collection) {
notEmpty(collection,
"[Assertion failed] - this collection must not be empty: it must contain at least 1 element");
}
@@ -310,7 +310,7 @@ public abstract class Assert {
* @param message the exception message to use if the assertion fails
* @throws IllegalArgumentException if the map is <code>null</code> or has no entries
*/
- public static void notEmpty(Map map, String message) {
+ public static void notEmpty(Map<?, ?> map, String message) {
if (isEmpty(map)) {
throw new IllegalArgumentException(message);
}
@@ -324,7 +324,7 @@ public abstract class Assert {
* @param map the map to check
* @throws IllegalArgumentException if the map is <code>null</code> or has no entries
*/
- public static void notEmpty(Map map) {
+ public static void notEmpty(Map<?, ?> map) {
notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry");
}
@@ -338,7 +338,7 @@ public abstract class Assert {
* @throws IllegalArgumentException if the object is not an instance of clazz
* @see Class#isInstance
*/
- public static void isInstanceOf(Class clazz, Object obj) {
+ public static void isInstanceOf(Class<?> clazz, Object obj) {
isInstanceOf(clazz, obj, "");
}
@@ -355,7 +355,7 @@ public abstract class Assert {
* @throws IllegalArgumentException if the object is not an instance of clazz
* @see Class#isInstance
*/
- public static void isInstanceOf(Class type, Object obj, String message) {
+ public static void isInstanceOf(Class<?> type, Object obj, String message) {
notNull(type, "Type to check against must not be null");
if (!type.isInstance(obj)) {
throw new IllegalArgumentException(message
@@ -372,7 +372,7 @@ public abstract class Assert {
* @param subType the sub type to check
* @throws IllegalArgumentException if the classes are not assignable
*/
- public static void isAssignable(Class superType, Class subType) {
+ public static void isAssignable(Class<?> superType, Class<?> subType) {
isAssignable(superType, subType, "");
}
@@ -432,11 +432,11 @@ public abstract class Assert {
//////////////////////////
// CollectionUtils cannot be removed from shiro-core until 2.0 as it has a dependency on PrincipalCollection
- private static boolean isEmpty(Map m) {
+ private static boolean isEmpty(Map<?, ?> m) {
return m == null || m.isEmpty();
}
- private static boolean isEmpty(Collection c) {
+ private static boolean isEmpty(Collection<?> c) {
return c == null || c.isEmpty();
}
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/ByteSource.java b/lang/src/main/java/org/apache/shiro/lang/util/ByteSource.java
index c75d074be..12aabb491 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/ByteSource.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/ByteSource.java
@@ -173,18 +173,18 @@ public interface ByteSource {
+ "want to write your own ByteSource implementation to extract its bytes explicitly.";
throw new IllegalArgumentException(msg);
}
- if (source instanceof byte[]) {
- return bytes((byte[]) source);
- } else if (source instanceof ByteSource) {
- return (ByteSource) source;
- } else if (source instanceof char[]) {
- return bytes((char[]) source);
- } else if (source instanceof String) {
- return bytes((String) source);
- } else if (source instanceof File) {
- return bytes((File) source);
- } else if (source instanceof InputStream) {
- return bytes((InputStream) source);
+ if (source instanceof byte[] bytes) {
+ return bytes(bytes);
+ } else if (source instanceof ByteSource byteSource) {
+ return byteSource;
+ } else if (source instanceof char[] chars) {
+ return bytes(chars);
+ } else if (source instanceof String string) {
+ return bytes(string);
+ } else if (source instanceof File file) {
+ return bytes(file);
+ } else if (source instanceof InputStream stream) {
+ return bytes(stream);
} else {
throw new IllegalStateException("Encountered unexpected byte source. This is a bug - please notify "
+ "the Shiro developer list asap (the isCompatible implementation does not reflect this "
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/ByteSourceWrapper.java b/lang/src/main/java/org/apache/shiro/lang/util/ByteSourceWrapper.java
index bd9270e29..2e41d413a 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/ByteSourceWrapper.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/ByteSourceWrapper.java
@@ -37,12 +37,10 @@ public final class ByteSourceWrapper implements Closeable {
* This method generically accepts byte array or ByteSource instance.
*/
public static ByteSourceWrapper wrap(Object value) {
- if (value instanceof byte[]) {
- byte[] bytes = (byte[]) value;
- return new ByteSourceWrapper(bytes);
- } else if (value instanceof ByteSource) {
- byte[] bytes = ((ByteSource) value).getBytes();
+ if (value instanceof byte[] bytes) {
return new ByteSourceWrapper(bytes);
+ } else if (value instanceof ByteSource source) {
+ return new ByteSourceWrapper(source.getBytes());
}
throw new IllegalArgumentException();
}
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/ByteUtils.java b/lang/src/main/java/org/apache/shiro/lang/util/ByteUtils.java
index 97bc594c6..ff0558e3f 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/ByteUtils.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/ByteUtils.java
@@ -30,11 +30,9 @@ public final class ByteUtils {
* @param value An array holding sensitive data
*/
public static void wipe(Object value) {
- if (value instanceof byte[]) {
- byte[] array = (byte[]) value;
+ if (value instanceof byte[] array) {
Arrays.fill(array, (byte) 0);
- } else if (value instanceof char[]) {
- char[] array = (char[]) value;
+ } else if (value instanceof char[] array) {
Arrays.fill(array, '\u0000');
}
}
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/ClassUtils.java b/lang/src/main/java/org/apache/shiro/lang/util/ClassUtils.java
index e7bba5f8d..2a9b8243b 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/ClassUtils.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/ClassUtils.java
@@ -18,6 +18,8 @@
*/
package org.apache.shiro.lang.util;
+import java.io.IOException;
+import java.net.URL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -118,42 +120,66 @@ public final class ClassUtils {
* @param name the name of the resource to acquire from the classloader(s).
* @return the InputStream of the resource found, or <code>null</code> if the resource cannot be found from any
* of the three mentioned ClassLoaders.
+ * @see #getResource(String)
* @since 0.9
*/
public static InputStream getResourceAsStream(String name) {
+ URL url = getResource(name);
+ if (url == null) {
+ return null;
+ }
- InputStream is = THREAD_CL_ACCESSOR.getResourceStream(name);
+ try {
+ return url.openStream();
+ } catch (IOException e) {
+ return null;
+ }
+ }
- if (is == null) {
+ /**
+ * Returns the specified resource by checking the current thread's
+ * {@link Thread#getContextClassLoader() context class loader}, then the
+ * current ClassLoader (<code>ClassUtils.class.getClassLoader()</code>), then the system/application
+ * ClassLoader (<code>ClassLoader.getSystemClassLoader()</code>, in that order, using
+ * {@link ClassLoader#getResource(String) getResource(name)}.
+ *
+ * @param name the name of the resource to acquire from the classloader(s).
+ * @return the URL of the resource found, or <code>null</code> if the resource cannot be found from any
+ * of the three mentioned ClassLoaders.
+ * @since 3.0
+ */
+ public static URL getResource(String name) {
+ URL url = THREAD_CL_ACCESSOR.getResource(name);
+ if (url == null) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Resource [" + name + "] was not found via the thread context ClassLoader. Trying the "
+ "current ClassLoader...");
}
- is = CLASS_LANG_CL_ACCESSOR.getResourceStream(name);
+ url = CLASS_LANG_CL_ACCESSOR.getResource(name);
}
- if (is == null) {
+ if (url == null) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Resource [" + name + "] was not found via the org.apache.shiro.lang ClassLoader. Trying the "
+ "additionally set ClassLoader...");
}
- is = ADDITIONAL_CL_ACCESSOR.getResourceStream(name);
+ url = ADDITIONAL_CL_ACCESSOR.getResource(name);
}
- if (is == null) {
+ if (url == null) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Resource [" + name + "] was not found via the current class loader. Trying the "
+ "system/application ClassLoader...");
}
- is = SYSTEM_CL_ACCESSOR.getResourceStream(name);
+ url = SYSTEM_CL_ACCESSOR.getResource(name);
}
- if (is == null && LOGGER.isTraceEnabled()) {
+ if (url == null && LOGGER.isTraceEnabled()) {
LOGGER.trace("Resource [" + name + "] was not found via the thread context, current, or "
+ "system/application ClassLoaders. All heuristics have been exhausted. Returning null.");
}
- return is;
+ return url;
}
/**
@@ -315,6 +341,8 @@ public final class ClassUtils {
Class<?> loadClass(String fqcn);
InputStream getResourceStream(String name);
+
+ URL getResource(String name);
}
/**
@@ -347,6 +375,15 @@ public final class ClassUtils {
return is;
}
+ public URL getResource(String name) {
+ URL url = null;
+ ClassLoader cl = getClassLoader();
+ if (cl != null) {
+ url = cl.getResource(name);
+ }
+ return url;
+ }
+
protected final ClassLoader getClassLoader() {
try {
return doGetClassLoader();
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/JspEngineDependency.java b/lang/src/main/java/org/apache/shiro/lang/util/JspEngineDependency.java
index 92b7fc94a..d17d1489c 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/JspEngineDependency.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/JspEngineDependency.java
@@ -18,7 +18,7 @@
*/
package org.apache.shiro.lang.util;
-import javax.servlet.jsp.JspEngineInfo;
+import jakarta.servlet.jsp.JspEngineInfo;
/**
* This only exists so bundle plugin doesn't complain about redundant dependencies
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/LifecycleUtils.java b/lang/src/main/java/org/apache/shiro/lang/util/LifecycleUtils.java
index 2a57e3273..5ca87ec12 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/LifecycleUtils.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/LifecycleUtils.java
@@ -36,8 +36,8 @@ public abstract class LifecycleUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(LifecycleUtils.class);
public static void init(Object o) throws ShiroException {
- if (o instanceof Initializable) {
- init((Initializable) o);
+ if (o instanceof Initializable initializable) {
+ init(initializable);
}
}
@@ -53,7 +53,7 @@ public abstract class LifecycleUtils {
* @throws ShiroException if unable to initialize one or more instances.
* @since 0.9
*/
- public static void init(Collection c) throws ShiroException {
+ public static void init(Collection<?> c) throws ShiroException {
if (c == null || c.isEmpty()) {
return;
}
@@ -63,10 +63,10 @@ public abstract class LifecycleUtils {
}
public static void destroy(Object o) {
- if (o instanceof Destroyable) {
- destroy((Destroyable) o);
- } else if (o instanceof Collection) {
- destroy((Collection) o);
+ if (o instanceof Destroyable destroyable) {
+ destroy(destroyable);
+ } else if (o instanceof Collection<?> collection) {
+ destroy(collection);
}
}
@@ -90,7 +90,7 @@ public abstract class LifecycleUtils {
* @param c the collection of objects to destroy.
* @since 0.9
*/
- public static void destroy(Collection c) {
+ public static void destroy(Collection<?> c) {
if (c == null || c.isEmpty()) {
return;
}
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/SimpleByteSource.java b/lang/src/main/java/org/apache/shiro/lang/util/SimpleByteSource.java
index e7351d074..cea79219b 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/SimpleByteSource.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/SimpleByteSource.java
@@ -118,7 +118,7 @@ public class SimpleByteSource implements ByteSource {
* <li>{@link ByteSource}</li>
* <li>{@link String}</li>
* <li>{@link File}</li>
- * </li>{@link InputStream}</li>
+ * <li>{@link InputStream}</li>
* </ul>
*
* @param o the object to test to see if it can be easily converted to bytes by instances of this class.
@@ -179,8 +179,7 @@ public class SimpleByteSource implements ByteSource {
if (o == this) {
return true;
}
- if (o instanceof ByteSource) {
- ByteSource bs = (ByteSource) o;
+ if (o instanceof ByteSource bs) {
return Arrays.equals(getBytes(), bs.getBytes());
}
return false;
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/SoftHashMap.java b/lang/src/main/java/org/apache/shiro/lang/util/SoftHashMap.java
index bf0a464e2..d488c127c 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/SoftHashMap.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/SoftHashMap.java
@@ -108,14 +108,13 @@ public class SoftHashMap<K, V> implements Map<K, V> {
* @param retentionSize the total number of most recent entries in the map that will be strongly referenced
* (retained), preventing them from being eagerly garbage collected by the JVM.
*/
- @SuppressWarnings({"unchecked"})
public SoftHashMap(int retentionSize) {
super();
this.retentionSize = Math.max(0, retentionSize);
- queue = new ReferenceQueue<V>();
+ queue = new ReferenceQueue<>();
strongReferencesLock = new ReentrantLock();
- map = new ConcurrentHashMap<K, SoftValue<V, K>>();
- strongReferences = new ConcurrentLinkedQueue<V>();
+ map = new ConcurrentHashMap<>();
+ strongReferences = new ConcurrentLinkedQueue<>();
}
/**
@@ -198,8 +197,8 @@ public class SoftHashMap<K, V> implements Map<K, V> {
*/
@SuppressWarnings({"unchecked", "SuspiciousMethodCalls"})
private void processQueue() {
- SoftValue sv;
- while ((sv = (SoftValue) queue.poll()) != null) {
+ SoftValue<K, ? super V> sv;
+ while ((sv = (SoftValue<K, ? super V>) queue.poll()) != null) {
// we can access private data!
map.remove(sv.key);
}
@@ -217,8 +216,8 @@ public class SoftHashMap<K, V> implements Map<K, V> {
public boolean containsValue(Object value) {
processQueue();
- Collection values = values();
- return values != null && values.contains(value);
+ Collection<?> values = values();
+ return values.contains(value);
}
public void putAll(Map<? extends K, ? extends V> m) {
@@ -236,14 +235,13 @@ public class SoftHashMap<K, V> implements Map<K, V> {
return map.keySet();
}
- @SuppressWarnings("unchecked")
public Collection<V> values() {
processQueue();
Collection<K> keys = map.keySet();
if (keys.isEmpty()) {
- return Collections.EMPTY_SET;
+ return Collections.emptySet();
}
- Collection<V> values = new ArrayList<V>(keys.size());
+ Collection<V> values = new ArrayList<>(keys.size());
for (K key : keys) {
V v = get(key);
if (v != null) {
@@ -259,7 +257,7 @@ public class SoftHashMap<K, V> implements Map<K, V> {
public V put(K key, V value) {
// throw out garbage collected values first
processQueue();
- SoftValue<V, K> sv = new SoftValue<V, K>(value, key, queue);
+ SoftValue<V, K> sv = new SoftValue<>(value, key, queue);
SoftValue<V, K> previous = map.put(key, sv);
addToStrongReferences(value);
return previous != null ? previous.get() : null;
@@ -290,17 +288,15 @@ public class SoftHashMap<K, V> implements Map<K, V> {
return map.size();
}
- @SuppressWarnings("unchecked")
public Set<Map.Entry<K, V>> entrySet() {
// throw out garbage collected values first
processQueue();
Collection<K> keys = map.keySet();
if (keys.isEmpty()) {
- //noinspection unchecked
- return Collections.EMPTY_SET;
+ return Collections.emptyNavigableSet();
}
- Map<K, V> kvPairs = new HashMap<K, V>(keys.size());
+ Map<K, V> kvPairs = new HashMap<>(keys.size());
for (K key : keys) {
V v = get(key);
if (v != null) {
diff --git a/lang/src/main/java/org/apache/shiro/lang/util/StringUtils.java b/lang/src/main/java/org/apache/shiro/lang/util/StringUtils.java
index a3a1256fb..1412ae02a 100644
--- a/lang/src/main/java/org/apache/shiro/lang/util/StringUtils.java
+++ b/lang/src/main/java/org/apache/shiro/lang/util/StringUtils.java
@@ -51,7 +51,7 @@ public final class StringUtils {
public static final char DEFAULT_DELIMITER_CHAR = ',';
/**
- * Constant representing the default quote character (double quote), equal to '"'</code>
+ * Constant representing the default quote character (double quote), equal to <code>'"'</code>
*/
public static final char DEFAULT_QUOTE_CHAR = '"';
@@ -105,7 +105,7 @@ public final class StringUtils {
* @see #hasText(String)
*/
public static boolean hasLength(String str) {
- return (str != null && str.length() > 0);
+ return (str != null && !str.isEmpty());
}
@@ -207,7 +207,7 @@ public final class StringUtils {
* @return a single string, delimited by the specified {@code delimiter}.
* @since 1.2
*/
- public static String toDelimitedString(Collection c, String delimiter) {
+ public static String toDelimitedString(Collection<?> c, String delimiter) {
if (c == null || c.isEmpty()) {
return EMPTY_STRING;
}
@@ -264,13 +264,13 @@ public final class StringUtils {
return null;
}
StringTokenizer st = new StringTokenizer(str, delimiters);
- List tokens = new ArrayList();
+ List<String> tokens = new ArrayList<>();
while (st.hasMoreTokens()) {
String token = st.nextToken();
if (trimTokens) {
token = token.trim();
}
- if (!ignoreEmptyTokens || token.length() > 0) {
+ if (!ignoreEmptyTokens || !token.isEmpty()) {
tokens.add(token);
}
}
@@ -287,12 +287,11 @@ public final class StringUtils {
* @return the String array (<code>null</code> if the passed-in
* Collection was <code>null</code>)
*/
- @SuppressWarnings({"unchecked"})
- public static String[] toStringArray(Collection collection) {
+ public static String[] toStringArray(Collection<String> collection) {
if (collection == null) {
return null;
}
- return (String[]) collection.toArray(new String[collection.size()]);
+ return collection.toArray(new String[collection.size()]);
}
public static String[] splitKeyValue(String aLine) throws ParseException {
@@ -440,12 +439,14 @@ public final class StringUtils {
}
/**
+ * <p>
* Joins the elements of the provided {@code Iterator} into
* a single String containing the provided elements.</p>
* <p/>
+ * <p>
* No delimiter is added before or after the list.
* A {@code null} separator is the same as an empty String ("").</p>
- * <p/>
+ * <p>
* Copied from Commons Lang, version 3 (r1138702).</p>
*
* @param iterator the {@code Iterator} of values to join together, may be null
@@ -515,7 +516,7 @@ public final class StringUtils {
* @since 1.2
*/
public static String uppercaseFirstChar(String in) {
- if (in == null || in.length() == 0) {
+ if (in == null || in.isEmpty()) {
return in;
}
int length = in.length();
@@ -545,7 +546,7 @@ public final class StringUtils {
return Collections.singleton(elements[0]);
}
- LinkedHashSet<E> set = new LinkedHashSet<E>(elements.length * 4 / 3 + 1);
+ LinkedHashSet<E> set = new LinkedHashSet<>(elements.length * 4 / 3 + 1);
Collections.addAll(set, elements);
return set;
}
diff --git a/lang/src/test/java/org/apache/shiro/lang/util/ClassUtilsTest.java b/lang/src/test/java/org/apache/shiro/lang/util/ClassUtilsTest.java
index e1988276e..d190f6dd7 100644
--- a/lang/src/test/java/org/apache/shiro/lang/util/ClassUtilsTest.java
+++ b/lang/src/test/java/org/apache/shiro/lang/util/ClassUtilsTest.java
@@ -20,13 +20,14 @@ package org.apache.shiro.lang.util;
import org.junit.jupiter.api.Test;
+import java.io.IOException;
+import java.io.InputStream;
+import static org.apache.shiro.lang.io.ResourceUtils.getInputStreamForPath;
import static org.assertj.core.api.Assertions.assertThat;
class ClassUtilsTest {
-
@Test
void testGetPrimitiveClasses() throws UnknownClassException {
-
assertThat(ClassUtils.forName("boolean")).isEqualTo(boolean.class);
assertThat(ClassUtils.forName("byte")).isEqualTo(byte.class);
assertThat(ClassUtils.forName("char")).isEqualTo(char.class);
@@ -84,4 +85,17 @@ class ClassUtilsTest {
assertThat(ClassUtils.forName(ClassUtilsTest.class.getName())).isEqualTo(ClassUtilsTest.class);
assertThat(ClassUtils.forName(ClassUtilsTest[].class.getName())).isEqualTo(ClassUtilsTest[].class);
}
+
+ @Test
+ void inputStreamFileLoading() throws IOException {
+ try (InputStream is = getInputStreamForPath("classpath:org/apache/shiro/lang/util/ClassUtilsTest.class")) {
+ assertThat(is.readAllBytes()).isNotEmpty();
+ }
+ try (InputStream is = getInputStreamForPath("target/test-classes/test-data/file.json")) {
+ assertThat(is.readAllBytes()).isNotEmpty();
+ }
+ try (InputStream is = getInputStreamForPath("file:target/test-classes/test-data/file.json")) {
+ assertThat(is.readAllBytes()).isNotEmpty();
+ }
+ }
}
diff --git a/lang/src/test/resources/test-data/file.json b/lang/src/test/resources/test-data/file.json
new file mode 100644
index 000000000..16d8c22fa
--- /dev/null
+++ b/lang/src/test/resources/test-data/file.json
@@ -0,0 +1,4 @@
+{
+ "id": 1,
+ "name": "example"
+}
diff --git a/pom.xml b/pom.xml
index c67b51712..896e379fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,10 +66,12 @@
</distributionManagement>
<properties>
- <shiro.previousVersion>2.0.0</shiro.previousVersion>
+ <!-- *** Remove the line below when 3.0.0 is released -->
+ <shiro.previousVersion>3.0.0</shiro.previousVersion>
<!-- Replaced by the build number plugin at build time: -->
<buildNumber>${user.name}-${maven.build.timestamp}</buildNumber>
- <project.build.outputTimestamp>2026-01-15T21:40:21Z</project.build.outputTimestamp>
+ <project.build.outputTimestamp>2026-02-07T22:56:07Z</project.build.outputTimestamp>
+ <root.dir>${maven.multiModuleProjectDirectory}</root.dir>
<jacoco.skip>true</jacoco.skip>
<!-- workaround for gmavenplus plugin until maven 4 is being used -->
<maven.project.sourceRoots.warningsDisabled>true</maven.project.sourceRoots.warningsDisabled>
@@ -84,13 +86,13 @@
<nexus-staging-profile>nexus-staging</nexus-staging-profile>
<jacocoAgent/>
<!-- non-dependency-based properties: -->
- <shiro.osgi.importRange>[2, 3)</shiro.osgi.importRange>
+ <shiro.osgi.importRange>[3.0.0,999.999.999]</shiro.osgi.importRange>
<jcache.osgi.importRange>[1.1,2)</jcache.osgi.importRange>
<!-- Compile 3rd party dependencies: -->
<!-- Don't change this version without also changing the shiro-aspect and shiro-features
modules' OSGi metadata: -->
- <aspectj.version>1.9.20.1</aspectj.version>
+ <aspectj.version>1.9.25.1</aspectj.version>
<commons.beanutils.version>1.11.0</commons.beanutils.version>
<commons.cli.version>1.11.0</commons.cli.version>
<commons.collection.version>3.2.2</commons.collection.version>
@@ -98,18 +100,12 @@
<commons.lang3.version>3.20.0</commons.lang3.version>
<commons.logging.version>1.3.6</commons.logging.version>
<commons.text.version>1.8</commons.text.version>
- <!-- Don't change this version without also changing the shiro-ehcache and shiro-features
- modules' OSGi metadata: -->
- <ehcache.version>2.6.11</ehcache.version>
- <!-- Don't change this version without also changing the shiro-hazelcast and shiro-features OSGi metadata: -->
- <hazelcast.version>5.3.8</hazelcast.version>
<hsqldb.version>2.7.4</hsqldb.version>
- <javax.annotation.api.version>1.3.2</javax.annotation.api.version>
<jcache.api.version>1.1.1</jcache.api.version>
- <jdk.version>11</jdk.version>
- <jetty.version>9.4.58.v20250814</jetty.version>
- <tomcat.version>9.0.113</tomcat.version>
- <tomcat10.version>10.1.50</tomcat10.version>
+ <jdk.version>17</jdk.version>
+ <tomcat.version>11.0.22</tomcat.version>
+ <jakarta.ee.version>11.0.0</jakarta.ee.version>
+ <jetty.version>12.1.10</jetty.version>
<owasp.java.encoder.version>1.4.0</owasp.java.encoder.version>
<!-- Don't change this version without also changing the shiro-quartz and shiro-features
modules' OSGi metadata: -->
@@ -117,11 +113,11 @@
<quartz.docs.version>2.3.0</quartz.docs.version>
<slf4j.version>2.0.18</slf4j.version>
<log4j.version>2.26.0</log4j.version>
- <spring.version>5.3.39</spring.version>
- <spring-boot.version>2.7.18</spring-boot.version>
- <guice.version>4.2.3</guice.version>
- <jaxrs.api.version>2.1.6</jaxrs.api.version>
- <htmlunit.version>4.21.0</htmlunit.version>
+ <spring.version>7.0.8</spring.version>
+ <spring-boot.version>4.1.0</spring-boot.version>
+ <guice.version>7.0.0</guice.version>
+ <jaxrs.api.version>4.0.0</jaxrs.api.version>
+ <htmlunit.version>5.1.0</htmlunit.version>
<bouncycastle.version>1.84</bouncycastle.version>
<!-- Test 3rd-party dependencies: -->
@@ -129,13 +125,11 @@
<mockito.version>5.23.0</mockito.version>
<bytebuddy.version>1.18.10</bytebuddy.version>
<gmaven.version>5.0.0</gmaven.version>
- <groovy.version>4.0.27</groovy.version>
- <junit.version>5.13.4</junit.version>
- <junit.engine.version>1.13.4</junit.engine.version>
+ <groovy.version>5.0.6</groovy.version>
+ <junit.version>6.1.0</junit.version>
<junit.server.jetty.version>3.5.0</junit.server.jetty.version>
- <hibernate.version>5.6.15.Final</hibernate.version>
+ <hibernate.version>7.4.1.Final</hibernate.version>
<taglibs.standard.version>1.2.5</taglibs.standard.version>
- <jakarta.annotations.version>1.3.5</jakarta.annotations.version>
<lombok.version>1.18.46</lombok.version>
<maven.compiler.release>${jdk.version}</maven.compiler.release>
@@ -156,7 +150,6 @@
<module>web</module>
<module>support</module>
<module>tools</module>
- <module>bom</module>
<module>integration-tests</module>
<module>samples</module>
<!-- <module>test-coverage</module> -->
@@ -317,37 +310,30 @@
<links>
<link>https://docs.oracle.com/en/java/javase/${jdk.version}/docs/api/</link>
<link>https://docs.spring.io/spring-framework/docs/${spring.version}/javadoc-api/</link>
- <link>https://docs.spring.io/spring-boot/docs/${spring-boot.version}/api/</link>
+ <link>https://docs.spring.io/spring-boot/${spring-boot.version}/api/java/</link>
<link>https://junit.org/junit5/docs/${junit.version}/api/</link>
<link>https://www.quartz-scheduler.org/api/${quartz.docs.version}/</link>
</links>
</configuration>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>3.5.1</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-help-plugin</artifactId>
- <version>3.5.1</version>
- </plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
- <version>5.1.9</version>
+ <version>6.0.2</version>
+ <dependencies>
+ <!-- Required to upgrade bnd in the maven-bundle-plugin to be able to handle Multi-Release jars -->
+ <dependency>
+ <groupId>biz.aQute.bnd</groupId>
+ <artifactId>biz.aQute.bndlib</artifactId>
+ <version>7.3.0</version>
+ </dependency>
+ </dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>4.0.0-M16</version>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-scm-publish-plugin</artifactId>
- <version>3.3.0</version>
- </plugin>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
@@ -367,6 +353,7 @@
<exclude>**/org.springframework.boot.autoconfigure.AutoConfiguration.imports</exclude>
<exclude>**/spring.provides</exclude>
<exclude>**/*.iml</exclude>
+ <exclude>**/*.idea/**</exclude>
<exclude>**/target/**</exclude>
<exclude>**/nb-configuration.xml</exclude>
<exclude>**/faces-config.NavData</exclude>
@@ -398,6 +385,9 @@
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>${gmaven.version}</version>
+ <configuration>
+ <targetBytecode>${jdk.version}</targetBytecode>
+ </configuration>
<dependencies>
<dependency>
<groupId>org.apache.groovy</groupId>
@@ -434,22 +424,17 @@
</configuration>
</plugin>
<plugin>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
+ <groupId>org.eclipse.jetty.ee11</groupId>
+ <artifactId>jetty-ee11-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
- <contextPath>/</contextPath>
<httpConnector>
<port>9080</port>
<idleTimeout>60000</idleTimeout>
</httpConnector>
- <requestLog implementation="org.eclipse.jetty.server.NCSARequestLog">
- <filename>./target/yyyy_mm_dd.request.log</filename>
- <retainDays>90</retainDays>
- <append>true</append>
- <extended>false</extended>
- <logTimeZone>GMT</logTimeZone>
- </requestLog>
+ <webApp>
+ <contextPath>/</contextPath>
+ </webApp>
</configuration>
</plugin>
<plugin>
@@ -514,78 +499,9 @@
</dependency>
</dependencies>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <executions>
- <execution>
- <id>jakarta</id>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <minimizeJar>false</minimizeJar>
- <shadedArtifactAttached>true</shadedArtifactAttached>
- <shadedClassifierName>jakarta</shadedClassifierName>
- <createDependencyReducedPom>false</createDependencyReducedPom>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
- <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" />
- </transformers>
- <artifactSet>
- <includes>
- <include>${project.groupId}:${project.artifactId}</include>
- </includes>
- </artifactSet>
- <relocations>
- <relocation>
- <pattern>javax.annotation</pattern>
- <shadedPattern>jakarta.annotation</shadedPattern>
- <excludes>
- <exclude>javax.annotation.processing.**</exclude>
- </excludes>
- </relocation>
- <relocation>
- <pattern>javax.enterprise</pattern>
- <shadedPattern>jakarta.enterprise</shadedPattern>
- <excludes>
- <exclude>javax.enterprise.deploy.**</exclude>
- </excludes>
- </relocation>
- <relocation>
- <pattern>javax.inject</pattern>
- <shadedPattern>jakarta.inject</shadedPattern>
- </relocation>
- <relocation>
- <pattern>javax.json</pattern>
- <shadedPattern>jakarta.json</shadedPattern>
- </relocation>
- <relocation>
- <pattern>javax.servlet.http.HttpSessionContext</pattern>
- <shadedPattern>org.apache.shiro.web.servlet.HttpSessionContext</shadedPattern>
- </relocation>
- <relocation>
- <pattern>javax.servlet</pattern>
- <shadedPattern>jakarta.servlet</shadedPattern>
- </relocation>
- <relocation>
- <pattern>javax.websocket</pattern>
- <shadedPattern>jakarta.websocket</shadedPattern>
- </relocation>
- <relocation>
- <pattern>javax.ws.rs</pattern>
- <shadedPattern>jakarta.ws.rs</shadedPattern>
- </relocation>
- </relocations>
- </configuration>
- </execution>
- </executions>
- </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
- <version>3.6.0</version>
<configuration>
<configLocation>${checkstyle.configLocation}</configLocation>
<suppressionsLocation>${checkstyle.suppressionsLocation}</suppressionsLocation>
@@ -610,7 +526,7 @@
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
- <version>10.26.1</version>
+ <version>13.5.0</version>
</dependency>
</dependencies>
</plugin>
@@ -629,27 +545,6 @@
</execution>
</executions>
</plugin>
- <plugin>
- <groupId>org.commonjava.maven.plugins</groupId>
- <artifactId>directory-maven-plugin</artifactId>
- <version>1.0</version>
- <executions>
- <execution>
- <id>directories</id>
- <goals>
- <goal>directory-of</goal>
- </goals>
- <phase>validate</phase>
- <configuration>
- <property>root.dir</property>
- <project>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-root</artifactId>
- </project>
- </configuration>
- </execution>
- </executions>
- </plugin>
<plugin>
<artifactId>maven-checkstyle-plugin</artifactId>
</plugin>
@@ -658,9 +553,11 @@
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<showWarnings>true</showWarnings>
+ <parameters>true</parameters>
<compilerArgs>
<arg>-Xlint:deprecation</arg>
<arg>-Xlint:unchecked</arg>
+ <arg>-Xlint:rawtypes</arg>
</compilerArgs>
<annotationProcessorPaths>
<annotationProcessorPath>
@@ -691,11 +588,13 @@
<include>org/apache/shiro/**</include>
</includes>
<excludes>
+ <exclude>**/*$$SpringCGLIB$$*</exclude>
<exclude>**/*$$FastClassBy*$$*</exclude>
<exclude>**/*$$EnhancerBy*CGLIB$$*</exclude>
<exclude>**/*$MockitoMock$*</exclude>
<exclude>**/*$HibernateProxy$*</exclude>
<exclude>**/*$Proxy$*WeldClientProxy</exclude>
+ <exclude>**/*$Proxy$*WeldSubclass</exclude>
<exclude>org/apache/shiro/samples/guice/SampleShiroGuiceBootstrap</exclude>
<exclude>org/apache/shiro/samples/guice/SampleShiroServletModule</exclude>
<exclude>org/apache/shiro/**/*Test</exclude>
@@ -705,6 +604,7 @@
<exclude>org/apache/shiro/testing/jakarta/ee/PropertyPrincipal</exclude>
<exclude>org/apache/shiro/testing/cdi/ComponentInjectionBean</exclude>
<exclude>org/apache/shiro/**/__EJB31_Generated*</exclude>
+ <exclude>org/apache/shiro/util/DefaultScopedValues</exclude>
<!-- cause too many coverage misses -->
<exclude>org/apache/shiro/**/Deployments</exclude>
</excludes>
@@ -743,9 +643,7 @@
<execution>
<goals>
<goal>addTestSources</goal>
- <goal>generateTestStubs</goal>
<goal>compileTests</goal>
- <goal>removeTestStubs</goal>
</goals>
</execution>
</executions>
@@ -938,8 +836,6 @@
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
- <version>3.27.7</version>
- <scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
@@ -1038,7 +934,7 @@
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
- <artifactId>shiro-ehcache</artifactId>
+ <artifactId>shiro-jcache</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
@@ -1056,11 +952,6 @@
<artifactId>shiro-guice</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-hazelcast</artifactId>
- <version>${project.version}</version>
- </dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-jaxrs</artifactId>
@@ -1089,6 +980,12 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <version>3.27.7</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.apache.shiro.integrationtests</groupId>
<artifactId>shiro-its-support</artifactId>
@@ -1134,12 +1031,6 @@
<version>2.3.0</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.assertj</groupId>
- <artifactId>assertj-core</artifactId>
- <version>3.25.3</version>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
@@ -1161,11 +1052,6 @@
<artifactId>commons-lang3</artifactId>
<version>${commons.lang3.version}</version>
</dependency>
- <dependency>
- <groupId>javax.annotation</groupId>
- <artifactId>javax.annotation-api</artifactId>
- <version>${javax.annotation.api.version}</version>
- </dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
@@ -1269,6 +1155,13 @@
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>jakarta.platform</groupId>
+ <artifactId>jakarta.jakartaee-bom</artifactId>
+ <version>11.0.0</version>
+ <scope>import</scope>
+ <type>pom</type>
+ </dependency>
<dependency>
<!-- Required in the sample apps only for 3rd-party libraries that expect to call
the commons logging APIs -->
@@ -1295,56 +1188,11 @@
<scope>runtime</scope>
<optional>true</optional>
</dependency>
- <dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.2</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-spec</artifactId>
- <version>${taglibs.standard.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-impl</artifactId>
- <version>${taglibs.standard.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>4.0.1</version>
- <scope>provided</scope>
- </dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy</artifactId>
<version>${groovy.version}</version>
</dependency>
- <dependency>
- <groupId>net.sf.ehcache</groupId>
- <artifactId>ehcache-core</artifactId>
- <version>${ehcache.version}</version>
- <optional>true</optional>
- <exclusions>
- <exclusion>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </exclusion>
- <exclusion>
- <groupId>net.sf.ehcache</groupId>
- <artifactId>sizeof-agent</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.hazelcast</groupId>
- <artifactId>hazelcast</artifactId>
- <version>${hazelcast.version}</version>
- </dependency>
<dependency>
<groupId>org.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
@@ -1352,7 +1200,7 @@
</dependency>
<dependency>
<!-- Used for sample applications only - not required for the framework: -->
- <groupId>org.hibernate</groupId>
+ <groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
<optional>true</optional>
@@ -1382,38 +1230,21 @@
<artifactId>jacc</artifactId>
</exclusion>
<exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
+ <groupId>jakarta.servlet</groupId>
+ <artifactId>jakarta.servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>jboss</groupId>
<!--suppress MavenModelInspection -->
<artifactId>jboss-cache</artifactId>
</exclusion>
- <exclusion>
- <groupId>net.sf.ehcache</groupId>
- <artifactId>ehcache</artifactId>
- </exclusion>
<exclusion>
<groupId>asm</groupId>
<!--suppress MavenModelInspection -->
<artifactId>asm-attrs</artifactId>
</exclusion>
- <exclusion>
- <groupId>javax.transaction</groupId>
- <artifactId>jta</artifactId>
- </exclusion>
</exclusions>
</dependency>
- <!-- Used to support Hibernate's JTA runtime dependency in the sample application(s) only.
- Not required for Shiro -->
- <dependency>
- <groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-jta_1.1_spec</artifactId>
- <version>1.1.1</version>
- <scope>runtime</scope>
- <optional>true</optional>
- </dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
@@ -1487,17 +1318,18 @@
</exclusions>
</dependency>
+ <dependency>
+ <groupId>org.glassfish.jaxb</groupId>
+ <artifactId>jaxb-runtime</artifactId>
+ <version>4.0.9</version>
+ </dependency>
+
<!-- Guice -->
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>${guice.version}</version>
</dependency>
- <dependency>
- <groupId>com.google.inject.extensions</groupId>
- <artifactId>guice-multibindings</artifactId>
- <version>${guice.version}</version>
- </dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-servlet</artifactId>
@@ -1509,11 +1341,6 @@
<version>${quartz.version}</version>
<optional>true</optional>
</dependency>
- <dependency>
- <groupId>com.github.mjeanroy</groupId>
- <artifactId>junit-servers-jetty-9</artifactId>
- <version>${junit.server.jetty.version}</version>
- </dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
@@ -1521,6 +1348,12 @@
<version>${bouncycastle.version}</version>
</dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>33.6.0-jre</version>
+ </dependency>
+
<dependency>
<groupId>org.apache.maven.skins</groupId>
<artifactId>maven-fluido-skin</artifactId>
@@ -1612,6 +1445,7 @@
<exclude>**/org.springframework.boot.autoconfigure.AutoConfiguration.imports</exclude>
<exclude>**/spring.provides</exclude>
<exclude>**/*.iml</exclude>
+ <exclude>**/*.idea/**</exclude>
<exclude>**/target/**</exclude>
<exclude>**/nb-configuration.xml</exclude>
<exclude>**/faces-config.NavData</exclude>
@@ -1730,6 +1564,61 @@
</pluginManagement>
</build>
</profile>
+ <profile>
+ <id>jdk-21</id>
+ <activation>
+ <jdk>[21,)</jdk>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>jdk21-compile</id>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ <configuration>
+ <multiReleaseOutput>true</multiReleaseOutput>
+ <release>21</release>
+ <compileSourceRoots>${project.build.sourceDirectory}21</compileSourceRoots>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>jdk-25</id>
+ <activation>
+ <jdk>[25,)</jdk>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>jdk25-compile</id>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ <configuration>
+ <multiReleaseOutput>true</multiReleaseOutput>
+ <release>25</release>
+ <compileSourceRoots>${project.build.sourceDirectory}25</compileSourceRoots>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+
<profile>
<id>docs</id>
<build>
diff --git a/samples/spring-boot-3-web/pom.xml b/samples/spring-boot-3-web/pom.xml
deleted file mode 100644
index 19b83cd32..000000000
--- a/samples/spring-boot-3-web/pom.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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
- ~ "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.
- -->
-<!--suppress osmorcNonOsgiMavenDependency -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
-
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.shiro.samples</groupId>
- <artifactId>shiro-samples</artifactId>
- <version>999-SNAPSHOT</version>
- </parent>
-
- <artifactId>samples-spring-boot-3-web</artifactId>
- <name>Apache Shiro :: Samples :: Spring Boot 3 Web</name>
- <packaging>war</packaging>
-
- <properties>
- <module.name>samples.spring.boot3.web</module.name>
- <spring-boot3.version>3.5.0</spring-boot3.version>
- <!-- below versions are not necessary in "real" applications -->
- <spring.version>6.2.8</spring.version>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-core</artifactId>
- <classifier>jakarta</classifier>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-web</artifactId>
- <classifier>jakarta</classifier>
- </dependency>
-
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring-boot-web-starter</artifactId>
- <classifier>jakarta</classifier>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring-boot-starter</artifactId>
- <classifier>jakarta</classifier>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring</artifactId>
- <classifier>jakarta</classifier>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j2-impl</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-api</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <scope>runtime</scope>
- </dependency>
-
- <!-- Spring Boot -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-configuration-processor</artifactId>
- <optional>true</optional>
- </dependency>
-
- <!-- below dependencies may not be necessary in "real" applications -->
- <dependency>
- <groupId>jakarta.servlet</groupId>
- <artifactId>jakarta.servlet-api</artifactId>
- <scope>provided</scope>
- </dependency>
- </dependencies>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-dependencies</artifactId>
- <version>${spring-boot3.version}</version>
- <type>pom</type>
- <scope>import</scope>
- <exclusions>
- <exclusion>
- <groupId>org.junit.jupiter</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.junit.platform</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.junit.vintage</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-bom</artifactId>
- <version>${project.version}</version>
- <scope>import</scope>
- <type>pom</type>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat.embed</groupId>
- <artifactId>tomcat-embed-core</artifactId>
- <version>${tomcat10.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat.embed</groupId>
- <artifactId>tomcat-embed-el</artifactId>
- <version>${tomcat10.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat.embed</groupId>
- <artifactId>tomcat-embed-websocket</artifactId>
- <version>${tomcat10.version}</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <version>${spring-boot3.version}</version>
- <executions>
- <execution>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
-</project>
diff --git a/samples/web-jakarta/pom.xml b/samples/web-jakarta/pom.xml
deleted file mode 100644
index fbad05c85..000000000
--- a/samples/web-jakarta/pom.xml
+++ /dev/null
@@ -1,200 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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
- ~ "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.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.apache.shiro.samples</groupId>
- <artifactId>shiro-samples</artifactId>
- <version>999-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>samples-web-jakarta</artifactId>
- <name>Apache Shiro :: Samples :: Web Jakarta</name>
- <packaging>war</packaging>
-
- <properties>
- <meecrowave.version>1.2.15</meecrowave.version>
- <tomcat.version>${tomcat10.version}</tomcat.version>
- <jacoco.skip>true</jacoco.skip>
- </properties>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-bom</artifactId>
- <version>${project.version}</version>
- <scope>import</scope>
- <type>pom</type>
- </dependency>
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-bom</artifactId>
- <version>3.6.11</version>
- <scope>import</scope>
- <type>pom</type>
- </dependency>
- <dependency>
- <groupId>org.apache.johnzon</groupId>
- <artifactId>johnzon-jsonb</artifactId>
- <version>1.3.0</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat.embed</groupId>
- <artifactId>tomcat-embed-core</artifactId>
- <version>${tomcat.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat.embed</groupId>
- <artifactId>tomcat-embed-el</artifactId>
- <version>${tomcat.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>tomcat-jaspic-api</artifactId>
- <version>${tomcat.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat.embed</groupId>
- <artifactId>tomcat-embed-websocket</artifactId>
- <version>${tomcat.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>tomcat-catalina</artifactId>
- <version>${tomcat.version}</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-core</artifactId>
- <classifier>jakarta</classifier>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-web</artifactId>
- <classifier>jakarta</classifier>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j2-impl</artifactId>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-api</artifactId>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.glassfish.web</groupId>
- <artifactId>jakarta.servlet.jsp.jstl</artifactId>
- <version>3.0.1</version>
- <scope>compile</scope>
- </dependency>
-
- <dependency>
- <groupId>jakarta.servlet.jsp</groupId>
- <artifactId>jakarta.servlet.jsp-api</artifactId>
- <version>3.1.1</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>jakarta.servlet.jsp.jstl</groupId>
- <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
- <version>3.0.2</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>jakarta.servlet</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>tomcat-jasper</artifactId>
- <version>${tomcat.version}</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>tomcat-jasper-el</artifactId>
- <version>${tomcat.version}</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- <scope>runtime</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.meecrowave</groupId>
- <artifactId>meecrowave-core</artifactId>
- <classifier>jakarta</classifier>
- <version>${meecrowave.version}</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>3.5.1</version>
- <executions>
- <execution>
- <id>default-war</id>
- <goals>
- <goal>war</goal>
- </goals>
- <phase>process-test-classes</phase>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
-</project>
diff --git a/shiro.doap.rdf b/shiro.doap.rdf
index 48b732532..f725ef266 100644
--- a/shiro.doap.rdf
+++ b/shiro.doap.rdf
@@ -160,6 +160,20 @@
<revision>2.2.0</revision>
</Version>
</release>
+ <release>
+ <Version>
+ <name>Apache Shiro 2.2.1</name>
+ <created>2026-06-15</created>
+ <revision>2.2.1</revision>
+ </Version>
+ </release>
+ <release>
+ <Version>
+ <name>Apache Shiro 3.0.0</name>
+ <created>2026-06-30</created>
+ <revision>3.0.0</revision>
+ </Version>
+ </release>
<repository>
<GitRepository>
diff --git a/src/suppressions.xml b/src/suppressions.xml
index d24858ba6..ec635a94e 100644
--- a/src/suppressions.xml
+++ b/src/suppressions.xml
@@ -40,4 +40,5 @@
<suppress checks=".*" files="Quickstart.*.java"/>
<suppress checks=".*" files="application.properties"/>
<suppress checks="LineLength" lines="45" files="org.apache.shiro.web.filter.InvalidRequestFilter"/>
+ <suppress checks="LineLength" lines="30" files="org.apache.shiro.util.AntPathMatcherTests"/>
</suppressions>
diff --git a/support/ehcache/pom.xml b/support/ehcache/pom.xml
deleted file mode 100644
index be200dc8a..000000000
--- a/support/ehcache/pom.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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
- ~ "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.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
-
- <parent>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-support</artifactId>
- <version>999-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>shiro-ehcache</artifactId>
- <name>Apache Shiro :: Support :: EHCache</name>
- <packaging>bundle</packaging>
- <properties>
- <module.name>ehcache</module.name>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-cache</artifactId>
- </dependency>
- <dependency>
- <groupId>net.sf.ehcache</groupId>
- <artifactId>ehcache-core</artifactId>
- </dependency>
- <!-- Test dependencies -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j2-impl</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-SymbolicName>org.apache.shiro.ehcache</Bundle-SymbolicName>
- <Export-Package>org.apache.shiro.cache.ehcache*;version=${project.version}</Export-Package>
- <Import-Package>
- org.apache.shiro.cache*;version="${shiro.osgi.importRange}",
- net.sf.ehcache*;version="[2.5, 3)",
- *
- </Import-Package>
- <_removeheaders>Bnd-LastModified</_removeheaders>
- <_reproducible>true</_reproducible>
- </instructions>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
diff --git a/support/hazelcast/pom.xml b/support/hazelcast/pom.xml
deleted file mode 100644
index aeee6b0ab..000000000
--- a/support/hazelcast/pom.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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
- ~ "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.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
-
- <parent>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-support</artifactId>
- <version>999-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>shiro-hazelcast</artifactId>
- <name>Apache Shiro :: Support :: Hazelcast</name>
- <packaging>bundle</packaging>
-
- <properties>
- <hazelcast.osgi.importRange>[4, 5)</hazelcast.osgi.importRange>
- <module.name>hazelcast</module.name>
- <surefire.argLine>--sun-misc-unsafe-memory-access=allow</surefire.argLine>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-cache</artifactId>
- </dependency>
- <dependency>
- <groupId>com.hazelcast</groupId>
- <artifactId>hazelcast</artifactId>
- </dependency>
- <!-- Test dependencies -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j2-impl</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-SymbolicName>org.apache.shiro.hazelcast</Bundle-SymbolicName>
- <Export-Package>org.apache.shiro.hazelcast*;version=${project.version}</Export-Package>
- <Import-Package>
- org.apache.shiro.cache*;version="${shiro.osgi.importRange}",
- com.hazelcast*;version="${hazelcast.osgi.importRange}",
- *
- </Import-Package>
- <_removeheaders>Bnd-LastModified</_removeheaders>
- <_reproducible>true</_reproducible>
- </instructions>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
diff --git a/test-coverage/pom.xml b/test-coverage/pom.xml
index ebc1e7e08..ee5b19a34 100644
--- a/test-coverage/pom.xml
+++ b/test-coverage/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-root</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>3.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
diff --git a/tools/hasher/pom.xml b/tools/hasher/pom.xml
index 3bf6d5033..1d5545584 100644
--- a/tools/hasher/pom.xml
+++ b/tools/hasher/pom.xml
@@ -93,7 +93,7 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
- <version>2.7.18</version>
+ <version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
diff --git a/tools/hasher/src/test/java/org/apache/shiro/tools/hasher/HasherTest.java b/tools/hasher/src/test/java/org/apache/shiro/tools/hasher/HasherTest.java
index 89afcf7bf..34575dab1 100644
--- a/tools/hasher/src/test/java/org/apache/shiro/tools/hasher/HasherTest.java
+++ b/tools/hasher/src/test/java/org/apache/shiro/tools/hasher/HasherTest.java
@@ -103,9 +103,9 @@ public class HasherTest {
Hasher.main(args);
// when
- assertEquals(1, listAppender.getEvents().size());
+ assertThat(listAppender.getEvents()).hasSize(1);
LogEvent iLoggingEvent = listAppender.getEvents().get(0);
- assertTrue(iLoggingEvent.getMessage().getFormattedMessage().contains("$shiro2$2y$10$"));
+ assertThat(iLoggingEvent.getMessage().getFormattedMessage()).contains("$shiro2$2y$10$");
}
@Test
diff --git a/web/pom.xml b/web/pom.xml
index 3f03c2735..2ab76e0aa 100644
--- a/web/pom.xml
+++ b/web/pom.xml
@@ -41,20 +41,14 @@
<artifactId>shiro-core</artifactId>
</dependency>
<dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-api</artifactId>
+ <groupId>jakarta.servlet.jsp</groupId>
+ <artifactId>jakarta.servlet.jsp-api</artifactId>
+ <optional>true</optional>
</dependency>
<dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-spec</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-impl</artifactId>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
+ <groupId>jakarta.servlet</groupId>
+ <artifactId>jakarta.servlet-api</artifactId>
+ <optional>true</optional>
</dependency>
<dependency>
<groupId>org.owasp.encoder</groupId>
@@ -107,10 +101,10 @@
<instructions>
<Bundle-SymbolicName>org.apache.shiro.web</Bundle-SymbolicName>
<Export-Package>org.apache.shiro.web*;version=${project.version}</Export-Package>
- <!-- javax.servlet.jsp* marked as optional per SHIRO-390: -->
+ <!-- jakarta.servlet.jsp* marked as optional per SHIRO-390: -->
<Import-Package>
org.apache.shiro*;version="${shiro.osgi.importRange}",
- javax.servlet.jsp*;resolution:=optional,
+ jakarta.servlet.jsp*;resolution:=optional,
*
</Import-Package>
<_removeheaders>Bnd-LastModified</_removeheaders>
@@ -118,10 +112,6 @@
</instructions>
</configuration>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- </plugin>
</plugins>
</build>
diff --git a/web/src/main/java/org/apache/shiro/web/config/IniFilterChainResolverFactory.java b/web/src/main/java/org/apache/shiro/web/config/IniFilterChainResolverFactory.java
index c57fec54d..f5159eab2 100644
--- a/web/src/main/java/org/apache/shiro/web/config/IniFilterChainResolverFactory.java
+++ b/web/src/main/java/org/apache/shiro/web/config/IniFilterChainResolverFactory.java
@@ -31,8 +31,8 @@ import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.Filter;
-import javax.servlet.FilterConfig;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterConfig;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
@@ -61,7 +61,8 @@ public class IniFilterChainResolverFactory extends IniFactorySupport<FilterChain
private List<String> globalFilters = Collections.singletonList(DefaultFilter.invalidRequest.name());
- private boolean caseInsensitive;
+ private boolean allowAccessByDefault;
+ private boolean caseInsensitive = true;
public IniFilterChainResolverFactory() {
super();
@@ -92,6 +93,14 @@ public class IniFilterChainResolverFactory extends IniFactorySupport<FilterChain
this.globalFilters = globalFilters;
}
+ public boolean isAllowAccessByDefault() {
+ return allowAccessByDefault;
+ }
+
+ public void setAllowAccessByDefault(boolean allowAccessByDefault) {
+ this.allowAccessByDefault = allowAccessByDefault;
+ }
+
public boolean isCaseInsensitive() {
return caseInsensitive;
}
@@ -102,8 +111,7 @@ public class IniFilterChainResolverFactory extends IniFactorySupport<FilterChain
protected FilterChainResolver createInstance(Ini ini) {
FilterChainResolver filterChainResolver = createDefaultInstance();
- if (filterChainResolver instanceof PathMatchingFilterChainResolver) {
- PathMatchingFilterChainResolver resolver = (PathMatchingFilterChainResolver) filterChainResolver;
+ if (filterChainResolver instanceof PathMatchingFilterChainResolver resolver) {
FilterChainManager manager = resolver.getFilterChainManager();
buildChains(manager, ini);
}
@@ -159,7 +167,11 @@ public class IniFilterChainResolverFactory extends IniFactorySupport<FilterChain
// create the default chain, to match anything the path matching would have missed
// TODO this assumes ANT path matching
- manager.createDefaultChain("/**");
+ if (isAllowAccessByDefault()) {
+ manager.createDefaultChain("/**", DefaultFilter.anon.name());
+ } else {
+ manager.createDefaultChain("/**", DefaultFilter.noAccess.name());
+ }
}
protected void registerFilters(Map<String, Filter> filters, FilterChainManager manager) {
@@ -203,8 +215,8 @@ public class IniFilterChainResolverFactory extends IniFactorySupport<FilterChain
for (Map.Entry<String, ?> entry : objects.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
- if (value instanceof Filter) {
- filterMap.put(key, (Filter) value);
+ if (value instanceof Filter filter) {
+ filterMap.put(key, filter);
}
}
return filterMap;
diff --git a/web/src/main/java/org/apache/shiro/web/config/ShiroFilterConfiguration.java b/web/src/main/java/org/apache/shiro/web/config/ShiroFilterConfiguration.java
index 87a272994..46db10696 100644
--- a/web/src/main/java/org/apache/shiro/web/config/ShiroFilterConfiguration.java
+++ b/web/src/main/java/org/apache/shiro/web/config/ShiroFilterConfiguration.java
@@ -43,7 +43,7 @@ public class ShiroFilterConfiguration {
/**
* Sets whether the filter executes once per request or for every invocation of the filter. It is recommended
- * to leave this disabled if you are using a {@link javax.servlet.RequestDispatcher RequestDispatcher} to forward
+ * to leave this disabled if you are using a {@link jakarta.servlet.RequestDispatcher RequestDispatcher} to forward
* or include request (JSP tags, programmatically, or via a framework).
*
* @param filterOncePerRequest Whether this filter executes once per request.
diff --git a/web/src/main/java/org/apache/shiro/web/config/WebIniSecurityManagerFactory.java b/web/src/main/java/org/apache/shiro/web/config/WebIniSecurityManagerFactory.java
index 6c20d3dbd..3a93b1911 100644
--- a/web/src/main/java/org/apache/shiro/web/config/WebIniSecurityManagerFactory.java
+++ b/web/src/main/java/org/apache/shiro/web/config/WebIniSecurityManagerFactory.java
@@ -18,13 +18,13 @@
*/
package org.apache.shiro.web.config;
+import jakarta.servlet.Filter;
import org.apache.shiro.config.Ini;
import org.apache.shiro.ini.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.web.filter.mgt.DefaultFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
-import javax.servlet.Filter;
import java.util.Map;
/**
@@ -70,6 +70,7 @@ public class WebIniSecurityManagerFactory extends IniSecurityManagerFactory {
@SuppressWarnings({"unchecked"})
@Override
protected Map<String, ?> createDefaults(Ini ini, Ini.Section mainSection) {
+ @SuppressWarnings("rawtypes")
Map defaults = super.createDefaults(ini, mainSection);
//add the default filters:
Map<String, Filter> defaultFilters = DefaultFilter.createInstanceMap(null);
diff --git a/web/src/main/java/org/apache/shiro/web/env/DefaultWebEnvironment.java b/web/src/main/java/org/apache/shiro/web/env/DefaultWebEnvironment.java
index 81a2b9e7a..5f33b8555 100644
--- a/web/src/main/java/org/apache/shiro/web/env/DefaultWebEnvironment.java
+++ b/web/src/main/java/org/apache/shiro/web/env/DefaultWebEnvironment.java
@@ -24,7 +24,7 @@ import org.apache.shiro.web.config.ShiroFilterConfiguration;
import org.apache.shiro.web.filter.mgt.FilterChainResolver;
import org.apache.shiro.web.mgt.WebSecurityManager;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
import java.util.Map;
/**
diff --git a/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java b/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java
index f4fd0860a..b36d81054 100644
--- a/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java
+++ b/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java
@@ -27,7 +27,7 @@ import org.apache.shiro.lang.util.UnknownClassException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -279,7 +279,7 @@ public class EnvironmentLoader {
/**
* Instantiates a {@link WebEnvironment} based on the specified ServletContext.
* <p/>
- * This implementation {@link #determineWebEnvironmentClass(javax.servlet.ServletContext) determines} a
+ * This implementation {@link #determineWebEnvironmentClass(jakarta.servlet.ServletContext) determines} a
* {@link WebEnvironment} implementation class to use. That class is instantiated, configured, and returned.
* <p/>
* This allows custom {@code WebEnvironment} implementations to be specified via a ServletContext init-param if
@@ -312,8 +312,8 @@ public class EnvironmentLoader {
environment.setServletContext(sc);
- if (configSpecified && (environment instanceof ResourceConfigurable)) {
- ((ResourceConfigurable) environment).setConfigLocations(configLocations);
+ if (configSpecified && (environment instanceof ResourceConfigurable configurable)) {
+ configurable.setConfigLocations(configLocations);
}
customizeEnvironment(environment);
@@ -341,8 +341,8 @@ public class EnvironmentLoader {
servletContext.log("Cleaning up Shiro Environment");
try {
Object environment = servletContext.getAttribute(ENVIRONMENT_ATTRIBUTE_KEY);
- if (environment instanceof WebEnvironment) {
- finalizeEnvironment((WebEnvironment) environment);
+ if (environment instanceof WebEnvironment webEnvironment) {
+ finalizeEnvironment(webEnvironment);
}
LifecycleUtils.destroy(environment);
} finally {
diff --git a/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoaderListener.java b/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoaderListener.java
index e77326237..efa6457de 100644
--- a/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoaderListener.java
+++ b/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoaderListener.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.env;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
/**
* Bootstrap listener to startup and shutdown the web application's Shiro
@@ -59,7 +59,7 @@ public class EnvironmentLoaderListener extends EnvironmentLoader implements Serv
/**
* Destroys any previously created/bound {@code WebEnvironment} instance created by
- * the {@link #contextInitialized(javax.servlet.ServletContextEvent)} method.
+ * the {@link #contextInitialized(jakarta.servlet.ServletContextEvent)} method.
*
* @param sce the ServletContextEvent triggered upon application shutdown
*/
diff --git a/web/src/main/java/org/apache/shiro/web/env/IniWebEnvironment.java b/web/src/main/java/org/apache/shiro/web/env/IniWebEnvironment.java
index a98fe05f4..b6bdd5d9b 100644
--- a/web/src/main/java/org/apache/shiro/web/env/IniWebEnvironment.java
+++ b/web/src/main/java/org/apache/shiro/web/env/IniWebEnvironment.java
@@ -36,7 +36,7 @@ import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
@@ -172,7 +172,7 @@ public class IniWebEnvironment extends ResourceBasedWebEnvironment implements In
* realm.foobarSpecificField = A string
* </code></pre>
* <p>
- * This may cause a configuration error if <code>MyCustomRealm</code
+ * This may cause a configuration error if <code>MyCustomRealm</code>
* does not contain the field <code>foobarSpecificField</code>.
* This can be avoided if the Framework Ini uses more unique names, such as <code>foobarRealm</code>. which would result
* in a merged configuration that looks like:
@@ -290,8 +290,7 @@ public class IniWebEnvironment extends ResourceBasedWebEnvironment implements In
if (!CollectionUtils.isEmpty(ini)) {
@SuppressWarnings("unchecked")
Factory<FilterChainResolver> factory = (Factory<FilterChainResolver>) this.objects.get(FILTER_CHAIN_RESOLVER_NAME);
- if (factory instanceof IniFactorySupport) {
- var iniFactory = (IniFactorySupport<?>) factory;
+ if (factory instanceof IniFactorySupport<?> iniFactory) {
iniFactory.setIni(ini);
iniFactory.setDefaults(this.objects);
}
@@ -343,7 +342,7 @@ public class IniWebEnvironment extends ResourceBasedWebEnvironment implements In
* <p/>
* If the path does not have a resource prefix as defined by {@link ResourceUtils#hasResourcePrefix(String)},
* the path is expected to be resolvable by the {@code ServletContext} via
- * {@link javax.servlet.ServletContext#getResourceAsStream(String)}.
+ * {@link jakarta.servlet.ServletContext#getResourceAsStream(String)}.
*
* @param path the path of the INI resource to load into an INI instance.
* @param required if the specified path must exist
diff --git a/web/src/main/java/org/apache/shiro/web/env/MutableWebEnvironment.java b/web/src/main/java/org/apache/shiro/web/env/MutableWebEnvironment.java
index 1c2d3786f..f1e5fdba5 100644
--- a/web/src/main/java/org/apache/shiro/web/env/MutableWebEnvironment.java
+++ b/web/src/main/java/org/apache/shiro/web/env/MutableWebEnvironment.java
@@ -22,7 +22,7 @@ import org.apache.shiro.web.config.ShiroFilterConfiguration;
import org.apache.shiro.web.filter.mgt.FilterChainResolver;
import org.apache.shiro.web.mgt.WebSecurityManager;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
/**
* A {@code WebEnvironment} that supports 'write' operations operations. This mainly exists to shield
diff --git a/web/src/main/java/org/apache/shiro/web/env/WebEnvironment.java b/web/src/main/java/org/apache/shiro/web/env/WebEnvironment.java
index e2899b79a..7f04416e6 100644
--- a/web/src/main/java/org/apache/shiro/web/env/WebEnvironment.java
+++ b/web/src/main/java/org/apache/shiro/web/env/WebEnvironment.java
@@ -23,7 +23,7 @@ import org.apache.shiro.web.config.ShiroFilterConfiguration;
import org.apache.shiro.web.filter.mgt.FilterChainResolver;
import org.apache.shiro.web.mgt.WebSecurityManager;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
/**
* A web-specific {@link Environment} instance, used in web applications.
diff --git a/web/src/main/java/org/apache/shiro/web/filter/AccessControlFilter.java b/web/src/main/java/org/apache/shiro/web/filter/AccessControlFilter.java
index e32134c6b..5b940b336 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/AccessControlFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/AccessControlFilter.java
@@ -22,14 +22,14 @@ import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.util.WebUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.IOException;
/**
* Superclass for any filter that controls access to a resource and may redirect the user to the login page
* if they are not authenticated. This superclass provides the method
- * {@link #saveRequestAndRedirectToLogin(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}
+ * {@link #saveRequestAndRedirectToLogin(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)}
* which is used by many subclasses as the behavior when a user is unauthenticated.
*
* @since 0.9
@@ -116,7 +116,7 @@ public abstract class AccessControlFilter extends PathMatchingFilter {
/**
* Processes requests where the subject was denied access as determined by the
- * {@link #isAccessAllowed(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Object) isAccessAllowed}
+ * {@link #isAccessAllowed(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Object) isAccessAllowed}
* method, retaining the {@code mappedValue} that was used during configuration.
* <p/>
* This method immediately delegates to {@link #onAccessDenied(ServletRequest, ServletResponse)} as a
@@ -136,7 +136,7 @@ public abstract class AccessControlFilter extends PathMatchingFilter {
/**
* Processes requests where the subject was denied access as determined by the
- * {@link #isAccessAllowed(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Object) isAccessAllowed}
+ * {@link #isAccessAllowed(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Object) isAccessAllowed}
* method.
*
* @param request the incoming <code>ServletRequest</code>
@@ -154,9 +154,9 @@ public abstract class AccessControlFilter extends PathMatchingFilter {
* {@link #onAccessDenied(ServletRequest, ServletResponse, Object) onAccessDenied(Request,Response,Object)}.
*
* @return <code>true</code> if
- * {@link #isAccessAllowed(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Object) isAccessAllowed},
+ * {@link #isAccessAllowed(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Object) isAccessAllowed},
* otherwise returns the result of
- * {@link #onAccessDenied(javax.servlet.ServletRequest, javax.servlet.ServletResponse) onAccessDenied}.
+ * {@link #onAccessDenied(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) onAccessDenied}.
* @throws Exception if an error occurs.
*/
public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
@@ -182,7 +182,7 @@ public abstract class AccessControlFilter extends PathMatchingFilter {
/**
* Convenience method for subclasses to use when a login redirect is required.
* <p/>
- * This implementation simply calls {@link #saveRequest(javax.servlet.ServletRequest) saveRequest(request)}
+ * This implementation simply calls {@link #saveRequest(jakarta.servlet.ServletRequest) saveRequest(request)}
* and then {@link #redirectToLogin(ServletRequest, ServletResponse) redirectToLogin(request,response)}.
*
* @param request the incoming <code>ServletRequest</code>
@@ -196,12 +196,12 @@ public abstract class AccessControlFilter extends PathMatchingFilter {
/**
* Convenience method merely delegates to
- * {@link WebUtils#saveRequest(javax.servlet.ServletRequest) WebUtils.saveRequest(request)} to save the request
+ * {@link WebUtils#saveRequest(jakarta.servlet.ServletRequest) WebUtils.saveRequest(request)} to save the request
* state for reuse later. This is mostly used to retain user request state when a redirect is issued to
* return the user to their originally requested url/resource.
* <p/>
* If you need to save and then immediately redirect the user to login, consider using
- * {@link #saveRequestAndRedirectToLogin(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
+ * {@link #saveRequestAndRedirectToLogin(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)
* saveRequestAndRedirectToLogin(request,response)} directly.
*
* @param request the incoming ServletRequest to save for re-use later (for example, after a redirect).
@@ -216,7 +216,7 @@ public abstract class AccessControlFilter extends PathMatchingFilter {
* <p/>
* <b>N.B.</b> If you want to issue a redirect with the intention of allowing the user to then return to their
* originally requested URL, don't use this method directly. Instead you should call
- * {@link #saveRequestAndRedirectToLogin(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
+ * {@link #saveRequestAndRedirectToLogin(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)
* saveRequestAndRedirectToLogin(request,response)}, which will save the current request state so that it can
* be reconstructed and reused after a successful login.
*
diff --git a/web/src/main/java/org/apache/shiro/web/filter/InvalidRequestFilter.java b/web/src/main/java/org/apache/shiro/web/filter/InvalidRequestFilter.java
index 2247b6634..59fa4963b 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/InvalidRequestFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/InvalidRequestFilter.java
@@ -22,10 +22,10 @@ package org.apache.shiro.web.filter;
import org.apache.shiro.lang.util.StringUtils;
import org.apache.shiro.web.util.WebUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/PathConfigProcessor.java b/web/src/main/java/org/apache/shiro/web/filter/PathConfigProcessor.java
index 7eae3150e..1c511e94f 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/PathConfigProcessor.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/PathConfigProcessor.java
@@ -18,7 +18,7 @@
*/
package org.apache.shiro.web.filter;
-import javax.servlet.Filter;
+import jakarta.servlet.Filter;
/**
* A PathConfigProcessor processes configuration entries on a per path (url) basis.
diff --git a/web/src/main/java/org/apache/shiro/web/filter/PathMatchingFilter.java b/web/src/main/java/org/apache/shiro/web/filter/PathMatchingFilter.java
index 0d252b57b..73d057ae2 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/PathMatchingFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/PathMatchingFilter.java
@@ -26,9 +26,9 @@ import org.owasp.encoder.Encode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.Filter;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.Filter;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -102,7 +102,7 @@ public abstract class PathMatchingFilter extends AdviceFilter implements PathCon
* Returns the context path within the application based on the specified <code>request</code>.
* <p/>
* This implementation merely delegates to
- * {@link WebUtils#getPathWithinApplication(javax.servlet.http.HttpServletRequest)
+ * {@link WebUtils#getPathWithinApplication(jakarta.servlet.http.HttpServletRequest)
* WebUtils.getPathWithinApplication(request)},
* but can be overridden by subclasses for custom logic.
*
@@ -172,15 +172,15 @@ public abstract class PathMatchingFilter extends AdviceFilter implements PathCon
/**
* Implementation that handles path-matching behavior before a request is evaluated. If the path matches and
* the filter
- * {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse, String, Object) isEnabled} for
+ * {@link #isEnabled(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, String, Object) isEnabled} for
* that path/config, the request will be allowed through via the result from
- * {@link #onPreHandle(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Object) onPreHandle}. If the
+ * {@link #onPreHandle(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Object) onPreHandle}. If the
* path does not match or the filter is not enabled for that path, this filter will allow passthrough immediately
* to allow the {@code FilterChain} to continue executing.
* <p/>
* In order to retain path-matching functionality, subclasses should not override this method if at all
* possible, and instead override
- * {@link #onPreHandle(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Object) onPreHandle} instead.
+ * {@link #onPreHandle(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Object) onPreHandle} instead.
*
* @param request the incoming ServletRequest
* @param response the outgoing ServletResponse
@@ -253,7 +253,7 @@ public abstract class PathMatchingFilter extends AdviceFilter implements PathCon
* @return {@code true} if the request should be able to continue, {@code false} if the filter will
* handle the response directly.
* @throws Exception if an error occurs
- * @see #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse, String, Object)
+ * @see #isEnabled(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, String, Object)
*/
protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return true;
@@ -262,12 +262,12 @@ public abstract class PathMatchingFilter extends AdviceFilter implements PathCon
@SuppressWarnings("UnusedParameters")
/**
* Path-matching version of the parent class's
- * {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse)} method, but additionally allows
+ * {@link #isEnabled(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)} method, but additionally allows
* for inspection of any path-specific configuration values corresponding to the specified request. Subclasses
* may wish to inspect this additional mapped configuration to determine if the filter is enabled or not.
* <p/>
* This method's default implementation ignores the {@code path} and {@code mappedValue} arguments and merely
- * returns the value from a call to {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}.
+ * returns the value from a call to {@link #isEnabled(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)}.
* It is expected that subclasses override this method if they need to perform enable/disable logic for a specific
* request based on any path-specific config for the filter instance.
*
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/AnonymousFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/AnonymousFilter.java
index 419a878d1..b7ff097ab 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/AnonymousFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/AnonymousFilter.java
@@ -20,8 +20,8 @@ package org.apache.shiro.web.filter.authc;
import org.apache.shiro.web.filter.PathMatchingFilter;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* Filter that allows access to a path immediately without performing security checks of any kind.
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/AuthenticatingFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/AuthenticatingFilter.java
index a56a76367..b69871d47 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/AuthenticatingFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/AuthenticatingFilter.java
@@ -24,9 +24,9 @@ import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.UnauthenticatedException;
import org.apache.shiro.subject.Subject;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.IOException;
import java.util.Arrays;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/AuthenticationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/AuthenticationFilter.java
index 33b1d4672..20a79fc2f 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/AuthenticationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/AuthenticationFilter.java
@@ -22,8 +22,8 @@ import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* Base class for all Filters that require the current user to be authenticated. This class encapsulates the
@@ -69,7 +69,7 @@ public abstract class AuthenticationFilter extends AccessControlFilter {
/**
* Determines whether the current subject is authenticated.
* <p/>
- * The default implementation {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) acquires}
+ * The default implementation {@link #getSubject(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) acquires}
* the currently executing Subject and then returns
* {@link org.apache.shiro.subject.Subject#isAuthenticated() subject.isAuthenticated()};
*
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/BasicHttpAuthenticationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/BasicHttpAuthenticationFilter.java
index d9243817f..97b1a2c3a 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/BasicHttpAuthenticationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/BasicHttpAuthenticationFilter.java
@@ -23,9 +23,9 @@ import org.apache.shiro.lang.codec.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
/**
@@ -48,7 +48,7 @@ import javax.servlet.http.HttpServletRequest;
* <li>The client then sends another request for the same resource with the following header:<br/>
* <p><code>Authorization: Basic <em>Base64_encoded_username_and_password</em></code></p></li>
* </ol>
- * The {@link #onAccessDenied(javax.servlet.ServletRequest, javax.servlet.ServletResponse)} method will
+ * The {@link #onAccessDenied(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)} method will
* only be called if the subject making the request is not
* {@link org.apache.shiro.subject.Subject#isAuthenticated() authenticated}
*
@@ -74,10 +74,11 @@ public class BasicHttpAuthenticationFilter extends HttpAuthenticationFilter {
* <p/>
* This implementation:
* <ol><li>acquires the username and password based on the request's
- * {@link #getAuthzHeader(javax.servlet.ServletRequest) authorization header} via the
- * {@link #getPrincipalsAndCredentials(String, javax.servlet.ServletRequest) getPrincipalsAndCredentials} method</li>
+ * {@link #getAuthzHeader(jakarta.servlet.ServletRequest) authorization header} via the
+ * {@link #getPrincipalsAndCredentials(String, jakarta.servlet.ServletRequest) getPrincipalsAndCredentials} method</li>
* <li>The return value of that method is converted to an <code>AuthenticationToken</code> via the
- * {@link #createToken(String, String, javax.servlet.ServletRequest, javax.servlet.ServletResponse) createToken} method</li>
+ * {@link #createToken(String, String, jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) createToken}
+ * method</li>
* <li>The created <code>AuthenticationToken</code> is returned.</li>
* </ol>
*
@@ -121,7 +122,7 @@ public class BasicHttpAuthenticationFilter extends HttpAuthenticationFilter {
* return decoded.split(":");</code>
*
* @param scheme the {@link #getAuthcScheme() authcScheme} found in the request
- * {@link #getAuthzHeader(javax.servlet.ServletRequest) authzHeader}. It is ignored by this implementation,
+ * {@link #getAuthzHeader(jakarta.servlet.ServletRequest) authzHeader}. It is ignored by this implementation,
* but available to overriding implementations should they find it useful.
* @param encoded the Base64-encoded username:password value found after the scheme in the header
* @return the username (index 0)/password (index 1) pair obtained from the encoded header data.
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/BearerHttpAuthenticationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/BearerHttpAuthenticationFilter.java
index 075ce524c..9229b294b 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/BearerHttpAuthenticationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/BearerHttpAuthenticationFilter.java
@@ -23,8 +23,8 @@ import org.apache.shiro.authc.AuthenticationToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/FormAuthenticationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/FormAuthenticationFilter.java
index ff2584ef3..d33804ba3 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/FormAuthenticationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/FormAuthenticationFilter.java
@@ -26,9 +26,9 @@ import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
/**
* Requires the requesting user to be authenticated for the request to continue, and if they are not, forces the user
@@ -39,7 +39,7 @@ import javax.servlet.http.HttpServletRequest;
* and {@link #setRememberMeParam(String) rememberMe} request parameters. It then calls
* {@link Subject#login(AuthenticationToken) Subject.login(usernamePasswordToken)},
* effectively automatically performing a login attempt. Note that the login attempt will only occur when the
- * {@link #isLoginSubmission(javax.servlet.ServletRequest, javax.servlet.ServletResponse) isLoginSubmission(request,response)}
+ * {@link #isLoginSubmission(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) isLoginSubmission(request,response)}
* is <code>true</code>, which by default occurs when the request is for the {@link #setLoginUrl(String) loginUrl} and
* is a POST request.
* <p/>
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/HttpAuthenticationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/HttpAuthenticationFilter.java
index 1a82d3a9e..a3dc53dc2 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/HttpAuthenticationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/HttpAuthenticationFilter.java
@@ -24,10 +24,10 @@ import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
@@ -79,7 +79,7 @@ abstract class HttpAuthenticationFilter extends AuthenticatingFilter {
*/
private String authzScheme;
- private boolean allowPreFlightRequests;
+ private boolean allowPreFlightRequests = true;
/**
* Returns the name to use in the ServletResponse's <b><code>WWW-Authenticate</code></b> header.
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/LogoutFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/LogoutFilter.java
index 46bc9a05b..7c3a06d24 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/LogoutFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/LogoutFilter.java
@@ -26,15 +26,15 @@ import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.Locale;
/**
* Simple Filter that, upon receiving a request, will immediately log-out the currently executing
- * {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) subject}
+ * {@link #getSubject(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) subject}
* and then redirect them to a configured {@link #getRedirectUrl() redirectUrl}.
*
* @since 1.2
@@ -62,9 +62,9 @@ public class LogoutFilter extends AdviceFilter {
private boolean postOnlyLogout;
/**
- * Acquires the currently executing {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) subject},
- * a potentially Subject or request-specific
- * {@link #getRedirectUrl(ServletRequest, ServletResponse, org.apache.shiro.subject.Subject) redirectUrl},
+ * Acquires the currently executing
+ * {@link #getSubject(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) subject}, a potentially Subject or
+ * request-specific {@link #getRedirectUrl(ServletRequest, ServletResponse, org.apache.shiro.subject.Subject) redirectUrl},
* and redirects the end-user to that redirect url.
*
* @param request the incoming ServletRequest
@@ -112,7 +112,7 @@ public class LogoutFilter extends AdviceFilter {
/**
* Issues an HTTP redirect to the specified URL after subject logout. This implementation simply calls
- * {@code WebUtils.}{@link WebUtils#issueRedirect(javax.servlet.ServletRequest, javax.servlet.ServletResponse, String)
+ * {@code WebUtils.}{@link WebUtils#issueRedirect(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, String)
* issueRedirect(request,response,redirectUrl)}.
*
* @param request the incoming Servlet request
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/NoAccessFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/NoAccessFilter.java
new file mode 100644
index 000000000..8d6e13afb
--- /dev/null
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/NoAccessFilter.java
@@ -0,0 +1,48 @@
+/*
+ * 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
+ * "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 org.apache.shiro.web.filter.authc;
+
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.web.util.WebUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+
+/**
+ * A request filter that redirects all traffic to a login page. This filter is used as a catch-all to block requests
+ * that do not match existing filter patterns.
+ */
+public class NoAccessFilter extends AuthenticatingFilter {
+
+ private final Logger log = LoggerFactory.getLogger(NoAccessFilter.class);
+
+ @Override
+ protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+ log.debug("Blocking access to request: '{}'", WebUtils.getPathWithinApplication(WebUtils.toHttp(request)));
+ saveRequestAndRedirectToLogin(request, response);
+ return false;
+ }
+
+ @Override
+ protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
+ return null;
+ }
+}
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/PassThruAuthenticationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/PassThruAuthenticationFilter.java
index 6aa9ea2be..520b6c661 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/PassThruAuthenticationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/PassThruAuthenticationFilter.java
@@ -20,8 +20,8 @@ package org.apache.shiro.web.filter.authc;
import org.apache.shiro.subject.Subject;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* An authentication filter that redirects the user to the login page when they are trying to access
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/UserFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authc/UserFilter.java
index 1c31fd198..40cc179cd 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/UserFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/UserFilter.java
@@ -21,15 +21,15 @@ package org.apache.shiro.web.filter.authc;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* Filter that allows access to resources if the accessor is a known user, which is defined as
* having a known principal. This means that any user who is authenticated or remembered via a
* 'remember me' feature will be allowed access from this filter.
* <p/>
- * If the accessor is not a known user, then they will be redirected to the {@link #setLoginUrl(String) loginUrl}</p>
+ * If the accessor is not a known user, then they will be redirected to the {@link #setLoginUrl(String) loginUrl}<p>
*
* @since 0.9
*/
@@ -37,13 +37,13 @@ public class UserFilter extends AccessControlFilter {
/**
* Returns <code>true</code> if the request is a
- * {@link #isLoginRequest(javax.servlet.ServletRequest, javax.servlet.ServletResponse) loginRequest} or
- * if the current {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) subject}
+ * {@link #isLoginRequest(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) loginRequest} or
+ * if the current {@link #getSubject(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) subject}
* is not <code>null</code>, <code>false</code> otherwise.
*
* @return <code>true</code> if the request is a
- * {@link #isLoginRequest(javax.servlet.ServletRequest, javax.servlet.ServletResponse) loginRequest} or
- * if the current {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) subject}
+ * {@link #isLoginRequest(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) loginRequest} or
+ * if the current {@link #getSubject(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) subject}
* is not <code>null</code>, <code>false</code> otherwise.
*/
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authc/package-info.java b/web/src/main/java/org/apache/shiro/web/filter/authc/package-info.java
index f94395d6b..f10f33ef0 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authc/package-info.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authc/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
/**
- * Servlet {@link javax.servlet.Filter Filter} implementations specific to controlling access based on a
+ * Servlet {@link jakarta.servlet.Filter Filter} implementations specific to controlling access based on a
* subject's authentication status, or those that can execute authentications (log-ins) directly.
*/
package org.apache.shiro.web.filter.authc;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/AuthorizationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authz/AuthorizationFilter.java
index 8d1a12706..50a16c60c 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/AuthorizationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/AuthorizationFilter.java
@@ -23,17 +23,17 @@ import org.apache.shiro.lang.util.StringUtils;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Superclass for authorization-related filters. If an request is unauthorized, response handling is delegated to the
- * {@link #onAccessDenied(javax.servlet.ServletRequest, javax.servlet.ServletResponse) onAccessDenied} method, which
+ * {@link #onAccessDenied(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) onAccessDenied} method, which
* provides reasonable handling for most applications.
*
- * @see #onAccessDenied(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
+ * @see #onAccessDenied(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)
* @since 0.9
*/
public abstract class AuthorizationFilter extends AccessControlFilter {
@@ -83,7 +83,7 @@ public abstract class AuthorizationFilter extends AccessControlFilter {
* <ul>
* <li>If the {@code Subject} is unknown<sup><a href="#known">[1]</a></sup>:
* <ol><li>The incoming request will be saved and they will be redirected to the login page for authentication
- * (via the {@link #saveRequestAndRedirectToLogin(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}
+ * (via the {@link #saveRequestAndRedirectToLogin(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)}
* method).</li>
* <li>Once successfully authenticated, they will be redirected back to the originally attempted page.</li></ol>
* </li>
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/HostFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authz/HostFilter.java
index 719117b37..17f1abbf2 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/HostFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/HostFilter.java
@@ -20,8 +20,8 @@ package org.apache.shiro.web.filter.authz;
import org.apache.shiro.lang.util.StringUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.util.regex.Pattern;
import java.util.Map;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/HttpMethodPermissionFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authz/HttpMethodPermissionFilter.java
index 0ba3b095f..82a2e28cf 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/HttpMethodPermissionFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/HttpMethodPermissionFilter.java
@@ -22,9 +22,9 @@ import org.apache.shiro.lang.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -169,7 +169,7 @@ public class HttpMethodPermissionFilter extends PermissionsAuthorizationFilter {
* Determines the action (verb) attempting to be performed on the filtered resource by the current request.
* <p/>
* This implementation expects the incoming request to be an {@link HttpServletRequest} and returns a mapped
- * action based on the HTTP request {@link javax.servlet.http.HttpServletRequest#getMethod() method}.
+ * action based on the HTTP request {@link jakarta.servlet.http.HttpServletRequest#getMethod() method}.
*
* @param request to pull the method from.
* @return The string equivalent verb of the http method.
@@ -232,7 +232,7 @@ public class HttpMethodPermissionFilter extends PermissionsAuthorizationFilter {
* </ol>
* per {@link org.apache.shiro.authz.permission.WildcardPermission WildcardPermission} conventions. Subclasses
* are of course free to override this method or the
- * {@link #buildPermissions(javax.servlet.http.HttpServletRequest, String[], String) buildPermissions} request
+ * {@link #buildPermissions(jakarta.servlet.http.HttpServletRequest, String[], String) buildPermissions} request
* variant for custom building logic or with different permission formats.
*
* @param configuredPerms list of configuredPerms to be converted.
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/IpFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authz/IpFilter.java
index 98acf783b..6c80d117b 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/IpFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/IpFilter.java
@@ -20,8 +20,8 @@ package org.apache.shiro.web.filter.authz;
import org.apache.shiro.lang.util.StringUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/PermissionsAuthorizationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authz/PermissionsAuthorizationFilter.java
index fb703fe41..9912c660d 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/PermissionsAuthorizationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/PermissionsAuthorizationFilter.java
@@ -19,8 +19,8 @@
package org.apache.shiro.web.filter.authz;
import java.io.IOException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import org.apache.shiro.subject.Subject;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/PortFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authz/PortFilter.java
index 3425c1c45..a5e708cc8 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/PortFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/PortFilter.java
@@ -22,9 +22,9 @@ import org.apache.shiro.config.ConfigurationException;
import org.apache.shiro.lang.util.StringUtils;
import org.apache.shiro.web.util.WebUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/RolesAuthorizationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authz/RolesAuthorizationFilter.java
index d0a6196ba..5aa4444e0 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/RolesAuthorizationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/RolesAuthorizationFilter.java
@@ -20,8 +20,8 @@ package org.apache.shiro.web.filter.authz;
import java.io.IOException;
import java.util.Set;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.CollectionUtils;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/SslFilter.java b/web/src/main/java/org/apache/shiro/web/filter/authz/SslFilter.java
index 3ca3133b3..4a1778041 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/SslFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/SslFilter.java
@@ -18,14 +18,14 @@
*/
package org.apache.shiro.web.filter.authz;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
/**
* Filter which requires a request to be over SSL. Access is allowed if the request is received on the configured
* server {@link #setPort(int) port} <em>and</em> the
- * {@code request.}{@link javax.servlet.ServletRequest#isSecure() isSecure()}. If either condition is {@code false},
+ * {@code request.}{@link jakarta.servlet.ServletRequest#isSecure() isSecure()}. If either condition is {@code false},
* the filter chain will not continue.
* <p/>
* The {@link #getPort() port} property defaults to {@code 443} and also additionally guarantees that the
@@ -35,13 +35,13 @@ import javax.servlet.http.HttpServletResponse;
* This feature is opt-in and disabled by default. If enabled HSTS
* will prevent <b>any</b> communications from being sent over HTTP to the
* specified domain and will instead send all communications over HTTPS.
- * </p>
+ * <p/>
* The {@link #getMaxAge() maxAge} property defaults {@code 31536000}, and
* {@link #isIncludeSubDomains includeSubDomains} is {@code false}.
- * </p>
+ * <p>
* <b>Warning:</b> Use this setting with care and only if you plan to enable
* SSL on every path.
- * </p>
+ * <p>
* Example configs:
* <pre>
* [urls]
@@ -90,7 +90,7 @@ public class SslFilter extends PortFilter {
/**
* Retains the parent method's port-matching behavior but additionally guarantees that the
- * {@code ServletRequest.}{@link javax.servlet.ServletRequest#isSecure() isSecure()}. If the port does not match or
+ * {@code ServletRequest.}{@link jakarta.servlet.ServletRequest#isSecure() isSecure()}. If the port does not match or
* the request is not secure, access is denied.
*
* @param request the incoming {@code ServletRequest}
@@ -98,7 +98,7 @@ public class SslFilter extends PortFilter {
* @param mappedValue the filter-specific config value mapped to this filter in the URL rules mappings
* - ignored by this implementation.
* @return {@code true} if the request is received on an expected SSL port and the
- * {@code request.}{@link javax.servlet.ServletRequest#isSecure() isSecure()}, {@code false} otherwise.
+ * {@code request.}{@link jakarta.servlet.ServletRequest#isSecure() isSecure()}, {@code false} otherwise.
* @throws Exception if the call to {@code super.isAccessAllowed} throws an exception.
* @since 1.2
*/
diff --git a/web/src/main/java/org/apache/shiro/web/filter/authz/package-info.java b/web/src/main/java/org/apache/shiro/web/filter/authz/package-info.java
index 580671a03..13630f130 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/authz/package-info.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/authz/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
/**
- * Servlet {@link javax.servlet.Filter Filter} implementations that perform authorization (access control)
+ * Servlet {@link jakarta.servlet.Filter Filter} implementations that perform authorization (access control)
* checks based on the Subject's abilities (for example, role or permission checks).
*/
package org.apache.shiro.web.filter.authz;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/mgt/DefaultFilter.java b/web/src/main/java/org/apache/shiro/web/filter/mgt/DefaultFilter.java
index 5c5d5991a..2921bba2a 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/mgt/DefaultFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/mgt/DefaultFilter.java
@@ -25,6 +25,7 @@ import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
import org.apache.shiro.web.filter.authc.BearerHttpAuthenticationFilter;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.filter.authc.LogoutFilter;
+import org.apache.shiro.web.filter.authc.NoAccessFilter;
import org.apache.shiro.web.filter.authc.UserFilter;
import org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter;
import org.apache.shiro.web.filter.authz.IpFilter;
@@ -34,9 +35,9 @@ import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;
import org.apache.shiro.web.filter.authz.SslFilter;
import org.apache.shiro.web.filter.session.NoSessionCreationFilter;
-import javax.servlet.Filter;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -112,11 +113,14 @@ public enum DefaultFilter {
* user filter.
*/
user(UserFilter.class),
-
/**
* invalid request filter.
*/
- invalidRequest(InvalidRequestFilter.class);
+ invalidRequest(InvalidRequestFilter.class),
+ /**
+ * no access filter.
+ */
+ noAccess(NoAccessFilter.class);
private final Class<? extends Filter> filterClass;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/mgt/DefaultFilterChainManager.java b/web/src/main/java/org/apache/shiro/web/filter/mgt/DefaultFilterChainManager.java
index 00443da6b..ae679e8d4 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/mgt/DefaultFilterChainManager.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/mgt/DefaultFilterChainManager.java
@@ -26,10 +26,10 @@ import org.apache.shiro.web.filter.PathConfigProcessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
@@ -59,7 +59,7 @@ public class DefaultFilterChainManager implements FilterChainManager {
/**
* list of filters to prepend to every chain
*/
- private List<String> globalFilterNames;
+ private final List<String> globalFilterNames;
/**
* key: chain name, value: chain
@@ -136,12 +136,11 @@ public class DefaultFilterChainManager implements FilterChainManager {
addFilter(name, filter, init, true);
}
- public void createDefaultChain(String chainName) {
+ public void createDefaultChain(String chainName, String chainDefinition) {
// only create the defaultChain if we don't have a chain with this name already
// (the global filters will already be in that chain)
- if (!getChainNames().contains(chainName) && !CollectionUtils.isEmpty(globalFilterNames)) {
- // add each of global filters
- globalFilterNames.stream().forEach(filterName -> addToChain(chainName, filterName));
+ if (!getChainNames().contains(chainName)) {
+ createChain(chainName, chainDefinition);
}
}
@@ -161,7 +160,7 @@ public class DefaultFilterChainManager implements FilterChainManager {
// first add each of global filters
if (!CollectionUtils.isEmpty(globalFilterNames)) {
- globalFilterNames.stream().forEach(filterName -> addToChain(chainName, filterName));
+ globalFilterNames.forEach(filterName -> addToChain(chainName, filterName));
}
//parse the value by tokenizing it to get the resulting filter-specific config entries
@@ -281,8 +280,8 @@ public class DefaultFilterChainManager implements FilterChainManager {
protected void addFilter(String name, Filter filter, boolean init, boolean overwrite) {
Filter existing = getFilter(name);
if (existing == null || overwrite) {
- if (filter instanceof Nameable) {
- ((Nameable) filter).setName(name);
+ if (filter instanceof Nameable nameable) {
+ nameable.setName(name);
}
if (init) {
initFilter(filter);
@@ -312,6 +311,10 @@ public class DefaultFilterChainManager implements FilterChainManager {
chain.add(filter);
}
+ public List<String> getGlobalFilterNames() {
+ return List.copyOf(globalFilterNames);
+ }
+
public void setGlobalFilters(List<String> globalFilterNames) throws ConfigurationException {
// validate each filter name
if (!CollectionUtils.isEmpty(globalFilterNames)) {
@@ -332,9 +335,9 @@ public class DefaultFilterChainManager implements FilterChainManager {
LOGGER.debug("Attempting to apply path [" + chainName + "] to filter [" + filter + "] "
+ "with config [" + chainSpecificFilterConfig + "]");
}
- if (filter instanceof PathConfigProcessor) {
- ((PathConfigProcessor) filter).processPathConfig(chainName, chainSpecificFilterConfig);
- ((PathConfigProcessor) filter).setCaseInsensitive(caseInsensitive);
+ if (filter instanceof PathConfigProcessor processor) {
+ processor.processPathConfig(chainName, chainSpecificFilterConfig);
+ processor.setCaseInsensitive(caseInsensitive);
} else {
if (StringUtils.hasText(chainSpecificFilterConfig)) {
//they specified a filter configuration, but the Filter doesn't implement PathConfigProcessor
diff --git a/web/src/main/java/org/apache/shiro/web/filter/mgt/FilterChainManager.java b/web/src/main/java/org/apache/shiro/web/filter/mgt/FilterChainManager.java
index fa57fa767..5885a899b 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/mgt/FilterChainManager.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/mgt/FilterChainManager.java
@@ -21,8 +21,8 @@ package org.apache.shiro.web.filter.mgt;
import org.apache.shiro.config.ConfigurationException;
import org.apache.shiro.util.AntPathMatcher;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -85,7 +85,7 @@ public interface FilterChainManager {
* {@link #addToChain(String, String, String) creating filter chains}.
* <p/>
* Calling this method is effectively the same as calling
- * <code>{@link #addFilter(String, javax.servlet.Filter, boolean) addFilter}(name, filter, <b>false</b>);</code>
+ * <code>{@link #addFilter(String, jakarta.servlet.Filter, boolean) addFilter}(name, filter, <b>false</b>);</code>
*
* @param name the name to assign to the filter, used to reference the filter in chain definitions
* @param filter the filter to initialize and then add to the pool of available filters that can be used
@@ -99,7 +99,7 @@ public interface FilterChainManager {
* @param name the name to assign to the filter, used to reference the filter in chain definitions
* @param filter the filter to assign to the filter pool
* @param init whether or not the {@code Filter} should be
- * {@link Filter#init(javax.servlet.FilterConfig) initialized} first before being added to the pool.
+ * {@link Filter#init(jakarta.servlet.FilterConfig) initialized} first before being added to the pool.
*/
void addFilter(String name, Filter filter, boolean init);
@@ -121,7 +121,7 @@ public interface FilterChainManager {
* where
* <ol>
* <li>{@code filterN} is the name of a filter previously
- * {@link #addFilter(String, javax.servlet.Filter) registered} with the manager, and</li>
+ * {@link #addFilter(String, jakarta.servlet.Filter) registered} with the manager, and</li>
* <li>{@code [optional_configN]} is an optional bracketed string that has meaning for that particular filter for
* <em>this particular chain</em></li>
* </ol>
@@ -168,13 +168,23 @@ public interface FilterChainManager {
/**
* Creates a chain that should match any non-matched request paths,
- * typically {@code /**} assuming an {@link AntPathMatcher} I used.
+ * typically assuming an {@link AntPathMatcher} is used.
*
* @param chainName The name of the chain to create, likely {@code /**}.
* @see AntPathMatcher AntPathMatcher
* @since 1.6
*/
- void createDefaultChain(String chainName);
+ void createDefaultChain(String chainName, String chainDefinition);
+
+ /**
+ * @since 1.6
+ * @deprecated use {@link FilterChainManager#createDefaultChain(String, String)} instead.
+ * @see AntPathMatcher AntPathMatcher
+ */
+ @Deprecated
+ default void createDefaultChain(String chainName) {
+ createDefaultChain(chainName, DefaultFilter.noAccess.name());
+ }
/**
* Adds (appends) a filter to the filter chain identified by the given {@code chainName}. If there is no chain
@@ -182,7 +192,7 @@ public interface FilterChainManager {
*
* @param chainName the name of the chain where the filter will be appended.
* @param filterName the name of the {@link #addFilter registered} filter to add to the chain.
- * @throws IllegalArgumentException if there is not a {@link #addFilter(String, javax.servlet.Filter) registered}
+ * @throws IllegalArgumentException if there is not a {@link #addFilter(String, jakarta.servlet.Filter) registered}
* filter under the given {@code filterName}
*/
void addToChain(String chainName, String filterName);
@@ -199,7 +209,7 @@ public interface FilterChainManager {
* @param filterName the name of the {@link #addFilter registered} filter to add to the chain.
* @param chainSpecificFilterConfig the filter-specific configuration that should be applied for only the specified
* filter chain.
- * @throws IllegalArgumentException if there is not a {@link #addFilter(String, javax.servlet.Filter) registered}
+ * @throws IllegalArgumentException if there is not a {@link #addFilter(String, jakarta.servlet.Filter) registered}
* filter under the given {@code filterName}
* @throws ConfigurationException if the filter is not capable of accepting {@code chainSpecificFilterConfig}
* (usually such filters implement the
diff --git a/web/src/main/java/org/apache/shiro/web/filter/mgt/FilterChainResolver.java b/web/src/main/java/org/apache/shiro/web/filter/mgt/FilterChainResolver.java
index b53e59c1f..9b465418f 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/mgt/FilterChainResolver.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/mgt/FilterChainResolver.java
@@ -18,9 +18,9 @@
*/
package org.apache.shiro.web.filter.mgt;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* A {@code FilterChainResolver} can resolve an appropriate {@link FilterChain} to execute during a
@@ -40,7 +40,7 @@ public interface FilterChainResolver {
* Returns the filter chain that should be executed for the given request, or {@code null} if the
* original chain should be used.
* <p/>
- * This method allows a implementation to define arbitrary security {@link javax.servlet.Filter Filter}
+ * This method allows a implementation to define arbitrary security {@link jakarta.servlet.Filter Filter}
* chains for any given request or URL pattern.
*
* @param request the incoming ServletRequest
diff --git a/web/src/main/java/org/apache/shiro/web/filter/mgt/NamedFilterList.java b/web/src/main/java/org/apache/shiro/web/filter/mgt/NamedFilterList.java
index e13096bb0..3296fb52a 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/mgt/NamedFilterList.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/mgt/NamedFilterList.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.filter.mgt;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
import java.util.List;
/**
diff --git a/web/src/main/java/org/apache/shiro/web/filter/mgt/PathMatchingFilterChainResolver.java b/web/src/main/java/org/apache/shiro/web/filter/mgt/PathMatchingFilterChainResolver.java
index 11c15ebe0..4a6fbe10a 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/mgt/PathMatchingFilterChainResolver.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/mgt/PathMatchingFilterChainResolver.java
@@ -25,10 +25,10 @@ import org.owasp.encoder.Encode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* A {@code FilterChainResolver} that resolves {@link FilterChain}s based on url path
@@ -176,7 +176,7 @@ public class PathMatchingFilterChainResolver implements FilterChainResolver {
/**
* Merely returns
- * <code>WebUtils.{@link org.apache.shiro.web.util.WebUtils#getPathWithinApplication(javax.servlet.http.HttpServletRequest)
+ * <code>WebUtils.{@link org.apache.shiro.web.util.WebUtils#getPathWithinApplication(jakarta.servlet.http.HttpServletRequest)
* getPathWithinApplication(request)}</code>
* and can be overridden by subclasses for custom request-to-application-path resolution behavior.
*
diff --git a/web/src/main/java/org/apache/shiro/web/filter/mgt/SimpleNamedFilterList.java b/web/src/main/java/org/apache/shiro/web/filter/mgt/SimpleNamedFilterList.java
index 7592f9658..bcfb2e063 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/mgt/SimpleNamedFilterList.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/mgt/SimpleNamedFilterList.java
@@ -21,8 +21,8 @@ package org.apache.shiro.web.filter.mgt;
import org.apache.shiro.lang.util.StringUtils;
import org.apache.shiro.web.servlet.ProxiedFilterChain;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/package-info.java b/web/src/main/java/org/apache/shiro/web/filter/package-info.java
index 47e713446..447441d65 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/package-info.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
/**
- * Base package supporting all Servlet {@link javax.servlet.Filter Filter} implementations used to control
+ * Base package supporting all Servlet {@link jakarta.servlet.Filter Filter} implementations used to control
* access to web pages and URL resources.
*/
package org.apache.shiro.web.filter;
diff --git a/web/src/main/java/org/apache/shiro/web/filter/session/NoSessionCreationFilter.java b/web/src/main/java/org/apache/shiro/web/filter/session/NoSessionCreationFilter.java
index 086804aa2..7d50190c8 100644
--- a/web/src/main/java/org/apache/shiro/web/filter/session/NoSessionCreationFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/filter/session/NoSessionCreationFilter.java
@@ -21,8 +21,8 @@ package org.apache.shiro.web.filter.session;
import org.apache.shiro.subject.support.DefaultSubjectContext;
import org.apache.shiro.web.filter.PathMatchingFilter;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* A {@code PathMatchingFilter} that will disable creating new Sessions during the request. This is a useful
diff --git a/web/src/main/java/org/apache/shiro/web/mgt/CookieRememberMeManager.java b/web/src/main/java/org/apache/shiro/web/mgt/CookieRememberMeManager.java
index cc50bd95c..8f83b432d 100644
--- a/web/src/main/java/org/apache/shiro/web/mgt/CookieRememberMeManager.java
+++ b/web/src/main/java/org/apache/shiro/web/mgt/CookieRememberMeManager.java
@@ -33,9 +33,9 @@ import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import static org.apache.shiro.session.mgt.DefaultSessionManager.SECURE_COOKIE_DISABLED;
diff --git a/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSecurityManager.java b/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSecurityManager.java
index a5f6ef246..b9ae51486 100644
--- a/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSecurityManager.java
+++ b/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSecurityManager.java
@@ -44,8 +44,8 @@ import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.Serializable;
import java.util.Collection;
import java.util.function.Supplier;
@@ -129,18 +129,18 @@ public class DefaultWebSecurityManager extends DefaultSecurityManager implements
//since 1.2.1 for fixing SHIRO-350:
private void applySessionManagerToSessionStorageEvaluatorIfPossible() {
SubjectDAO subjectDAO = getSubjectDAO();
- if (subjectDAO instanceof DefaultSubjectDAO) {
- SessionStorageEvaluator evaluator = ((DefaultSubjectDAO) subjectDAO).getSessionStorageEvaluator();
- if (evaluator instanceof DefaultWebSessionStorageEvaluator) {
- ((DefaultWebSessionStorageEvaluator) evaluator).setSessionManager(getSessionManager());
+ if (subjectDAO instanceof DefaultSubjectDAO defaultSubjectDAO) {
+ SessionStorageEvaluator evaluator = defaultSubjectDAO.getSessionStorageEvaluator();
+ if (evaluator instanceof DefaultWebSessionStorageEvaluator storageEvaluator) {
+ storageEvaluator.setSessionManager(getSessionManager());
}
}
}
@Override
protected SubjectContext copy(SubjectContext subjectContext) {
- if (subjectContext instanceof WebSubjectContext) {
- return new DefaultWebSubjectContext((WebSubjectContext) subjectContext);
+ if (subjectContext instanceof WebSubjectContext context) {
+ return new DefaultWebSubjectContext(context);
}
return super.copy(subjectContext);
}
@@ -208,7 +208,7 @@ public class DefaultWebSecurityManager extends DefaultSecurityManager implements
*/
public boolean isHttpSessionMode() {
SessionManager sessionManager = getSessionManager();
- return sessionManager instanceof WebSessionManager && ((WebSessionManager) sessionManager).isServletContainerSessions();
+ return sessionManager instanceof WebSessionManager wsm && wsm.isServletContainerSessions();
}
protected SessionManager createSessionManager(String sessionMode) {
@@ -224,8 +224,7 @@ public class DefaultWebSecurityManager extends DefaultSecurityManager implements
@Override
protected SessionContext createSessionContext(SubjectContext subjectContext) {
SessionContext sessionContext = super.createSessionContext(subjectContext);
- if (subjectContext instanceof WebSubjectContext) {
- WebSubjectContext wsc = (WebSubjectContext) subjectContext;
+ if (subjectContext instanceof WebSubjectContext wsc) {
ServletRequest request = wsc.resolveServletRequest();
ServletResponse response = wsc.resolveServletResponse();
DefaultWebSessionContext webSessionContext = new DefaultWebSessionContext(sessionContext);
@@ -273,8 +272,7 @@ public class DefaultWebSecurityManager extends DefaultSecurityManager implements
}
protected void removeRequestIdentity(Subject subject) {
- if (subject instanceof WebSubject) {
- WebSubject webSubject = (WebSubject) subject;
+ if (subject instanceof WebSubject webSubject) {
ServletRequest request = webSubject.getServletRequest();
if (request != null) {
request.setAttribute(ShiroHttpServletRequest.IDENTITY_REMOVED_KEY, Boolean.TRUE);
diff --git a/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSessionStorageEvaluator.java b/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSessionStorageEvaluator.java
index 367179fb9..4be330900 100644
--- a/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSessionStorageEvaluator.java
+++ b/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSessionStorageEvaluator.java
@@ -33,7 +33,7 @@ import org.apache.shiro.web.util.WebUtils;
* This implementation usually works in conjunction with the
* {@link org.apache.shiro.web.filter.session.NoSessionCreationFilter}: If the {@code NoSessionCreationFilter}
* is configured in a filter chain, that filter will set a specific
- * {@code ServletRequest} {@link javax.servlet.ServletRequest#setAttribute attribute} indicating that session creation
+ * {@code ServletRequest} {@link jakarta.servlet.ServletRequest#setAttribute attribute} indicating that session creation
* should be disabled.
* <p/>
* This {@code DefaultWebSessionStorageEvaluator} will then inspect this attribute, and if it has been set, will return
diff --git a/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSubjectFactory.java b/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSubjectFactory.java
index 3c8fc06e0..a355c0030 100644
--- a/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSubjectFactory.java
+++ b/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSubjectFactory.java
@@ -27,8 +27,8 @@ import org.apache.shiro.subject.SubjectContext;
import org.apache.shiro.web.subject.WebSubjectContext;
import org.apache.shiro.web.subject.support.WebDelegatingSubject;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import org.apache.shiro.web.subject.WebSubject;
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/AbstractFilter.java b/web/src/main/java/org/apache/shiro/web/servlet/AbstractFilter.java
index 17d781bc3..a197e3682 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/AbstractFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/AbstractFilter.java
@@ -22,15 +22,15 @@ import org.apache.shiro.lang.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.Filter;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
/**
* Base abstract Filter simplifying Filter initialization and {@link #getInitParam(String) access} to init parameters.
* Subclass initialization logic should be performed by overriding the {@link #onFilterConfigSet()} template method.
* FilterChain execution logic (the
- * {@link #doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)} method
+ * {@link #doFilter(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, jakarta.servlet.FilterChain)} method
* is left to subclasses.
*
* @since 1.0
@@ -46,7 +46,7 @@ public abstract class AbstractFilter extends ServletContextSupport implements Fi
/**
* Returns the servlet container specified {@code FilterConfig} instance provided at
- * {@link #init(javax.servlet.FilterConfig) startup}.
+ * {@link #init(jakarta.servlet.FilterConfig) startup}.
*
* @return the servlet container specified {@code FilterConfig} instance provided at start-up.
*/
@@ -89,15 +89,15 @@ public abstract class AbstractFilter extends ServletContextSupport implements Fi
* {@link #onFilterConfigSet() onFilterConfigSet()} to trigger any processing a subclass might wish to perform.
*
* @param filterConfig the servlet container supplied FilterConfig instance.
- * @throws javax.servlet.ServletException if {@link #onFilterConfigSet() onFilterConfigSet()} throws an Exception.
+ * @throws jakarta.servlet.ServletException if {@link #onFilterConfigSet() onFilterConfigSet()} throws an Exception.
*/
public final void init(FilterConfig filterConfig) throws ServletException {
setFilterConfig(filterConfig);
try {
onFilterConfigSet();
} catch (Exception e) {
- if (e instanceof ServletException) {
- throw (ServletException) e;
+ if (e instanceof ServletException exception) {
+ throw exception;
} else {
if (LOGGER.isErrorEnabled()) {
LOGGER.error("Unable to start Filter: [" + e.getMessage() + "].", e);
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java b/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java
index de4a6c67a..975f81a69 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/AbstractShiroFilter.java
@@ -30,12 +30,12 @@ import org.apache.shiro.web.subject.WebSubject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.Callable;
@@ -230,7 +230,7 @@ public abstract class AbstractShiroFilter extends OncePerRequestFilter {
* processing.
* <p/>
* If the {@code ServletRequest} is an instance of {@link HttpServletRequest}, the value returned from this method
- * is obtained by calling {@link #wrapServletRequest(javax.servlet.http.HttpServletRequest)} to allow Shiro-specific
+ * is obtained by calling {@link #wrapServletRequest(jakarta.servlet.http.HttpServletRequest)} to allow Shiro-specific
* HTTP behavior, otherwise the original {@code ServletRequest} argument is returned.
*
* @param request the incoming ServletRequest
@@ -242,8 +242,7 @@ public abstract class AbstractShiroFilter extends OncePerRequestFilter {
@SuppressWarnings({"UnusedDeclaration"})
protected ServletRequest prepareServletRequest(ServletRequest request, ServletResponse response, FilterChain chain) {
ServletRequest toUse = request;
- if (request instanceof HttpServletRequest) {
- HttpServletRequest http = (HttpServletRequest) request;
+ if (request instanceof HttpServletRequest http) {
toUse = wrapServletRequest(http);
}
return toUse;
@@ -267,7 +266,7 @@ public abstract class AbstractShiroFilter extends OncePerRequestFilter {
* Prepares the {@code ServletResponse} instance that will be passed to the {@code FilterChain} for request
* processing.
* <p/>
- * This implementation delegates to {@link #wrapServletRequest(javax.servlet.http.HttpServletRequest)}
+ * This implementation delegates to {@link #wrapServletRequest(jakarta.servlet.http.HttpServletRequest)}
* only if Shiro-based sessions are enabled (that is, !{@link #isHttpSessions()}) and the request instance is a
* {@link ShiroHttpServletRequest}. This ensures that any URL rewriting that occurs is handled correctly using the
* Shiro-managed Session's sessionId and not a servlet container session ID.
@@ -284,11 +283,11 @@ public abstract class AbstractShiroFilter extends OncePerRequestFilter {
@SuppressWarnings({"UnusedDeclaration"})
protected ServletResponse prepareServletResponse(ServletRequest request, ServletResponse response, FilterChain chain) {
ServletResponse toUse = response;
- if (!isHttpSessions() && (request instanceof ShiroHttpServletRequest)
- && (response instanceof HttpServletResponse)) {
+ if (!isHttpSessions() && (request instanceof ShiroHttpServletRequest servletRequest)
+ && (response instanceof HttpServletResponse servletResponse)) {
//the ShiroHttpServletResponse exists to support URL rewriting for session ids. This is only needed if
//using Shiro sessions (i.e. not simple HttpSession based sessions):
- toUse = wrapServletResponse((HttpServletResponse) response, (ShiroHttpServletRequest) request);
+ toUse = wrapServletResponse(servletResponse, servletRequest);
}
return toUse;
}
@@ -345,11 +344,11 @@ public abstract class AbstractShiroFilter extends OncePerRequestFilter {
* the incoming {@code ServletRequest} for use during Shiro's processing</li>
* <li>{@link #prepareServletResponse(ServletRequest, ServletResponse, FilterChain) Prepares}
* the outgoing {@code ServletResponse} for use during Shiro's processing</li>
- * <li> {@link #createSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) Creates} a
+ * <li> {@link #createSubject(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) Creates} a
* {@link Subject} instance based on the specified request/response pair.</li>
* <li>Finally {@link Subject#execute(Runnable) executes} the
- * {@link #updateSessionLastAccessTime(javax.servlet.ServletRequest, javax.servlet.ServletResponse)} and
- * {@link #executeChain(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)}
+ * {@link #updateSessionLastAccessTime(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)} and
+ * {@link #executeChain(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, jakarta.servlet.FilterChain)}
* methods</li>
* </ol>
* <p/>
@@ -360,7 +359,7 @@ public abstract class AbstractShiroFilter extends OncePerRequestFilter {
* @param servletResponse the outgoing {@code ServletResponse}
* @param chain the container-provided {@code FilterChain} to execute
* @throws IOException if an IO error occurs
- * @throws javax.servlet.ServletException if a Throwable other than an IOException
+ * @throws jakarta.servlet.ServletException if a Throwable other than an IOException
*/
protected void doFilterInternal(ServletRequest servletRequest, ServletResponse servletResponse, final FilterChain chain)
throws ServletException, IOException {
@@ -385,11 +384,11 @@ public abstract class AbstractShiroFilter extends OncePerRequestFilter {
}
if (t != null) {
- if (t instanceof ServletException) {
- throw (ServletException) t;
+ if (t instanceof ServletException exception) {
+ throw exception;
}
- if (t instanceof IOException) {
- throw (IOException) t;
+ if (t instanceof IOException exception) {
+ throw exception;
}
//otherwise it's not one of the two exceptions expected by the filter method signature - wrap it in one:
String msg = "Filtered request failed.";
@@ -440,7 +439,8 @@ public abstract class AbstractShiroFilter extends OncePerRequestFilter {
* Executes a {@link FilterChain} for the given request.
* <p/>
* This implementation first delegates to
- * <code>{@link #getExecutionChain(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
+ * <code>
+ * {@link #getExecutionChain(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, jakarta.servlet.FilterChain)
* getExecutionChain}</code>
* to allow the application's Shiro configuration to determine exactly how the chain should execute. The resulting
* value from that call is then executed directly by calling the returned {@code FilterChain}'s
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/AdviceFilter.java b/web/src/main/java/org/apache/shiro/web/servlet/AdviceFilter.java
index 0f7e6b509..362212068 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/AdviceFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/AdviceFilter.java
@@ -21,17 +21,17 @@ package org.apache.shiro.web.servlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.IOException;
/**
* A Servlet Filter that enables AOP-style "around" advice for a ServletRequest via
- * {@link #preHandle(javax.servlet.ServletRequest, javax.servlet.ServletResponse) preHandle},
- * {@link #postHandle(javax.servlet.ServletRequest, javax.servlet.ServletResponse) postHandle},
- * and {@link #afterCompletion(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Exception) afterCompletion}
+ * {@link #preHandle(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) preHandle},
+ * {@link #postHandle(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) postHandle},
+ * and {@link #afterCompletion(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Exception) afterCompletion}
* hooks.
*
* @since 0.9
@@ -62,7 +62,7 @@ public abstract class AdviceFilter extends OncePerRequestFilter {
* Allows 'post' advice logic to be called, but only if no exception occurs during filter chain execution. That
* is, if {@link #executeChain executeChain} throws an exception, this method will never be called. Be aware of
* this when implementing logic. Most resource 'cleanup' behavior is often done in the
- * {@link #afterCompletion(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Exception)
+ * {@link #afterCompletion(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Exception)
* afterCompletion(request,response,exception)}
* implementation, which is guaranteed to be called for every request, even when the chain processing throws
* an Exception.
@@ -111,9 +111,9 @@ public abstract class AdviceFilter extends OncePerRequestFilter {
/**
* Actually implements the chain execution logic, utilizing
- * {@link #preHandle(javax.servlet.ServletRequest, javax.servlet.ServletResponse) pre},
- * {@link #postHandle(javax.servlet.ServletRequest, javax.servlet.ServletResponse) post}, and
- * {@link #afterCompletion(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Exception) after}
+ * {@link #preHandle(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) pre},
+ * {@link #postHandle(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) post}, and
+ * {@link #afterCompletion(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Exception) after}
* advice hooks.
*
* @param request the incoming ServletRequest
@@ -152,12 +152,12 @@ public abstract class AdviceFilter extends OncePerRequestFilter {
/**
* Executes cleanup logic in the {@code finally} code block in the
- * {@link #doFilterInternal(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
+ * {@link #doFilterInternal(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, jakarta.servlet.FilterChain)
* doFilterInternal(request, response, filterChain)}
* implementation.
* <p/>
* This implementation specifically calls
- * {@link #afterCompletion(javax.servlet.ServletRequest, javax.servlet.ServletResponse, Exception) afterCompletion}
+ * {@link #afterCompletion(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, Exception) afterCompletion}
* as well as handles any exceptions properly.
*
* @param request the incoming {@code ServletRequest}
@@ -184,10 +184,10 @@ public abstract class AdviceFilter extends OncePerRequestFilter {
}
}
if (exception != null) {
- if (exception instanceof ServletException) {
- throw (ServletException) exception;
- } else if (exception instanceof IOException) {
- throw (IOException) exception;
+ if (exception instanceof ServletException servletException) {
+ throw servletException;
+ } else if (exception instanceof IOException oException) {
+ throw oException;
} else {
if (LOGGER.isDebugEnabled()) {
String msg = "Filter execution resulted in an unexpected Exception "
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/Cookie.java b/web/src/main/java/org/apache/shiro/web/servlet/Cookie.java
index 8a333e356..17c710e42 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/Cookie.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/Cookie.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.servlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
/**
* Interface representing HTTP cookie operations, supporting pojo-style getters and setters for all
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/IniShiroFilter.java b/web/src/main/java/org/apache/shiro/web/servlet/IniShiroFilter.java
index 51fccca67..0a604fb53 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/IniShiroFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/IniShiroFilter.java
@@ -74,7 +74,7 @@ import java.util.Map;
* </filter>
* </pre>
* Unqualified (schemeless or 'non-prefixed') paths are assumed to be {@code ServletContext} resource paths, resolvable
- * via {@link javax.servlet.ServletContext#getResourceAsStream(String) ServletContext#getResourceAsStream}.
+ * via {@link jakarta.servlet.ServletContext#getResourceAsStream(String) ServletContext#getResourceAsStream}.
* <p/>
* Non-ServletContext resources may be loaded from qualified locations by specifying prefixes indicating the source,
* e.g. {@code file:}, {@code url:}, and {@code classpath:}. See the
@@ -337,7 +337,7 @@ public class IniShiroFilter extends AbstractShiroFilter {
* <p/>
* If the path does not have a resource prefix as defined by {@link ResourceUtils#hasResourcePrefix(String)}, the
* path is expected to be resolvable by the {@code ServletContext} via
- * {@link javax.servlet.ServletContext#getResourceAsStream(String)}.
+ * {@link jakarta.servlet.ServletContext#getResourceAsStream(String)}.
*
* @param path the path of the INI resource to load into an INI instance.
* @return an INI instance populated based on the given INI resource path.
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/NameableFilter.java b/web/src/main/java/org/apache/shiro/web/servlet/NameableFilter.java
index c8d503c2e..e683f6866 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/NameableFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/NameableFilter.java
@@ -20,13 +20,13 @@ package org.apache.shiro.web.servlet;
import org.apache.shiro.lang.util.Nameable;
-import javax.servlet.FilterConfig;
+import jakarta.servlet.FilterConfig;
/**
* Allows a filter to be named via JavaBeans-compatible
* {@link #getName()}/{@link #setName(String)} methods. If no name is specified, the name of the filter will
* default to the name given to it in {@code web.xml} (the {@code FilterConfig}'s
- * {@link javax.servlet.FilterConfig#getFilterName() filterName}).
+ * {@link jakarta.servlet.FilterConfig#getFilterName() filterName}).
*
* @since 1.0
*/
@@ -46,8 +46,8 @@ public abstract class NameableFilter extends AbstractFilter implements Nameable
* this.name = {@link #getFilterConfig() getFilterConfig()}.{@link FilterConfig#getFilterName() getName()};</pre>
*
* @return the filter name, or {@code null} if none available
- * @see javax.servlet.GenericServlet#getServletName()
- * @see javax.servlet.FilterConfig#getFilterName()
+ * @see jakarta.servlet.GenericServlet#getServletName()
+ * @see jakarta.servlet.FilterConfig#getFilterName()
*/
protected String getName() {
if (this.name == null) {
@@ -67,7 +67,7 @@ public abstract class NameableFilter extends AbstractFilter implements Nameable
* servlet container at start-up:
* <pre>
* this.name = {@link #getFilterConfig() getFilterConfig()}.
- * {@link javax.servlet.FilterConfig#getFilterName() getName()};</pre>
+ * {@link jakarta.servlet.FilterConfig#getFilterName() getName()};</pre>
*
* @param name the name of the filter.
*/
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/OncePerRequestFilter.java b/web/src/main/java/org/apache/shiro/web/servlet/OncePerRequestFilter.java
index fadfb4d53..59291f31e 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/OncePerRequestFilter.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/OncePerRequestFilter.java
@@ -21,10 +21,10 @@ package org.apache.shiro.web.servlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.IOException;
/**
@@ -36,7 +36,7 @@ import java.io.IOException;
* to identify that a request is already filtered. The default implementation
* is based on the configured name of the concrete filter instance.
* <h3>Controlling filter execution</h3>
- * 1.2 introduced the {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse)} method and
+ * 1.2 introduced the {@link #isEnabled(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)} method and
* {@link #isEnabled()} property to allow explicit control over whether the filter executes (or allows passthrough)
* for any given request.
* <p/>
@@ -68,7 +68,7 @@ public abstract class OncePerRequestFilter extends NameableFilter {
/**
* Determines if the filter's once per request functionality is enabled, defaults to false. It is recommended
- * to leave this disabled if you are using a {@link javax.servlet.RequestDispatcher RequestDispatcher} to forward
+ * to leave this disabled if you are using a {@link jakarta.servlet.RequestDispatcher RequestDispatcher} to forward
* or include request (JSP tags, programmatically, or via a framework).
*/
private boolean filterOncePerRequest;
@@ -81,7 +81,7 @@ public abstract class OncePerRequestFilter extends NameableFilter {
* <p/>
* <b>*</b> This configuration property is for general configuration for any request that comes through
* the filter. The
- * {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse) isEnabled(request,response)}
+ * {@link #isEnabled(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) isEnabled(request,response)}
* method actually determines whether or not if the filter is enabled based on the current request.
*
* @return {@code true} if this filter should <em>generally</em> execute, {@code false} if it should let the
@@ -116,7 +116,7 @@ public abstract class OncePerRequestFilter extends NameableFilter {
/**
* Sets whether this filter executes once per request or for every invocation of the filter. It is recommended
- * to leave this disabled if you are using a {@link javax.servlet.RequestDispatcher RequestDispatcher} to forward
+ * to leave this disabled if you are using a {@link jakarta.servlet.RequestDispatcher RequestDispatcher} to forward
* or include request (JSP tags, programmatically, or via a framework).
*
* @param filterOncePerRequest Whether this filter executes once per request.
@@ -214,7 +214,7 @@ public abstract class OncePerRequestFilter extends NameableFilter {
* @param request current HTTP request
* @return whether the given request should <i>not</i> be filtered
* @throws ServletException in case of errors
- * @deprecated in favor of overriding {@link #isEnabled(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}
+ * @deprecated in favor of overriding {@link #isEnabled(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)}
* for custom behavior. This method will be removed in Shiro 2.0.
*/
@Deprecated
@@ -226,7 +226,7 @@ public abstract class OncePerRequestFilter extends NameableFilter {
/**
* Same contract as for
- * {@link #doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)},
+ * {@link #doFilter(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse, jakarta.servlet.FilterChain)},
* but guaranteed to be invoked only once per request.
*
* @param request incoming {@code ServletRequest}
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/ProxiedFilterChain.java b/web/src/main/java/org/apache/shiro/web/servlet/ProxiedFilterChain.java
index 15590ee94..237c731d0 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/ProxiedFilterChain.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/ProxiedFilterChain.java
@@ -21,11 +21,11 @@ package org.apache.shiro.web.servlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.IOException;
import java.util.List;
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/ServletContextSupport.java b/web/src/main/java/org/apache/shiro/web/servlet/ServletContextSupport.java
index 652620b98..e6f09eeae 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/ServletContextSupport.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/ServletContextSupport.java
@@ -18,7 +18,7 @@
*/
package org.apache.shiro.web.servlet;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
/**
* Base implementation for any components that need to access the web application's {@link ServletContext ServletContext}.
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpServletRequest.java b/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpServletRequest.java
index 664014f57..521f78fa8 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpServletRequest.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpServletRequest.java
@@ -24,10 +24,10 @@ import org.apache.shiro.subject.Subject;
import org.apache.shiro.subject.support.DisabledSessionException;
import org.apache.shiro.web.util.WebUtils;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import jakarta.servlet.http.HttpSession;
import java.security.Principal;
@@ -77,10 +77,10 @@ public class ShiroHttpServletRequest extends HttpServletRequestWrapper {
String remoteUser;
Object scPrincipal = getSubjectPrincipal();
if (scPrincipal != null) {
- if (scPrincipal instanceof String) {
- return (String) scPrincipal;
- } else if (scPrincipal instanceof Principal) {
- remoteUser = ((Principal) scPrincipal).getName();
+ if (scPrincipal instanceof String string) {
+ return string;
+ } else if (scPrincipal instanceof Principal principal) {
+ remoteUser = principal.getName();
} else {
remoteUser = scPrincipal.toString();
}
@@ -116,8 +116,8 @@ public class ShiroHttpServletRequest extends HttpServletRequestWrapper {
Principal userPrincipal;
Object scPrincipal = getSubjectPrincipal();
if (scPrincipal != null) {
- if (scPrincipal instanceof Principal) {
- userPrincipal = (Principal) scPrincipal;
+ if (scPrincipal instanceof Principal principal) {
+ userPrincipal = principal;
} else {
userPrincipal = new ObjectPrincipal(scPrincipal);
}
@@ -247,8 +247,7 @@ public class ShiroHttpServletRequest extends HttpServletRequestWrapper {
}
public boolean equals(Object o) {
- if (o instanceof ObjectPrincipal) {
- ObjectPrincipal op = (ObjectPrincipal) o;
+ if (o instanceof ObjectPrincipal op) {
return getObject().equals(op.getObject());
}
return false;
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpServletResponse.java b/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpServletResponse.java
index 9b16b51a7..e645f7b36 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpServletResponse.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpServletResponse.java
@@ -18,11 +18,11 @@
*/
package org.apache.shiro.web.servlet;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponseWrapper;
+import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpSession.java b/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpSession.java
index 3223eb4b0..8e068357c 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpSession.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/ShiroHttpSession.java
@@ -22,11 +22,11 @@ import org.apache.shiro.session.InvalidSessionException;
import org.apache.shiro.session.Session;
import org.apache.shiro.web.session.HttpServletSession;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionBindingListener;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpSessionBindingEvent;
+import jakarta.servlet.http.HttpSessionBindingListener;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
@@ -49,28 +49,6 @@ public class ShiroHttpSession implements HttpSession {
*/
public static final String DEFAULT_SESSION_ID_NAME = "JSESSIONID";
- private static final Enumeration<String> EMPTY_ENUMERATION = new Enumeration<>() {
- public boolean hasMoreElements() {
- return false;
- }
-
- public String nextElement() {
- return null;
- }
- };
-
- @SuppressWarnings({"deprecation"})
- private static final javax.servlet.http.HttpSessionContext HTTP_SESSION_CONTEXT =
- new javax.servlet.http.HttpSessionContext() {
- public HttpSession getSession(String s) {
- return null;
- }
-
- public Enumeration<String> getIds() {
- return EMPTY_ENUMERATION;
- }
- };
-
protected ServletContext servletContext;
protected HttpServletRequest currentRequest;
//'real' Shiro Session
@@ -127,11 +105,6 @@ public class ShiroHttpSession implements HttpSession {
}
}
- @SuppressWarnings({"deprecation"})
- public javax.servlet.http.HttpSessionContext getSessionContext() {
- return HTTP_SESSION_CONTEXT;
- }
-
public Object getAttribute(String s) {
try {
return getSession().getAttribute(s);
@@ -140,12 +113,6 @@ public class ShiroHttpSession implements HttpSession {
}
}
- @Deprecated
- @Override
- public Object getValue(String s) {
- return getAttribute(s);
- }
-
protected Set<String> getKeyNames() {
Collection<Object> keySet;
try {
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/SimpleCookie.java b/web/src/main/java/org/apache/shiro/web/servlet/SimpleCookie.java
index db895ad20..d7d2644a3 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/SimpleCookie.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/SimpleCookie.java
@@ -23,8 +23,8 @@ import org.owasp.encoder.Encode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
@@ -35,7 +35,7 @@ import java.util.TimeZone;
/**
* Default {@link Cookie Cookie} implementation. 'HttpOnly' is supported out of the box, even on
* Servlet {@code 2.4} and {@code 2.5} container implementations, using raw header writing logic and not
- * {@link javax.servlet.http.Cookie javax.servlet.http.Cookie} objects (which only has 'HttpOnly' support in Servlet
+ * {@link jakarta.servlet.http.Cookie jakarta.servlet.http.Cookie} objects (which only has 'HttpOnly' support in Servlet
* {@code 2.6} specifications and above).
*
* @since 1.0
@@ -219,8 +219,8 @@ public class SimpleCookie implements Cookie {
}
/**
- * Returns the Cookie's calculated path setting. If the {@link javax.servlet.http.Cookie#getPath() path} is {@code null},
- * then the {@code request}'s {@link javax.servlet.http.HttpServletRequest#getContextPath() context path}
+ * Returns the Cookie's calculated path setting. If the {@link jakarta.servlet.http.Cookie#getPath() path} is {@code null},
+ * then the {@code request}'s {@link jakarta.servlet.http.HttpServletRequest#getContextPath() context path}
* will be returned. If getContextPath() is the empty string or null then the ROOT_PATH constant is returned.
*
* @param request the incoming HttpServletRequest
@@ -445,7 +445,7 @@ public class SimpleCookie implements Cookie {
public String readValue(HttpServletRequest request, HttpServletResponse ignored) {
String name = getName();
String value = null;
- javax.servlet.http.Cookie cookie = getCookie(request, name);
+ jakarta.servlet.http.Cookie cookie = getCookie(request, name);
if (cookie != null) {
// Validate that the cookie is used at the correct place.
String path = StringUtils.clean(getPath());
@@ -472,10 +472,10 @@ public class SimpleCookie implements Cookie {
* @return the cookie with the given name from the request or {@code null} if no cookie
* with that name could be found.
*/
- private static javax.servlet.http.Cookie getCookie(HttpServletRequest request, String cookieName) {
- javax.servlet.http.Cookie[] cookies = request.getCookies();
+ private static jakarta.servlet.http.Cookie getCookie(HttpServletRequest request, String cookieName) {
+ jakarta.servlet.http.Cookie[] cookies = request.getCookies();
if (cookies != null) {
- for (javax.servlet.http.Cookie cookie : cookies) {
+ for (jakarta.servlet.http.Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
return cookie;
}
diff --git a/web/src/main/java/org/apache/shiro/web/session/HttpServletSession.java b/web/src/main/java/org/apache/shiro/web/session/HttpServletSession.java
index 7ddf98c09..de8a6cafd 100644
--- a/web/src/main/java/org/apache/shiro/web/session/HttpServletSession.java
+++ b/web/src/main/java/org/apache/shiro/web/session/HttpServletSession.java
@@ -23,7 +23,7 @@ import org.apache.shiro.session.Session;
import org.apache.shiro.lang.util.StringUtils;
import org.apache.shiro.web.servlet.ShiroHttpSession;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpSession;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
@@ -43,7 +43,7 @@ public class HttpServletSession implements Session {
private static final String HOST_SESSION_KEY = HttpServletSession.class.getName() + ".HOST_SESSION_KEY";
private static final String TOUCH_OBJECT_SESSION_KEY = HttpServletSession.class.getName() + ".TOUCH_OBJECT_SESSION_KEY";
- private HttpSession httpSession;
+ private final HttpSession httpSession;
public HttpServletSession(HttpSession httpSession, String host) {
if (httpSession == null) {
@@ -120,10 +120,10 @@ public class HttpServletSession implements Session {
public Collection<Object> getAttributeKeys() throws InvalidSessionException {
try {
- Enumeration namesEnum = httpSession.getAttributeNames();
+ Enumeration<?> namesEnum = httpSession.getAttributeNames();
Collection<Object> keys = null;
if (namesEnum != null) {
- keys = new ArrayList<Object>();
+ keys = new ArrayList<>();
while (namesEnum.hasMoreElements()) {
keys.add(namesEnum.nextElement());
}
@@ -169,4 +169,8 @@ public class HttpServletSession implements Session {
throw new InvalidSessionException(e);
}
}
+
+ HttpSession getHttpSession() {
+ return httpSession;
+ }
}
diff --git a/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionContext.java b/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionContext.java
index 263c60ea0..3051d9d19 100644
--- a/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionContext.java
+++ b/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionContext.java
@@ -20,8 +20,8 @@ package org.apache.shiro.web.session.mgt;
import org.apache.shiro.session.mgt.DefaultSessionContext;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.util.Map;
/**
diff --git a/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.java b/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.java
index d927f2ab9..2f00b326a 100644
--- a/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.java
+++ b/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.java
@@ -33,10 +33,10 @@ import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.Serializable;
diff --git a/web/src/main/java/org/apache/shiro/web/session/mgt/ServletContainerSessionManager.java b/web/src/main/java/org/apache/shiro/web/session/mgt/ServletContainerSessionManager.java
index b20eb5f3e..1977e3477 100644
--- a/web/src/main/java/org/apache/shiro/web/session/mgt/ServletContainerSessionManager.java
+++ b/web/src/main/java/org/apache/shiro/web/session/mgt/ServletContainerSessionManager.java
@@ -26,9 +26,9 @@ import org.apache.shiro.session.mgt.SessionKey;
import org.apache.shiro.web.session.HttpServletSession;
import org.apache.shiro.web.util.WebUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpSession;
/**
diff --git a/web/src/main/java/org/apache/shiro/web/session/mgt/WebSessionContext.java b/web/src/main/java/org/apache/shiro/web/session/mgt/WebSessionContext.java
index 84fd1e180..55771256e 100644
--- a/web/src/main/java/org/apache/shiro/web/session/mgt/WebSessionContext.java
+++ b/web/src/main/java/org/apache/shiro/web/session/mgt/WebSessionContext.java
@@ -21,8 +21,8 @@ package org.apache.shiro.web.session.mgt;
import org.apache.shiro.session.mgt.SessionContext;
import org.apache.shiro.web.util.RequestPairSource;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* A {@code WebSubjectContext} is a {@link SessionContext} that additionally provides for type-safe
diff --git a/web/src/main/java/org/apache/shiro/web/session/mgt/WebSessionKey.java b/web/src/main/java/org/apache/shiro/web/session/mgt/WebSessionKey.java
index 436cd14f9..02cded524 100644
--- a/web/src/main/java/org/apache/shiro/web/session/mgt/WebSessionKey.java
+++ b/web/src/main/java/org/apache/shiro/web/session/mgt/WebSessionKey.java
@@ -18,8 +18,8 @@ package org.apache.shiro.web.session.mgt;
import org.apache.shiro.session.mgt.DefaultSessionKey;
import org.apache.shiro.web.util.RequestPairSource;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.Serializable;
/**
diff --git a/web/src/main/java/org/apache/shiro/web/subject/WebSubject.java b/web/src/main/java/org/apache/shiro/web/subject/WebSubject.java
index 5f8b66bbe..72c53c515 100644
--- a/web/src/main/java/org/apache/shiro/web/subject/WebSubject.java
+++ b/web/src/main/java/org/apache/shiro/web/subject/WebSubject.java
@@ -25,8 +25,8 @@ import org.apache.shiro.subject.SubjectContext;
import org.apache.shiro.web.subject.support.DefaultWebSubjectContext;
import org.apache.shiro.web.util.RequestPairSource;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* A {@code WebSubject} represents a Subject instance that was acquired as a result of an incoming
diff --git a/web/src/main/java/org/apache/shiro/web/subject/WebSubjectContext.java b/web/src/main/java/org/apache/shiro/web/subject/WebSubjectContext.java
index d7de2cd5a..c5757578b 100644
--- a/web/src/main/java/org/apache/shiro/web/subject/WebSubjectContext.java
+++ b/web/src/main/java/org/apache/shiro/web/subject/WebSubjectContext.java
@@ -21,8 +21,8 @@ package org.apache.shiro.web.subject;
import org.apache.shiro.subject.SubjectContext;
import org.apache.shiro.web.util.RequestPairSource;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* A {@code WebSubjectContext} is a {@link SubjectContext} that additionally provides for type-safe
diff --git a/web/src/main/java/org/apache/shiro/web/subject/support/DefaultWebSubjectContext.java b/web/src/main/java/org/apache/shiro/web/subject/support/DefaultWebSubjectContext.java
index 2f0eddff7..ee6beb675 100644
--- a/web/src/main/java/org/apache/shiro/web/subject/support/DefaultWebSubjectContext.java
+++ b/web/src/main/java/org/apache/shiro/web/subject/support/DefaultWebSubjectContext.java
@@ -23,8 +23,8 @@ import org.apache.shiro.subject.support.DefaultSubjectContext;
import org.apache.shiro.web.subject.WebSubject;
import org.apache.shiro.web.subject.WebSubjectContext;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* Default {@code WebSubjectContext} implementation that provides for additional storage and retrieval of
diff --git a/web/src/main/java/org/apache/shiro/web/subject/support/WebDelegatingSubject.java b/web/src/main/java/org/apache/shiro/web/subject/support/WebDelegatingSubject.java
index c3b04df75..3eed26b7c 100644
--- a/web/src/main/java/org/apache/shiro/web/subject/support/WebDelegatingSubject.java
+++ b/web/src/main/java/org/apache/shiro/web/subject/support/WebDelegatingSubject.java
@@ -29,8 +29,8 @@ import org.apache.shiro.web.session.mgt.WebSessionContext;
import org.apache.shiro.web.subject.WebSubject;
import org.apache.shiro.web.util.WebUtils;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* Default {@link WebSubject WebSubject} implementation that additional ensures the ability to retain a
@@ -72,14 +72,17 @@ public class WebDelegatingSubject extends DelegatingSubject implements WebSubjec
/**
* Returns {@code true} if session creation is allowed (as determined by the super class's
- * {@link super#isSessionCreationEnabled()} value and no request-specific override has disabled sessions for this subject,
+ * {@link DelegatingSubject#isSessionCreationEnabled()} value and no request-specific
+ * override has disabled sessions for this subject,
* {@code false} otherwise.
* <p/>
- * This means session creation is disabled if the super {@link super#isSessionCreationEnabled()} property is {@code false}
+ * This means session creation is disabled if the super
+ * {@link DelegatingSubject#isSessionCreationEnabled()} property is {@code false}
* or if a request attribute is discovered that turns off sessions for the current request.
*
* @return {@code true} if session creation is allowed (as determined by the super class's
- * {@link super#isSessionCreationEnabled()} value and no request-specific override has disabled sessions for this
+ * {@link DelegatingSubject#isSessionCreationEnabled()} value and no request-specific
+ * override has disabled sessions for this
* subject, {@code false} otherwise.
* @since 1.2
*/
diff --git a/web/src/main/java/org/apache/shiro/web/tags/AuthenticatedTag.java b/web/src/main/java/org/apache/shiro/web/tags/AuthenticatedTag.java
index 77f711254..524d51414 100644
--- a/web/src/main/java/org/apache/shiro/web/tags/AuthenticatedTag.java
+++ b/web/src/main/java/org/apache/shiro/web/tags/AuthenticatedTag.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.tags;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.TagSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/web/src/main/java/org/apache/shiro/web/tags/GuestTag.java b/web/src/main/java/org/apache/shiro/web/tags/GuestTag.java
index 0333e46d2..662e9b4bd 100644
--- a/web/src/main/java/org/apache/shiro/web/tags/GuestTag.java
+++ b/web/src/main/java/org/apache/shiro/web/tags/GuestTag.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.tags;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.TagSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/web/src/main/java/org/apache/shiro/web/tags/NotAuthenticatedTag.java b/web/src/main/java/org/apache/shiro/web/tags/NotAuthenticatedTag.java
index c457afb05..f94a4f946 100644
--- a/web/src/main/java/org/apache/shiro/web/tags/NotAuthenticatedTag.java
+++ b/web/src/main/java/org/apache/shiro/web/tags/NotAuthenticatedTag.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.tags;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.TagSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/web/src/main/java/org/apache/shiro/web/tags/PermissionTag.java b/web/src/main/java/org/apache/shiro/web/tags/PermissionTag.java
index c11234120..0db1bd874 100644
--- a/web/src/main/java/org/apache/shiro/web/tags/PermissionTag.java
+++ b/web/src/main/java/org/apache/shiro/web/tags/PermissionTag.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.tags;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.TagSupport;
/**
* @since 0.1
diff --git a/web/src/main/java/org/apache/shiro/web/tags/PrincipalTag.java b/web/src/main/java/org/apache/shiro/web/tags/PrincipalTag.java
index eeb9c6255..864fedbe0 100644
--- a/web/src/main/java/org/apache/shiro/web/tags/PrincipalTag.java
+++ b/web/src/main/java/org/apache/shiro/web/tags/PrincipalTag.java
@@ -21,8 +21,8 @@ package org.apache.shiro.web.tags;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.JspTagException;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.JspTagException;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
@@ -151,12 +151,11 @@ public class PrincipalTag extends SecureTag {
return SKIP_BODY;
}
- @SuppressWarnings({"unchecked"})
private Object getPrincipalFromClassName() {
Object principal = null;
try {
- Class cls = Class.forName(type);
+ Class<?> cls = Class.forName(type);
principal = getSubject().getPrincipals().oneByType(cls);
} catch (ClassNotFoundException e) {
if (LOGGER.isErrorEnabled()) {
diff --git a/web/src/main/java/org/apache/shiro/web/tags/RoleTag.java b/web/src/main/java/org/apache/shiro/web/tags/RoleTag.java
index a29609622..7bbab26e0 100644
--- a/web/src/main/java/org/apache/shiro/web/tags/RoleTag.java
+++ b/web/src/main/java/org/apache/shiro/web/tags/RoleTag.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.tags;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.TagSupport;
/**
* @since 0.1
diff --git a/web/src/main/java/org/apache/shiro/web/tags/SecureTag.java b/web/src/main/java/org/apache/shiro/web/tags/SecureTag.java
index 273fa85ec..19ebdb1ed 100644
--- a/web/src/main/java/org/apache/shiro/web/tags/SecureTag.java
+++ b/web/src/main/java/org/apache/shiro/web/tags/SecureTag.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.tags;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.TagSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/web/src/main/java/org/apache/shiro/web/tags/UserTag.java b/web/src/main/java/org/apache/shiro/web/tags/UserTag.java
index 7adb0810b..4e4a64151 100644
--- a/web/src/main/java/org/apache/shiro/web/tags/UserTag.java
+++ b/web/src/main/java/org/apache/shiro/web/tags/UserTag.java
@@ -18,7 +18,7 @@
*/
package org.apache.shiro.web.tags;
-import javax.servlet.jsp.JspException;
+import jakarta.servlet.jsp.JspException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/web/src/main/java/org/apache/shiro/web/util/CorsUtils.java b/web/src/main/java/org/apache/shiro/web/util/CorsUtils.java
index 94ad49dd9..d72fc8367 100644
--- a/web/src/main/java/org/apache/shiro/web/util/CorsUtils.java
+++ b/web/src/main/java/org/apache/shiro/web/util/CorsUtils.java
@@ -20,7 +20,7 @@ package org.apache.shiro.web.util;
import org.apache.shiro.lang.util.StringUtils;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
/**
* Utility class for CORS request handling based on the W3.
diff --git a/web/src/main/java/org/apache/shiro/web/util/RedirectView.java b/web/src/main/java/org/apache/shiro/web/util/RedirectView.java
index c1390ed17..8d703b165 100644
--- a/web/src/main/java/org/apache/shiro/web/util/RedirectView.java
+++ b/web/src/main/java/org/apache/shiro/web/util/RedirectView.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.util;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
@@ -57,7 +57,7 @@ import java.util.Map;
*
* @see #setContextRelative
* @see #setHttp10Compatible
- * @see javax.servlet.http.HttpServletResponse#sendRedirect
+ * @see jakarta.servlet.http.HttpServletResponse#sendRedirect
* @since 0.2
*/
public class RedirectView {
@@ -143,7 +143,7 @@ public class RedirectView {
* @param contextRelative whether to interpret a given URL that starts with a slash ("/")
* as relative to the current ServletContext, i.e. as relative to the
* web application root.
- * @see javax.servlet.http.HttpServletRequest#getContextPath
+ * @see jakarta.servlet.http.HttpServletRequest#getContextPath
*/
public void setContextRelative(boolean contextRelative) {
this.contextRelative = contextRelative;
@@ -160,7 +160,7 @@ public class RedirectView {
* after a POST request; turn this flag off in such a scenario.
*
* @param http10Compatible whether to stay compatible with HTTP 1.0 clients.
- * @see javax.servlet.http.HttpServletResponse#sendRedirect
+ * @see jakarta.servlet.http.HttpServletResponse#sendRedirect
*/
public void setHttp10Compatible(boolean http10Compatible) {
this.http10Compatible = http10Compatible;
@@ -188,7 +188,7 @@ public class RedirectView {
* @see #sendRedirect
*/
public final void renderMergedOutputModel(
- Map model, HttpServletRequest request, HttpServletResponse response) throws IOException {
+ Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws IOException {
// Prepare name URL.
StringBuilder targetUrl = new StringBuilder();
@@ -215,7 +215,7 @@ public class RedirectView {
* @see #queryProperties
* @see #urlEncode(String, String)
*/
- protected void appendQueryProperties(StringBuilder targetUrl, Map model, String encodingScheme)
+ protected void appendQueryProperties(StringBuilder targetUrl, Map<String, ?> model, String encodingScheme)
throws UnsupportedEncodingException {
// Extract anchor fragment, if any.
@@ -230,18 +230,17 @@ public class RedirectView {
// If there aren't already some parameters, we need a "?".
boolean first = (getUrl().indexOf('?') < 0);
- Map queryProps = queryProperties(model);
+ Map<String, ?> queryProps = queryProperties(model);
if (queryProps != null) {
- for (Object o : queryProps.entrySet()) {
+ for (Map.Entry<String, ?> entry : queryProps.entrySet()) {
if (first) {
targetUrl.append('?');
first = false;
} else {
targetUrl.append('&');
}
- Map.Entry entry = (Map.Entry) o;
- String encodedKey = urlEncode(entry.getKey().toString(), encodingScheme);
+ String encodedKey = urlEncode(entry.getKey(), encodingScheme);
String encodedValue =
(entry.getValue() != null ? urlEncode(entry.getValue().toString(), encodingScheme) : "");
targetUrl.append(encodedKey).append('=').append(encodedValue);
@@ -262,6 +261,7 @@ public class RedirectView {
* @param encodingScheme the encoding scheme
* @return the encoded output String
* @throws UnsupportedEncodingException if thrown by the JDK URLEncoder
+ * @see java.net.URLEncoder#encode(String, java.nio.charset.Charset)
* @see java.net.URLEncoder#encode(String, String)
* @see java.net.URLEncoder#encode(String)
*/
@@ -279,7 +279,7 @@ public class RedirectView {
* @return the name-value pairs for query strings.
* @see #appendQueryProperties
*/
- protected Map queryProperties(Map model) {
+ protected Map<String, ?> queryProperties(Map<String, ?> model) {
return model;
}
diff --git a/web/src/main/java/org/apache/shiro/web/util/RequestPairSource.java b/web/src/main/java/org/apache/shiro/web/util/RequestPairSource.java
index d280ae9cb..137dfb392 100644
--- a/web/src/main/java/org/apache/shiro/web/util/RequestPairSource.java
+++ b/web/src/main/java/org/apache/shiro/web/util/RequestPairSource.java
@@ -15,8 +15,8 @@
*/
package org.apache.shiro.web.util;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* A {@code RequestPairSource} is a component that can supply a {@link ServletRequest ServletRequest} and
diff --git a/web/src/main/java/org/apache/shiro/web/util/SavedRequest.java b/web/src/main/java/org/apache/shiro/web/util/SavedRequest.java
index d52a10c15..4c2880072 100644
--- a/web/src/main/java/org/apache/shiro/web/util/SavedRequest.java
+++ b/web/src/main/java/org/apache/shiro/web/util/SavedRequest.java
@@ -18,7 +18,7 @@
*/
package org.apache.shiro.web.util;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.io.Serializable;
/**
diff --git a/web/src/main/java/org/apache/shiro/web/util/WebUtils.java b/web/src/main/java/org/apache/shiro/web/util/WebUtils.java
index 99717f242..dec232bdf 100644
--- a/web/src/main/java/org/apache/shiro/web/util/WebUtils.java
+++ b/web/src/main/java/org/apache/shiro/web/util/WebUtils.java
@@ -30,14 +30,16 @@ import org.owasp.encoder.Encode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
@@ -68,28 +70,28 @@ public final class WebUtils {
* <p>If included via a RequestDispatcher, the current resource will see the
* originating request. Its own URI and paths are exposed as request attributes.
*/
- public static final String INCLUDE_REQUEST_URI_ATTRIBUTE = "javax.servlet.include.request_uri";
- public static final String INCLUDE_CONTEXT_PATH_ATTRIBUTE = "javax.servlet.include.context_path";
- public static final String INCLUDE_SERVLET_PATH_ATTRIBUTE = "javax.servlet.include.servlet_path";
- public static final String INCLUDE_PATH_INFO_ATTRIBUTE = "javax.servlet.include.path_info";
- public static final String INCLUDE_QUERY_STRING_ATTRIBUTE = "javax.servlet.include.query_string";
+ public static final String INCLUDE_REQUEST_URI_ATTRIBUTE = RequestDispatcher.INCLUDE_REQUEST_URI;
+ public static final String INCLUDE_CONTEXT_PATH_ATTRIBUTE = RequestDispatcher.INCLUDE_CONTEXT_PATH;
+ public static final String INCLUDE_SERVLET_PATH_ATTRIBUTE = RequestDispatcher.INCLUDE_SERVLET_PATH;
+ public static final String INCLUDE_PATH_INFO_ATTRIBUTE = RequestDispatcher.INCLUDE_PATH_INFO;
+ public static final String INCLUDE_QUERY_STRING_ATTRIBUTE = RequestDispatcher.INCLUDE_QUERY_STRING;
/**
* Standard Servlet 2.4+ spec request attributes for forward URI and paths.
* <p>If forwarded to via a RequestDispatcher, the current resource will see its
* own URI and paths. The originating URI and paths are exposed as request attributes.
*/
- public static final String FORWARD_REQUEST_URI_ATTRIBUTE = "javax.servlet.forward.request_uri";
- public static final String FORWARD_CONTEXT_PATH_ATTRIBUTE = "javax.servlet.forward.context_path";
- public static final String FORWARD_SERVLET_PATH_ATTRIBUTE = "javax.servlet.forward.servlet_path";
- public static final String FORWARD_PATH_INFO_ATTRIBUTE = "javax.servlet.forward.path_info";
- public static final String FORWARD_QUERY_STRING_ATTRIBUTE = "javax.servlet.forward.query_string";
+ public static final String FORWARD_REQUEST_URI_ATTRIBUTE = RequestDispatcher.FORWARD_REQUEST_URI;
+ public static final String FORWARD_CONTEXT_PATH_ATTRIBUTE = RequestDispatcher.FORWARD_CONTEXT_PATH;
+ public static final String FORWARD_SERVLET_PATH_ATTRIBUTE = RequestDispatcher.FORWARD_SERVLET_PATH;
+ public static final String FORWARD_PATH_INFO_ATTRIBUTE = RequestDispatcher.FORWARD_PATH_INFO;
+ public static final String FORWARD_QUERY_STRING_ATTRIBUTE = RequestDispatcher.FORWARD_QUERY_STRING;
/**
* Default character encoding to use when <code>request.getCharacterEncoding</code>
* returns <code>null</code>, according to the Servlet spec.
*
- * @see javax.servlet.ServletRequest#getCharacterEncoding
+ * @see jakarta.servlet.ServletRequest#getCharacterEncoding
*/
public static final String DEFAULT_CHARACTER_ENCODING = "ISO-8859-1";
@@ -366,7 +368,8 @@ public final class WebUtils {
* @param source the String to decode
* @return the decoded String
* @see #DEFAULT_CHARACTER_ENCODING
- * @see javax.servlet.ServletRequest#getCharacterEncoding
+ * @see jakarta.servlet.ServletRequest#getCharacterEncoding
+ * @see java.net.URLDecoder#decode(String, java.nio.charset.Charset)
* @see java.net.URLDecoder#decode(String, String)
* @see java.net.URLDecoder#decode(String)
*/
@@ -381,7 +384,7 @@ public final class WebUtils {
+ "] with encoding '" + Encode.forHtml(enc)
+ "': falling back to platform default encoding; exception message: " + ex.getMessage());
}
- return URLDecoder.decode(source);
+ return URLDecoder.decode(source, StandardCharsets.UTF_8);
}
}
@@ -394,7 +397,7 @@ public final class WebUtils {
*
* @param request current HTTP request
* @return the encoding for the request (never <code>null</code>)
- * @see javax.servlet.ServletRequest#getCharacterEncoding()
+ * @see jakarta.servlet.ServletRequest#getCharacterEncoding()
*/
protected static String determineEncoding(HttpServletRequest request) {
String enc = request.getCharacterEncoding();
@@ -555,7 +558,7 @@ public final class WebUtils {
* @throws java.io.IOException if thrown by response methods.
*/
public static void issueRedirect(ServletRequest request, ServletResponse response, String url,
- Map queryParams, boolean contextRelative,
+ Map<String, ?> queryParams, boolean contextRelative,
boolean http10Compatible) throws IOException {
RedirectView view = new RedirectView(url, contextRelative, http10Compatible);
view.renderMergedOutputModel(queryParams, toHttp(request), toHttp(response));
@@ -585,7 +588,7 @@ public final class WebUtils {
* @throws java.io.IOException if thrown by response methods.
*/
public static void issueRedirect(ServletRequest request,
- ServletResponse response, String url, Map queryParams) throws IOException {
+ ServletResponse response, String url, Map<String, ?> queryParams) throws IOException {
issueRedirect(request, response, url, queryParams, true, true);
}
@@ -601,7 +604,7 @@ public final class WebUtils {
* @throws java.io.IOException if thrown by response methods.
*/
public static void issueRedirect(ServletRequest request,
- ServletResponse response, String url, Map queryParams, boolean contextRelative)
+ ServletResponse response, String url, Map<String, ?> queryParams, boolean contextRelative)
throws IOException {
issueRedirect(request, response, url, queryParams, contextRelative, true);
}
@@ -671,13 +674,13 @@ public final class WebUtils {
/**
* Redirects the to the request url from a previously
- * {@link #saveRequest(javax.servlet.ServletRequest) saved} request, or if there is no saved request, redirects the
+ * {@link #saveRequest(jakarta.servlet.ServletRequest) saved} request, or if there is no saved request, redirects the
* end user to the specified {@code fallbackUrl}. If there is no saved request or fallback url, this method
* throws an {@link IllegalStateException}.
* <p/>
* This method is primarily used to support a common login scenario - if an unauthenticated user accesses a
* page that requires authentication, it is expected that request is
- * {@link #saveRequest(javax.servlet.ServletRequest) saved} first and then redirected to the login page. Then,
+ * {@link #saveRequest(jakarta.servlet.ServletRequest) saved} first and then redirected to the login page. Then,
* after a successful login, this method can be called to redirect them back to their originally requested URL, a
* nice usability feature.
*
diff --git a/web/src/test/groovy/org/apache/shiro/web/config/IniFilterChainResolverFactoryTest.groovy b/web/src/test/groovy/org/apache/shiro/web/config/IniFilterChainResolverFactoryTest.groovy
index 0600b718a..aee0880d7 100644
--- a/web/src/test/groovy/org/apache/shiro/web/config/IniFilterChainResolverFactoryTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/config/IniFilterChainResolverFactoryTest.groovy
@@ -24,9 +24,9 @@ import org.hamcrest.Matchers
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.parallel.Isolated
-import javax.servlet.Filter
-import javax.servlet.FilterConfig
-import javax.servlet.ServletContext
+import jakarta.servlet.Filter
+import jakarta.servlet.FilterConfig
+import jakarta.servlet.ServletContext
import org.apache.shiro.config.Ini
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter
import org.apache.shiro.web.filter.authz.SslFilter
diff --git a/web/src/test/groovy/org/apache/shiro/web/env/EnvironmentLoaderTest.groovy b/web/src/test/groovy/org/apache/shiro/web/env/EnvironmentLoaderTest.groovy
index 22cd0fc44..cbbf29eac 100644
--- a/web/src/test/groovy/org/apache/shiro/web/env/EnvironmentLoaderTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/env/EnvironmentLoaderTest.groovy
@@ -27,7 +27,7 @@ import static org.easymock.EasyMock.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test
-import javax.servlet.ServletContext
+import jakarta.servlet.ServletContext
/**
* Unit tests for the {@link EnvironmentLoaderTest} implementation.
diff --git a/web/src/test/groovy/org/apache/shiro/web/env/MockWebEnvironment.groovy b/web/src/test/groovy/org/apache/shiro/web/env/MockWebEnvironment.groovy
index 2bb9a297d..4cb90cfd0 100644
--- a/web/src/test/groovy/org/apache/shiro/web/env/MockWebEnvironment.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/env/MockWebEnvironment.groovy
@@ -23,7 +23,7 @@ import org.apache.shiro.web.config.ShiroFilterConfiguration
import org.apache.shiro.web.filter.mgt.FilterChainResolver
import org.apache.shiro.web.mgt.WebSecurityManager
-import javax.servlet.ServletContext
+import jakarta.servlet.ServletContext
/**
* Mock WebEnvironment, replaces IniWebEnvironment in EnvironmentLoader tests, to avoid extra dependencies.
diff --git a/web/src/test/groovy/org/apache/shiro/web/filter/InvalidRequestFilterTest.groovy b/web/src/test/groovy/org/apache/shiro/web/filter/InvalidRequestFilterTest.groovy
index 5a87296c2..dcb683c71 100644
--- a/web/src/test/groovy/org/apache/shiro/web/filter/InvalidRequestFilterTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/filter/InvalidRequestFilterTest.groovy
@@ -23,7 +23,8 @@ import org.apache.shiro.web.RestoreSystemProperties
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.parallel.Isolated
-import javax.servlet.http.HttpServletRequest
+import jakarta.servlet.RequestDispatcher
+import jakarta.servlet.http.HttpServletRequest
import static org.easymock.EasyMock.expect
import static org.easymock.EasyMock.mock
@@ -226,8 +227,8 @@ class InvalidRequestFilterTest {
expect(request.getRequestURI()).andReturn(requestUri)
expect(request.getServletPath()).andReturn(servletPath).anyTimes()
expect(request.getPathInfo()).andReturn(pathInfo).anyTimes()
- expect(request.getAttribute("javax.servlet.include.servlet_path")).andReturn(servletPath)
- expect(request.getAttribute("javax.servlet.include.path_info")).andReturn(pathInfo)
+ expect(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH)).andReturn(servletPath)
+ expect(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO)).andReturn(pathInfo)
replay(request)
return request
}
diff --git a/web/src/test/groovy/org/apache/shiro/web/filter/authc/BearerHttpFilterAuthenticationTest.groovy b/web/src/test/groovy/org/apache/shiro/web/filter/authc/BearerHttpFilterAuthenticationTest.groovy
index 011df6d9a..997f39ec9 100644
--- a/web/src/test/groovy/org/apache/shiro/web/filter/authc/BearerHttpFilterAuthenticationTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/filter/authc/BearerHttpFilterAuthenticationTest.groovy
@@ -25,8 +25,8 @@ import org.hamcrest.CoreMatchers
import org.hamcrest.Matchers
import org.junit.jupiter.api.Test
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
+import jakarta.servlet.http.HttpServletRequest
+import jakarta.servlet.http.HttpServletResponse
import static org.assertj.core.api.Assertions.assertThat
import static org.easymock.EasyMock.*
@@ -108,7 +108,7 @@ class BearerHttpFilterAuthenticationTest extends SecurityManagerTestSupport {
BearerHttpAuthenticationFilter testFilter = new BearerHttpAuthenticationFilter()
HttpServletRequest request = createMock(HttpServletRequest.class)
- expect(request.getMethod()).andReturn("GET")
+ expect(request.getMethod()).andReturn("GET").times(2)
replay(request)
HttpServletResponse response = createMock(HttpServletResponse.class)
@@ -127,7 +127,7 @@ class BearerHttpFilterAuthenticationTest extends SecurityManagerTestSupport {
BearerHttpAuthenticationFilter testFilter = new BearerHttpAuthenticationFilter()
HttpServletRequest request = mockRequest("valid-token", "localhost", {
- expect(it.getMethod()).andReturn("POST")
+ expect(it.getMethod()).andReturn("POST").times(2)
})
HttpServletResponse response = mockResponse()
@@ -181,7 +181,7 @@ class BearerHttpFilterAuthenticationTest extends SecurityManagerTestSupport {
BearerHttpAuthenticationFilter testFilter = new BearerHttpAuthenticationFilter()
HttpServletRequest request = mockRequest("valid-token", "localhost", {
- expect(it.getMethod()).andReturn("GET")
+ expect(it.getMethod()).andReturn("GET").times(2)
})
HttpServletResponse response = mockResponse()
@@ -199,7 +199,7 @@ class BearerHttpFilterAuthenticationTest extends SecurityManagerTestSupport {
HttpServletRequest request = createMock(HttpServletRequest.class)
expect(request.getHeader("Authorization")).andReturn(null)
- expect(request.getMethod()).andReturn("GET")
+ expect(request.getMethod()).andReturn("GET").times(2)
expect(request.getRemoteHost()).andReturn("localhost")
replay(request)
@@ -217,7 +217,7 @@ class BearerHttpFilterAuthenticationTest extends SecurityManagerTestSupport {
BearerHttpAuthenticationFilter testFilter = new BearerHttpAuthenticationFilter()
HttpServletRequest request = mockRequest("a-valid-token", "localhost", {
- expect(it.getMethod()).andReturn("POST")
+ expect(it.getMethod()).andReturn("POST").times(2)
})
HttpServletResponse response = mockResponse()
diff --git a/web/src/test/groovy/org/apache/shiro/web/filter/authc/LogoutFilterTest.groovy b/web/src/test/groovy/org/apache/shiro/web/filter/authc/LogoutFilterTest.groovy
index e666fac45..32c210889 100644
--- a/web/src/test/groovy/org/apache/shiro/web/filter/authc/LogoutFilterTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/filter/authc/LogoutFilterTest.groovy
@@ -21,10 +21,10 @@ package org.apache.shiro.web.filter.authc
import org.apache.shiro.subject.Subject
import org.junit.jupiter.api.Test
-import javax.servlet.ServletRequest
-import javax.servlet.ServletResponse
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
+import jakarta.servlet.ServletRequest
+import jakarta.servlet.ServletResponse
+import jakarta.servlet.http.HttpServletRequest
+import jakarta.servlet.http.HttpServletResponse
import static org.easymock.EasyMock.*
import static org.junit.jupiter.api.Assertions.*
diff --git a/web/src/test/groovy/org/apache/shiro/web/filter/mgt/DefaultFilterChainManagerTest.groovy b/web/src/test/groovy/org/apache/shiro/web/filter/mgt/DefaultFilterChainManagerTest.groovy
index 06b811b0d..6d70e9583 100644
--- a/web/src/test/groovy/org/apache/shiro/web/filter/mgt/DefaultFilterChainManagerTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/filter/mgt/DefaultFilterChainManagerTest.groovy
@@ -24,10 +24,10 @@ import org.apache.shiro.web.servlet.ShiroFilter
import org.hamcrest.Matchers
import org.junit.jupiter.api.BeforeEach
-import javax.servlet.Filter
-import javax.servlet.FilterChain
-import javax.servlet.FilterConfig
-import javax.servlet.ServletContext
+import jakarta.servlet.Filter
+import jakarta.servlet.FilterChain
+import jakarta.servlet.FilterConfig
+import jakarta.servlet.ServletContext
import org.junit.jupiter.api.Test
import static org.easymock.EasyMock.*
@@ -232,11 +232,12 @@ class DefaultFilterChainManagerTest {
// the "default" chain doesn't exist until it is created
assertThat(manager.getChain("/**"), Matchers.nullValue())
// create it
- manager.createDefaultChain("/**")
+ manager.createDefaultChain("/**", DefaultFilter.noAccess.name())
// verify it
assertThat(manager.getChain("/**"), Matchers.contains(
Matchers.instanceOf(DefaultFilter.invalidRequest.getFilterClass()),
- Matchers.instanceOf(DefaultFilter.port.getFilterClass())
+ Matchers.instanceOf(DefaultFilter.port.getFilterClass()),
+ Matchers.instanceOf(DefaultFilter.noAccess.getFilterClass())
))
}
@@ -250,7 +251,7 @@ class DefaultFilterChainManagerTest {
manager.createChain("test", "authc")
// create the default chain with the same name
- manager.createDefaultChain("test")
+ manager.createDefaultChain("test", DefaultFilter.noAccess.name())
// since the "default" chain was created with the same name as an existing chain, we could end up adding the
// global filters to the chain twice, test to verify it is only once
diff --git a/web/src/test/groovy/org/apache/shiro/web/filter/session/NoSessionCreationFilterTest.groovy b/web/src/test/groovy/org/apache/shiro/web/filter/session/NoSessionCreationFilterTest.groovy
index 0b13cd307..9ecfcd058 100644
--- a/web/src/test/groovy/org/apache/shiro/web/filter/session/NoSessionCreationFilterTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/filter/session/NoSessionCreationFilterTest.groovy
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.filter.session
-import javax.servlet.ServletRequest
-import javax.servlet.ServletResponse
+import jakarta.servlet.ServletRequest
+import jakarta.servlet.ServletResponse
import org.apache.shiro.subject.support.DefaultSubjectContext
import org.junit.jupiter.api.Test
diff --git a/web/src/test/groovy/org/apache/shiro/web/mgt/DefaultWebSessionStorageEvaluatorTest.groovy b/web/src/test/groovy/org/apache/shiro/web/mgt/DefaultWebSessionStorageEvaluatorTest.groovy
index 648e892e4..dab4120ac 100644
--- a/web/src/test/groovy/org/apache/shiro/web/mgt/DefaultWebSessionStorageEvaluatorTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/mgt/DefaultWebSessionStorageEvaluatorTest.groovy
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web.mgt
-import javax.servlet.ServletRequest
-import javax.servlet.ServletResponse
+import jakarta.servlet.ServletRequest
+import jakarta.servlet.ServletResponse
import org.apache.shiro.session.Session
import org.apache.shiro.subject.Subject
import org.apache.shiro.subject.support.DefaultSubjectContext
diff --git a/web/src/test/groovy/org/apache/shiro/web/servlet/AbstractShiroFilterTest.groovy b/web/src/test/groovy/org/apache/shiro/web/servlet/AbstractShiroFilterTest.groovy
index 11dc47826..e38a6cd71 100644
--- a/web/src/test/groovy/org/apache/shiro/web/servlet/AbstractShiroFilterTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/servlet/AbstractShiroFilterTest.groovy
@@ -20,8 +20,8 @@ package org.apache.shiro.web.servlet
import org.junit.jupiter.api.parallel.Isolated
-import javax.servlet.FilterConfig
-import javax.servlet.ServletContext
+import jakarta.servlet.FilterConfig
+import jakarta.servlet.ServletContext
import org.apache.shiro.SecurityUtils
import org.apache.shiro.UnavailableSecurityManagerException
import org.apache.shiro.web.mgt.WebSecurityManager
diff --git a/web/src/test/groovy/org/apache/shiro/web/servlet/IniShiroFilterTest.groovy b/web/src/test/groovy/org/apache/shiro/web/servlet/IniShiroFilterTest.groovy
index c2e68ee84..ca07f1491 100644
--- a/web/src/test/groovy/org/apache/shiro/web/servlet/IniShiroFilterTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/servlet/IniShiroFilterTest.groovy
@@ -18,9 +18,9 @@
*/
package org.apache.shiro.web.servlet
-import javax.servlet.FilterConfig
-import javax.servlet.ServletContext
-import javax.servlet.ServletException
+import jakarta.servlet.FilterConfig
+import jakarta.servlet.ServletContext
+import jakarta.servlet.ServletException
import org.apache.shiro.lang.io.ResourceUtils
import org.junit.jupiter.api.Test
diff --git a/web/src/test/groovy/org/apache/shiro/web/servlet/ShiroFilterTest.groovy b/web/src/test/groovy/org/apache/shiro/web/servlet/ShiroFilterTest.groovy
index d85995e4d..858f24c77 100644
--- a/web/src/test/groovy/org/apache/shiro/web/servlet/ShiroFilterTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/servlet/ShiroFilterTest.groovy
@@ -25,8 +25,8 @@ import org.apache.shiro.web.filter.mgt.FilterChainResolver
import org.apache.shiro.web.mgt.WebSecurityManager
import org.junit.jupiter.api.Test
-import javax.servlet.FilterConfig
-import javax.servlet.ServletContext
+import jakarta.servlet.FilterConfig
+import jakarta.servlet.ServletContext
import static org.hamcrest.MatcherAssert.assertThat
import static org.hamcrest.Matchers.sameInstance
diff --git a/web/src/test/groovy/org/apache/shiro/web/servlet/ShiroHttpServletResponseTest.groovy b/web/src/test/groovy/org/apache/shiro/web/servlet/ShiroHttpServletResponseTest.groovy
index f916e7ca5..31aae75bd 100644
--- a/web/src/test/groovy/org/apache/shiro/web/servlet/ShiroHttpServletResponseTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/servlet/ShiroHttpServletResponseTest.groovy
@@ -20,9 +20,9 @@ package org.apache.shiro.web.servlet
import org.junit.jupiter.api.Test
-import javax.servlet.ServletContext
-import javax.servlet.http.HttpServletResponse
-import javax.servlet.http.HttpSession
+import jakarta.servlet.ServletContext
+import jakarta.servlet.http.HttpServletResponse
+import jakarta.servlet.http.HttpSession
import static org.junit.jupiter.api.Assertions.assertEquals
import static org.mockito.Mockito.*
diff --git a/web/src/test/groovy/org/apache/shiro/web/session/mgt/DefaultWebSessionManagerTest.groovy b/web/src/test/groovy/org/apache/shiro/web/session/mgt/DefaultWebSessionManagerTest.groovy
index e57ff8306..e359e85b1 100644
--- a/web/src/test/groovy/org/apache/shiro/web/session/mgt/DefaultWebSessionManagerTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/session/mgt/DefaultWebSessionManagerTest.groovy
@@ -28,9 +28,9 @@ import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
-import javax.servlet.ServletRequest
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
+import jakarta.servlet.ServletRequest
+import jakarta.servlet.http.HttpServletRequest
+import jakarta.servlet.http.HttpServletResponse
import static org.easymock.EasyMock.*
import static org.junit.jupiter.api.Assertions.assertEquals
diff --git a/web/src/test/groovy/org/apache/shiro/web/session/mgt/ServletContainerSessionManagerTest.groovy b/web/src/test/groovy/org/apache/shiro/web/session/mgt/ServletContainerSessionManagerTest.groovy
index 1cf601a07..49e41d549 100644
--- a/web/src/test/groovy/org/apache/shiro/web/session/mgt/ServletContainerSessionManagerTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/session/mgt/ServletContainerSessionManagerTest.groovy
@@ -18,9 +18,9 @@
*/
package org.apache.shiro.web.session.mgt
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-import javax.servlet.http.HttpSession
+import jakarta.servlet.http.HttpServletRequest
+import jakarta.servlet.http.HttpServletResponse
+import jakarta.servlet.http.HttpSession
import org.apache.shiro.session.mgt.SessionContext
import org.apache.shiro.session.mgt.SessionKey
import org.apache.shiro.web.session.HttpServletSession
diff --git a/web/src/test/groovy/org/apache/shiro/web/util/SavedRequestTest.groovy b/web/src/test/groovy/org/apache/shiro/web/util/SavedRequestTest.groovy
index 45d775bd9..95bac6d76 100644
--- a/web/src/test/groovy/org/apache/shiro/web/util/SavedRequestTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/util/SavedRequestTest.groovy
@@ -20,7 +20,7 @@ package org.apache.shiro.web.util
import org.junit.jupiter.api.Test
-import javax.servlet.http.HttpServletRequest
+import jakarta.servlet.http.HttpServletRequest
import static org.hamcrest.MatcherAssert.assertThat
import static org.hamcrest.Matchers.equalTo
import static org.easymock.EasyMock.niceMock
diff --git a/web/src/test/groovy/org/apache/shiro/web/util/WebUtilsTest.groovy b/web/src/test/groovy/org/apache/shiro/web/util/WebUtilsTest.groovy
index 5bd61e6ba..53b8e3c0f 100644
--- a/web/src/test/groovy/org/apache/shiro/web/util/WebUtilsTest.groovy
+++ b/web/src/test/groovy/org/apache/shiro/web/util/WebUtilsTest.groovy
@@ -22,7 +22,7 @@ import org.apache.shiro.web.RestoreSystemProperties
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.parallel.Isolated
-import javax.servlet.http.HttpServletRequest
+import jakarta.servlet.http.HttpServletRequest
import static org.easymock.EasyMock.*
import static org.hamcrest.MatcherAssert.*
diff --git a/web/src/test/java/org/apache/shiro/web/WebTest.java b/web/src/test/java/org/apache/shiro/web/WebTest.java
index 25ced2f68..5a109028f 100644
--- a/web/src/test/java/org/apache/shiro/web/WebTest.java
+++ b/web/src/test/java/org/apache/shiro/web/WebTest.java
@@ -18,8 +18,8 @@
*/
package org.apache.shiro.web;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletContext;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
diff --git a/web/src/test/java/org/apache/shiro/web/config/WebIniSecurityManagerFactoryTest.java b/web/src/test/java/org/apache/shiro/web/config/WebIniSecurityManagerFactoryTest.java
index 3258f5084..5bd8d331e 100644
--- a/web/src/test/java/org/apache/shiro/web/config/WebIniSecurityManagerFactoryTest.java
+++ b/web/src/test/java/org/apache/shiro/web/config/WebIniSecurityManagerFactoryTest.java
@@ -24,7 +24,7 @@ import org.apache.shiro.web.filter.mgt.DefaultFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.junit.jupiter.api.Test;
-import javax.servlet.Filter;
+import jakarta.servlet.Filter;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/web/src/test/java/org/apache/shiro/web/env/EnvironmentLoaderServiceTest.java b/web/src/test/java/org/apache/shiro/web/env/EnvironmentLoaderServiceTest.java
index f9bc7abfa..5e4fce4ac 100644
--- a/web/src/test/java/org/apache/shiro/web/env/EnvironmentLoaderServiceTest.java
+++ b/web/src/test/java/org/apache/shiro/web/env/EnvironmentLoaderServiceTest.java
@@ -22,7 +22,7 @@ import org.apache.shiro.config.ConfigurationException;
import org.easymock.EasyMock;
import org.junit.jupiter.api.Test;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
import java.util.Arrays;
import java.util.List;
diff --git a/web/src/test/java/org/apache/shiro/web/env/FilterStub.java b/web/src/test/java/org/apache/shiro/web/env/FilterStub.java
index 1341fb323..933593811 100644
--- a/web/src/test/java/org/apache/shiro/web/env/FilterStub.java
+++ b/web/src/test/java/org/apache/shiro/web/env/FilterStub.java
@@ -18,12 +18,12 @@
*/
package org.apache.shiro.web.env;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.IOException;
public class FilterStub implements Filter {
diff --git a/web/src/test/java/org/apache/shiro/web/env/WebEnvironmentStub.java b/web/src/test/java/org/apache/shiro/web/env/WebEnvironmentStub.java
index 7dc7f7ca4..79e173205 100644
--- a/web/src/test/java/org/apache/shiro/web/env/WebEnvironmentStub.java
+++ b/web/src/test/java/org/apache/shiro/web/env/WebEnvironmentStub.java
@@ -23,7 +23,7 @@ import org.apache.shiro.web.config.ShiroFilterConfiguration;
import org.apache.shiro.web.filter.mgt.FilterChainResolver;
import org.apache.shiro.web.mgt.WebSecurityManager;
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
public class WebEnvironmentStub implements WebEnvironment, MutableWebEnvironment {
diff --git a/web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterParameterizedTest.java b/web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterParameterizedTest.java
index 7547e7c46..3933dbdab 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterParameterizedTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterParameterizedTest.java
@@ -24,9 +24,9 @@ import org.junit.jupiter.params.provider.MethodSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.stream.Stream;
diff --git a/web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterTest.java b/web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterTest.java
index e5b1084fc..2735168d0 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterTest.java
@@ -21,9 +21,9 @@ package org.apache.shiro.web.filter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.easymock.EasyMock.createNiceMock;
diff --git a/web/src/test/java/org/apache/shiro/web/filter/authc/BasicHttpFilterAuthenticationTest.java b/web/src/test/java/org/apache/shiro/web/filter/authc/BasicHttpFilterAuthenticationTest.java
index ecc38da26..3efce20bd 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/authc/BasicHttpFilterAuthenticationTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/authc/BasicHttpFilterAuthenticationTest.java
@@ -24,8 +24,8 @@ import org.apache.shiro.lang.codec.Base64;
import org.apache.shiro.test.SecurityManagerTestSupport;
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -311,6 +311,7 @@ public class BasicHttpFilterAuthenticationTest extends SecurityManagerTestSuppor
@Test
public void notAllowedPreFlightRequests() {
testFilter = new BasicHttpAuthenticationFilter();
+ testFilter.setAllowPreFlightRequests(false);
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
diff --git a/web/src/test/java/org/apache/shiro/web/filter/authz/AuthorizationFilterTest.java b/web/src/test/java/org/apache/shiro/web/filter/authz/AuthorizationFilterTest.java
index 8e436e62c..fbdaee588 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/authz/AuthorizationFilterTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/authz/AuthorizationFilterTest.java
@@ -22,10 +22,10 @@ import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.test.SecurityManagerTestSupport;
import org.junit.jupiter.api.Test;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
diff --git a/web/src/test/java/org/apache/shiro/web/filter/authz/IpFilterTest.java b/web/src/test/java/org/apache/shiro/web/filter/authz/IpFilterTest.java
index c0076a407..b0d5ca76c 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/authz/IpFilterTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/authz/IpFilterTest.java
@@ -20,7 +20,7 @@ package org.apache.shiro.web.filter.authz;
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.Collections;
diff --git a/web/src/test/java/org/apache/shiro/web/filter/authz/PortFilterTest.java b/web/src/test/java/org/apache/shiro/web/filter/authz/PortFilterTest.java
index 8103b309f..70cae5d19 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/authz/PortFilterTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/authz/PortFilterTest.java
@@ -20,8 +20,8 @@ package org.apache.shiro.web.filter.authz;
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import static org.assertj.core.api.Assertions.assertThat;
import static org.easymock.EasyMock.createNiceMock;
diff --git a/web/src/test/java/org/apache/shiro/web/filter/authz/SslFilterTest.java b/web/src/test/java/org/apache/shiro/web/filter/authz/SslFilterTest.java
index 605a323af..01c57a532 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/authz/SslFilterTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/authz/SslFilterTest.java
@@ -23,8 +23,8 @@ import org.easymock.IAnswer;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
diff --git a/web/src/test/java/org/apache/shiro/web/filter/mgt/PathMatchingFilterChainResolverTest.java b/web/src/test/java/org/apache/shiro/web/filter/mgt/PathMatchingFilterChainResolverTest.java
index 5d236a328..f05f3d949 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/mgt/PathMatchingFilterChainResolverTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/mgt/PathMatchingFilterChainResolverTest.java
@@ -23,12 +23,12 @@ import org.apache.shiro.web.WebTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
diff --git a/web/src/test/java/org/apache/shiro/web/filter/mgt/SimpleNamedFilterListTest.java b/web/src/test/java/org/apache/shiro/web/filter/mgt/SimpleNamedFilterListTest.java
index 3a4bb668f..5d9dbaad5 100644
--- a/web/src/test/java/org/apache/shiro/web/filter/mgt/SimpleNamedFilterListTest.java
+++ b/web/src/test/java/org/apache/shiro/web/filter/mgt/SimpleNamedFilterListTest.java
@@ -26,8 +26,8 @@ import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;
import org.apache.shiro.web.filter.authz.SslFilter;
import org.junit.jupiter.api.Test;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -116,11 +116,11 @@ public class SimpleNamedFilterListTest {
assertThat(list).isEmpty();
list.add(singleFilter);
- Iterator i = list.iterator();
+ Iterator<Filter> i = list.iterator();
assertThat(i.hasNext()).isTrue();
assertThat(singleFilter).isEqualTo(i.next());
- ListIterator li = list.listIterator();
+ ListIterator<Filter> li = list.listIterator();
assertThat(li.hasNext()).isTrue();
assertThat(singleFilter).isEqualTo(li.next());
diff --git a/web/src/test/java/org/apache/shiro/web/mgt/CookieRememberMeManagerTest.java b/web/src/test/java/org/apache/shiro/web/mgt/CookieRememberMeManagerTest.java
index c61b81748..e28d6037a 100644
--- a/web/src/test/java/org/apache/shiro/web/mgt/CookieRememberMeManagerTest.java
+++ b/web/src/test/java/org/apache/shiro/web/mgt/CookieRememberMeManagerTest.java
@@ -31,9 +31,9 @@ import org.apache.shiro.web.subject.WebSubjectContext;
import org.apache.shiro.web.subject.support.DefaultWebSubjectContext;
import org.junit.jupiter.api.Test;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.UUID;
diff --git a/web/src/test/java/org/apache/shiro/web/mgt/DefaultWebSecurityManagerTest.java b/web/src/test/java/org/apache/shiro/web/mgt/DefaultWebSecurityManagerTest.java
index 9853d6592..6083f6b6a 100644
--- a/web/src/test/java/org/apache/shiro/web/mgt/DefaultWebSecurityManagerTest.java
+++ b/web/src/test/java/org/apache/shiro/web/mgt/DefaultWebSecurityManagerTest.java
@@ -24,8 +24,8 @@ import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.session.ExpiredSessionException;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.AbstractSessionManager;
+import org.apache.shiro.subject.ImmutablePrincipalCollection;
import org.apache.shiro.subject.PrincipalCollection;
-import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.config.WebIniSecurityManagerFactory;
import org.apache.shiro.web.servlet.ShiroHttpSession;
@@ -36,11 +36,11 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Isolated;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.Serializable;
import static org.assertj.core.api.Assertions.assertThat;
@@ -219,7 +219,7 @@ public class DefaultWebSecurityManagerTest extends AbstractWebSecurityManagerTes
WebSecurityManager securityManager = (WebSecurityManager) factory.getInstance();
- PrincipalCollection principals = new SimplePrincipalCollection("user1", "iniRealm");
+ PrincipalCollection principals = ImmutablePrincipalCollection.ofSinglePrincipal("user1", "iniRealm");
Subject subject = new Subject.Builder(securityManager).principals(principals).buildSubject();
assertThat(subject).isNotNull();
diff --git a/web/src/test/java/org/apache/shiro/web/servlet/OncePerRequestFilterTest.java b/web/src/test/java/org/apache/shiro/web/servlet/OncePerRequestFilterTest.java
index 297abadeb..f18c10626 100644
--- a/web/src/test/java/org/apache/shiro/web/servlet/OncePerRequestFilterTest.java
+++ b/web/src/test/java/org/apache/shiro/web/servlet/OncePerRequestFilterTest.java
@@ -21,10 +21,10 @@ package org.apache.shiro.web.servlet;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.IOException;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/web/src/test/java/org/apache/shiro/web/servlet/ShiroHttpServletRequestTest.java b/web/src/test/java/org/apache/shiro/web/servlet/ShiroHttpServletRequestTest.java
index aa3b59e49..d0593129e 100644
--- a/web/src/test/java/org/apache/shiro/web/servlet/ShiroHttpServletRequestTest.java
+++ b/web/src/test/java/org/apache/shiro/web/servlet/ShiroHttpServletRequestTest.java
@@ -24,8 +24,8 @@ import org.apache.shiro.util.ThreadContext;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.concurrent.atomic.AtomicInteger;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/web/src/test/java/org/apache/shiro/web/servlet/SimpleCookieTest.java b/web/src/test/java/org/apache/shiro/web/servlet/SimpleCookieTest.java
index 4d89b107a..71bb97241 100644
--- a/web/src/test/java/org/apache/shiro/web/servlet/SimpleCookieTest.java
+++ b/web/src/test/java/org/apache/shiro/web/servlet/SimpleCookieTest.java
@@ -21,8 +21,8 @@ package org.apache.shiro.web.servlet;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.Locale;
import static org.easymock.EasyMock.createMock;
@@ -131,7 +131,7 @@ public class SimpleCookieTest {
public void testReadValueInvalidPath() throws Exception {
expect(mockRequest.getRequestURI()).andStubReturn("/foo/index.jsp");
expect(mockRequest.getCookies()).andStubReturn(
- new javax.servlet.http.Cookie[] {new javax.servlet.http.Cookie(this.cookie.getName(), "value")});
+ new jakarta.servlet.http.Cookie[] {new jakarta.servlet.http.Cookie(this.cookie.getName(), "value")});
replay(mockRequest);
replay(mockResponse);
@@ -143,7 +143,7 @@ public class SimpleCookieTest {
public void testReadValuePrefixPath() throws Exception {
expect(mockRequest.getRequestURI()).andStubReturn("/bar/index.jsp");
expect(mockRequest.getCookies()).andStubReturn(
- new javax.servlet.http.Cookie[] {new javax.servlet.http.Cookie(this.cookie.getName(), "value")});
+ new jakarta.servlet.http.Cookie[] {new jakarta.servlet.http.Cookie(this.cookie.getName(), "value")});
replay(mockRequest);
replay(mockResponse);
@@ -155,7 +155,7 @@ public class SimpleCookieTest {
public void testReadValueInvalidPrefixPath() throws Exception {
expect(mockRequest.getRequestURI()).andStubReturn("/foobar/index.jsp");
expect(mockRequest.getCookies()).andStubReturn(
- new javax.servlet.http.Cookie[] {new javax.servlet.http.Cookie(this.cookie.getName(), "value")});
+ new jakarta.servlet.http.Cookie[] {new jakarta.servlet.http.Cookie(this.cookie.getName(), "value")});
replay(mockRequest);
replay(mockResponse);
diff --git a/web/src/test/java/org/apache/shiro/web/session/HttpServletSessionTest.java b/web/src/test/java/org/apache/shiro/web/session/HttpServletSessionTest.java
index 2950584a2..a7b5af17a 100644
--- a/web/src/test/java/org/apache/shiro/web/session/HttpServletSessionTest.java
+++ b/web/src/test/java/org/apache/shiro/web/session/HttpServletSessionTest.java
@@ -22,7 +22,7 @@ import org.easymock.Capture;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpSession;
import static org.assertj.core.api.Assertions.assertThat;
import static org.easymock.EasyMock.captureInt;
diff --git a/web/src/test/java/org/apache/shiro/web/util/CorsUtilsTest.java b/web/src/test/java/org/apache/shiro/web/util/CorsUtilsTest.java
index fae30f01d..2508d2eb3 100644
--- a/web/src/test/java/org/apache/shiro/web/util/CorsUtilsTest.java
+++ b/web/src/test/java/org/apache/shiro/web/util/CorsUtilsTest.java
@@ -20,7 +20,7 @@ package org.apache.shiro.web.util;
import org.junit.jupiter.api.Test;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
diff --git a/web/src/test/resources/log4j2-test.xml b/web/src/test/resources/log4j2-test.xml
index 41b566dc6..c809ee880 100644
--- a/web/src/test/resources/log4j2-test.xml
+++ b/web/src/test/resources/log4j2-test.xml
@@ -49,7 +49,7 @@
<Logger name="org.apache" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
- <Logger name="net.sf.ehcache" level="warn" additivity="false">
+ <Logger name="org.ehcache" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.apache.shiro" level="warn" additivity="false">