做一个邮件反馈的时候遇到的,记录下来,与大家分享
最近一个项目要发送邮件,在前端页面点击按钮发送一封邮件到指定邮箱,前端按钮做好了点击事件,起初点击时
无法发送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] ,其中method为post,get,delete等。
port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里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");
这个配置表示所有的请求都需要登录才能通过,只有配置在这行上面的才不受这个影响,如果配置在这行下面将不会生效。所以我上面图中的配置是有误的,(请不要按上图的配置)
问题原因找到了,只要把配置的位置改变下就好啦!
都是一些小细节,需要注意。。。。