Shiro中javax.servlet.ServletRequest和javax.servlet.ServletResponse类冲突问题解决

本文介绍了如何在SpringBoot3.0及以上版本中,处理Shiro与Java17及JakartaEE命名空间的兼容问题,涉及修改Shiro依赖和排除jakarta版本冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在SpringBoot3.0以上版本,需要Java 17,并且使用的是Jakarta EE命名空间。

为了解决shiro中javax.servlet.ServletRequest、javax.servlet.ServletResponse与现在的Jakarta.servlet.ServletRequest、Jakarta.servlet.ServletResponse冲突问题,

可以修改Shiro的依赖

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.13.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
        </exclusion>
    </exclusions>
    <classifier>jakarta</classifier>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.13.0</version>
    <classifier>jakarta</classifier>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.13.0</version>
    <classifier>jakarta</classifier>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

shiro2.0版本还在测试中,后续会使用Jakarta的命名空间。

``` package com.example.zeinengjie.Util; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.StringUtils; import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; import org.slf4j.Logger; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class JwtFilter extends BasicHttpAuthenticationFilter { private static final Logger logger = org.slf4j.LoggerFactory.getLogger(JwtFilter.class); /** * **判断是否携带 Token(进行拦截)** */ @Override protected boolean isLoginAttempt(ServletRequest request, ServletResponse response) { HttpServletRequest httpServletRequest = (HttpServletRequest) request; String token = httpServletRequest.getHeader("Authorization"); logger.info("isLoginAttempt"+"->"+token); return StringUtils.hasText(token); } /** * **执行 Shiro 认证逻辑** */ @Override protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception { HttpServletRequest httpServletRequest = (HttpServletRequest) request; String token = httpServletRequest.getHeader("Authorization"); logger.info("executeLogin"+"->"+token); if (token == null) { return false; // 没有 Token,直接拦截 } AuthenticationToken jwtToken = new JwtToken(token); Subject subject = getSubject(request, response); subject.login(jwtToken); // 执行 Shiro 认证 return true; } },package com.example.zeinengjie.Util; import org.apache.shiro.realm.Realm; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition; import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.slf4j.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; import java.util.LinkedHashMap; import java.util.Map; @Configuration public class ShiroConfig { Logger logger = org.slf4j.LoggerFactory.getLogger(ShiroConfig.class); // 创建 SecurityManager,Shiro 的核心组件 @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 配置使用 JwtRealm 来进行认证 securityManager.setRealm(jwtRealm()); logger.info("securityManager"); return securityManager; } // 创建 JwtRealm 实例 @Bean public Realm jwtRealm() { return new JwtRealm(); } // 配置 ShiroFilterFactoryBean @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager); logger.info("shiroFilter"); Map<String, Filter> filterMap = new LinkedHashMap<>(); filterMap.put("jwt", new JwtFilter()); // 使用 JWT 过滤器 bean.setFilters(filterMap); Map<String, String> filterRuleMap = new LinkedHashMap<>(); filterRuleMap.put("/login", "anon"); // 允许登录 filterRuleMap.put("/user/**", "jwt"); // 需要 Token 认证 filterRuleMap.put("/zuhao", "jwt,roles[test]"); // 需要 Token + admin 角色 bean.setFilterChainDefinitionMap(filterRuleMap); return bean; } }```为什么我的 String token = httpServletRequest.getHeader("Authorization"),会为空,Authorization被拦截
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值