shiro引发的问题(302 Found)

做一个邮件反馈的时候遇到的,记录下来,与大家分享

最近一个项目要发送邮件,在前端页面点击按钮发送一封邮件到指定邮箱,前端按钮做好了点击事件,起初点击时

无法发送ajax请求,页面上的ajax无法发出去,经过查看请求头发现


很奇怪的状态码,302错误,302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向,说明在请求的过程中因为某种原因改变了请求的资源位置。

经过排查,前端页面没有毛病。每次请求都没成功发出,猜想是被拦截了 。忽然想起这个请求是在用户未登录状态下发起的,猜想是因为shiro验证授权拦截了请求导致302的,便在登录状态下发送请求,发现能正常访问,

先了解下shiro的拦截器,Shiro内置的FilterChain有以下几种:


我们根据需求使用不同的过滤器进行权限的检查。

anon:例子/admins/**=anon 没有参数,表示可以匿名使用。

authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数

roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。

rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中methodpost,get,delete等。

port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议httphttps等,serverName是你访问的host,8081url配置里port的端口,queryString

是你访问的url里的?后面的参数。

authcBasic例如/admins/user/**=authcBasic没有参数表示httpBasic认证

ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https

user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查

注:anon,authcBasic,auchc,user是认证过滤器,

perms,roles,ssl,rest,port是授权过滤器


302解决方案:
配置忽略项,即配置某些请求不需要进行权限检查,可以匿名访问。(请注意,下图的配置有问题,下面会说明具体情况)


= anon表示不进行权限检查,允许匿名访问

本以为在上述配置中加入后,应该能正确请求了,但出乎意料的是,仍然无法发出ajax,依旧错误302.猜想是配置没有生效,在重新编译后仍无法生效,确认配置无误后,只可能是这个配置被覆盖了,

注意:shiro的权限检查配置是有顺序的!!!!

加载顺序从上往下,当上门的加载后,下面的重复的配置将会被覆盖,下面的不再生效!!!

检查可发现filterChainDefinitionMap中有一项配置:

filterChainDefinitionMap.put("/**", "authc");

这个配置表示所有的请求都需要登录才能通过,只有配置在这行上面的才不受这个影响,如果配置在这行下面将不会生效。所以我上面图中的配置是有误的,(请不要按上图的配置)

问题原因找到了,只要把配置的位置改变下就好啦!


都是一些小细节,需要注意。。。。



评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值