springBoot中shiro的302跳转问题怎么解决
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,本篇内容介绍了"springBoot中shiro的302跳转问题怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅
千家信息网最后更新 2025年11月09日springBoot中shiro的302跳转问题怎么解决
本篇内容介绍了"springBoot中shiro的302跳转问题怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
springBoot前后端分离项目shiro的302跳转
项目是使用的springboot ,使用的shiro做的用户鉴权。在前端请求时当用户信息失效,session失效的时候,shiro会重定向到配置的login.jsp 页面,或者是自己配置的logUrl。
因是前后端分离项目,与静态资源文件分离,固重定向后,接着会404。
经过查找网上配置资料,发现302原因是
FormAuthenticationFilter中onAccessDenied 方法做了相应处理。那知道问题所在,就可以有解决方了。
重写 onAccessDenied 方法,针对自己的业务做相应处理,然后在加载过滤器配置的时候添加到配置中。
以下是代码
增加类ShiroFormAuthenticationFilter 重新方法
package com.oilpay.wallet.shiro; import com.alibaba.fastjson.JSONObject;import com.oilpay.wallet.interceptor.TokenInterceptor;import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.http.HttpStatus;import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.PrintWriter; /** * * 重写权限验证问题,登录失效后返回状态码 * */public class ShiroFormAuthenticationFilter extends FormAuthenticationFilter { Logger logger = LoggerFactory.getLogger(TokenInterceptor.class); @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { if (isLoginRequest(request, response)) { if (isLoginSubmission(request, response)) { if (logger.isTraceEnabled()) { logger.trace("Login submission detected. Attempting to execute login."); } return executeLogin(request, response); } else { if (logger.isTraceEnabled()) { logger.trace("Login page view."); } //allow them to see the login page ;) return true; } } else { HttpServletRequest req = (HttpServletRequest)request; HttpServletResponse resp = (HttpServletResponse) response; if(req.getMethod().equals(RequestMethod.OPTIONS.name())) { resp.setStatus(HttpStatus.OK.value()); return true; } if (logger.isTraceEnabled()) { logger.trace("Attempting to access a path which requires authentication. Forwarding to the " + "Authentication url [" + getLoginUrl() + "]"); } //前端Ajax请求时requestHeader里面带一些参数,用于判断是否是前端的请求 String test= req.getHeader("test"); if (test!= null || req.getHeader("wkcheck") != null) { //前端Ajax请求,则不会重定向 resp.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin")); resp.setHeader("Access-Control-Allow-Credentials", "true"); resp.setContentType("application/json; charset=utf-8"); resp.setCharacterEncoding("UTF-8"); PrintWriter out = resp.getWriter(); JSONObject result = new JSONObject(); result.put("message", "登录失效"); result.put("resultCode", 1000); out.println(result); out.flush(); out.close(); } else { saveRequestAndRedirectToLogin(request, response); } return false; } }}在过滤器配置中添加
@Bean(name="shiroFilter") public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager manager) { ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(manager); //配置访问权限 LinkedHashMap filterChainDefinitionMap=new LinkedHashMap(); filterChainDefinitionMap.put("/common/logout", "logout"); filterChainDefinitionMap.put("/","anon"); filterChainDefinitionMap.put("/common/login","anon"); filterChainDefinitionMap.put("/common/*","anon"); filterChainDefinitionMap.put("/imageVerifyCode/getCode", "anon"); filterChainDefinitionMap.put("/sendVerifyCode/register", "anon"); filterChainDefinitionMap.put("/sendVerifyCode/resetLoginPwd", "anon"); filterChainDefinitionMap.put("/**", "authc"); //表示需要认证才可以访问 LinkedHashMap filtsMap=new LinkedHashMap(); filtsMap.put("authc",new ShiroFormAuthenticationFilter() ); shiroFilterFactoryBean.setFilters(filtsMap); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } 至此,可以按照自己的需求做相应处理。
关于shiro 总是302的问题
我的原因是使用了authc,由于autuc对应的过滤器FormAuthenticationFilter中onAccessDenied方法返回的值都为false,所以访问url时会一直进行循环重定向,解决方案:重写onAccessDenied方法,并注入到shiroFiter中。
附上shiro配置文件
/login.html=anon /js/**=anon /templates/**=anon /assets/**=anon /css/**=anon /index.do=authc /user/login.do=anon /**=authc
重写onAccessDenied方法
package com.jd.risk.giasys.service.realm.filter;import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;/** * Created by jianghaisong on 2017/12/17. */public class MyFilter extends FormAuthenticationFilter{ private Logger log = LoggerFactory.getLogger(MyFilter.class); protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { //进行重写,业务逻辑 }}"springBoot中shiro的302跳转问题怎么解决"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
配置
方法
问题
前端
过滤器
项目
处理
业务
内容
原因
文件
时候
更多
权限
用户
知识
登录
实用
学有所成
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器网站空间怎么设置
广州服务器机房
数据中心网络安全发展趋势
linux服务器太卡怎么排查
软件开发编程包括哪些方面
战锤3无法访问服务器粘贴
废料整合数据库
宿迁软件开发价格实惠
土木软件开发公司 有前景吗
体感拍照软件开发
教育培训管理系统软件开发
相比其他商用关系型数据库产品
600服务器机柜厂家
sql数据库找不到服务
视瀚SQL数据库
安卓手机网络安全认证
网络安全科技核心
即时通讯软件开发需要什么条件
网络技术应用的通过率
安拍玩软件开发公司
魔兽世界新服务器开服表
linux 做服务器
学软件开发的去当文员
定点零售药店网络安全自查表
抚湖享游网络技术有限公司
网络安全的重要性宣讲稿
网络安全攻防对决
企业邮箱服务器架构
数据库怎么看用户是不是被锁
上海归虹网络技术有限公司