springBoot中shiro的302跳转问题怎么解决
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,本篇内容介绍了"springBoot中shiro的302跳转问题怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅
千家信息网最后更新 2025年01月20日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); //配置访问权限 LinkedHashMapfilterChainDefinitionMap=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安全错误
数据库的锁怎样保障安全
覆盖保障环节的网络安全态势
郑州思远网络技术有限公司
达梦数据库授权文件在哪
应用化学属于哪个数据库
数据库求偶数的平均值
30多转行做软件开发
常州vr软件开发
h2数据库老是重新连接
宁夏网络安全学习
云组态软件开发
网络安全培训后能干什么
是数据库数据字典的所有者
软件开发合同范本详细
c 如何存放数据库
广州曜月网络技术有限公司
网络安全低中高风险怎么处置
数据库结构分析入门
河南智金网络技术
cdn测试服务器
数据库建表字段可以为空
还原数据库显示未选择还原备份集
网络安全的不法行为
哪些场景用到了数据库
雪花算法数据库主键
学软件开发哪个大学好
非互联网的软件开发
崇明区管理软件开发创新服务
网络安全宣传周专题
apn能设置代理服务器吗
软件开发关键业务是什么