2017/06/14这一天,是我玩Shiro安全框架最刻骨铭心的一天。因为Shiro今天给我深深的补了一刀,在这儿我也给各位补一刀吧,其实问题很简单,解决方式也极其简单,只是给各位分享一下这个错误,纯属给各位长点经验值。

  之前自己搭建了一套系统拿来练手,将Shiro请到这套系统中作为了第一道防锁线,今天闲来无事想加个短信验证码上去,就登陆了中国建网,还好,之前玩剩下的还有3条短信,于是就小忙了起来,找到很久以前玩过的SMS短信发送的那段代码,但是代码很乱很脏,因为那时候不懂事儿瞎写的,现在整理了一下我就不客气了,给大家贴在这儿了,哈哈~~由于这是一段模版代码,只需把自己在短信平台注册的用户名和接口调用的秘匙补上去,还有将你想要发送的随机验证码和短信模板内容告诉接口就OK。

   public static String sendCode(String url,String encoded,String mobile,String SMSTemplate){
//获取随机6位验证码
String code = VerifyCodeUtils.generateVerifyCode(6);
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);
post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset="+encoded);
NameValuePair[] data = {
new NameValuePair("Uid", 用户名),
new NameValuePair("Key", 秘匙),
new NameValuePair("smsMob", mobile),
new NameValuePair("smsText", "验证码:"+code+SMSTemplate)};
post.setRequestBody(data);
try {
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println("statusCode:" + statusCode);
for (Header h : headers) {
System.out.println(h.toString());
}
String result = new String(post.getResponseBodyAsString().getBytes("gbk"));
System.out.println(result); // 打印返回消息状态 post.releaseConnection();
} catch (Exception e) {
e.printStackTrace();
} return code;
}

    需求:用户登录要求必须输入正确的用户名和密码,最后还要二次验证通过,发送短信验证码来校验该用户是否合法?

  需求分析及场景还原:

    由于我的登录功能是通过shiro安全框架来实现的,所以短信验证码功能就必须通过发送ajax异步请求后台,将系统发送出去的短信验证码保存在了session中,然后在用户认证过程中取出登录用户在页面输入的验证码对比即可。但是,不幸的是,我不够老道不够细心经验不足,导致shiro让我围着它转了将近一天。点击按钮获取短信验证码,在这儿我是通过给按钮绑定点击事件来发送ajax请求,后台通过调用上面抽取的工具方法来给指定用户发送短信内容,逻辑没错吧。就这么简单,为什么我就能玩出302 Found呢,也许大家还不清楚302 Found是什么意思吧?我也不说网上那些绕来绕去的说法,我的理解就是资源存在,但是由于重定向设定权限而导致未正确跳转至目标链接。找了一天资料,学了各种说法,也试了各种方法,但是最后解决问题的是一句出乎意料的简单配置,下面就给大家把现场布置一下吧,302 Found的奇妙出现,我竟然分析了那么久。

    你们不要怀疑我后台代码写错了或是前端代码写错了,没有的事儿。当我一点击按钮ajax方法不执行,在浏览器中打断点各种尝试走到发送ajax的那段代码就跳过去,请求也不发,后台代码肯定也不执行,为啥,难道我前端js代码写错了?不会啊,昨天还刚把异步加载菜单的那玩意儿给搞出来了,js代码写了一整天也没出什么意外,今天就写这么几行简单的js代码不会太过分吧。于是就各种打断点各种分析,我这个人吧,在开发中只要是我代码的执行逻辑没问题,我就会把他测试到烂也得把问题找出来,行这次我输,实在是耗不起啊,也不是太大的问题,就这么耗着不值得。叫师兄过来看看吧,也许当局者迷,他过来也是一顿断点各种走流程,没错啊你这咋回事啊,奇了怪了~~~我看他也被这看似正常内藏大坑的代码搞无语了,我就说行吧,我再自个儿琢磨一下吧,你先把你的活干了。

    接着我又趴在桌子上想啊想啊,登录能正常调用,我发送个ajax不至于这么绝吧,一杯水下肚,巧了,Shiro在跟我开玩笑呢,你利用了我,就得时刻注意我的一举一动,原来我是把发送短信验证码的方法给拦截了,哎吆我滴孩啊,这种错误不是技术惹的祸,而是你就踩过这坑没,只要你玩过这功能玩过这样的业务,你就会,其实我才在IT界混了短短2年多,哪有那么深的手法啊,在这里我不是绕圈子给大家炫我做的功能,而是想给大家分享这种错误,我希望读到这篇博文的朋友有个印象,以后遇到足够你装了,瞬间解决问题,咱们这行不就是拿经验混饭吃嘛。

  解决方式:配置忽略项。在spring管理Shiro安全框架的配置文件中配置获取验证码的方法,让它可以匿名访问即可,就是用户没有登录,也可以发送请求到后台执行方法。

      <!-- shiro连接约束配置 -->
<property name="filterChainDefinitions">
<value>
<!-- 对静态资源设置允许匿名访问 -->
/images/** = anon
/js/** = anon
/css/** = anon
<!-- 可匿名访问路径,例如:短信验证码、登录连接、退出连接等 -->
/auth/login = anon
/user/sendCode = anon
<!-- 剩余其他路径,必须认证通过才可以访问 -->
/** = authc
</value>
</property>

    最后提醒大家,以后用到安全框架,就请善待它,这种错误你是学不到的,只有下过坑才能尝到那种美味。

    

Shiro眼皮下玩ajax,玩出302 Found的更多相关文章

  1. Shiro眼皮下玩ajax,玩出302 Found(实践得经验)

    2017/06/14这一天,是我玩Shiro安全框架最刻骨铭心的一天.因为Shiro今天给我深深的补了一刀,在这儿我也给各位补一刀吧,其实问题很简单,解决方式也极其简单,只是给各位分享一下这个错误,纯 ...

  2. 使用Ajax出现302 Moved Temporarily

    现象:在用ajax发送请求时,各种参数都对,地址也对,一直进error返回parse error. 使用浏览器发现ajax请求的header的响应码处:302 Moved Temporarily 百度 ...

  3. ajax与302响应

    在ajax请求中,如果服务器端的响应是302 Found,在ajax的回调函数中能够获取这个状态码吗?能够从Response Headers中得到Location的值进行重定向吗?让我们来一起看看实际 ...

  4. ajax和302(转)

    原文:http://www.cnblogs.com/dudu/p/ajax_302_found.html 在ajax请求中,如果服务器端的响应是302 Found,在ajax的回调函数中能够获取这个状 ...

  5. shiro session过期后ajax请求跳转(转)

    配置了 Shrio框架,session也集成进去了 ,发现问题session会话过期,点击页面,一直请求失败.本来想集成拦截器,过滤器,但是已经用了shiro框架,sessionDestroyed 方 ...

  6. IronPython+Anthem.Net也玩 Ajax!

    在 IronPython 搭建的项目中(也可以是和 C# 的混合项目,详见我前一篇 post),可以使用 Anthem.NET 来轻松实现 Ajax 功能. 下面我简单的演示一个例子:在页面上我们分别 ...

  7. Maven + SSM + Kaptcha 实现用户登录时验证码的获取(问题:302 Found)

    pom.xml(对Kaptcha.jar的引用) <!-- 验证码 jar kaptcha--> <dependency> <groupId>com.github. ...

  8. ajax异步请求302

    我们知道,只有请求成功ajax才会进行回调处理,具体状态码为 status >= 200 && status < 300 || status === 304; 这一点通过查 ...

  9. jQuery ajax 302跨域

    一.ajax 302 ajax用于异步获取服务器数据,但是某天有这么一个使用场景: > 基于安全考虑,登录的用户的信息失效时,系统的所有ajax接口都由服务器直接重定向到系统的登录页面,此时登录 ...

随机推荐

  1. WPF学习笔记(2):准确定位弹出窗

    效果图:使弹出的列表框紧随在单元格的下边缘. 第一次,尝试在XAML中设置Popup的定位方式:Placement="Mouse".基本能够定位,但当在输入前移动鼠标,列表框就会随 ...

  2. google breakpad for linux(2)

    breakpad 是什么 breakpad 是一个包含了一系列库文件和工具的开源工具包,使用它可以帮助我们在程序崩溃后进行一系列的后续处理,如现场的保存(core dump),及事后分析(重建 cal ...

  3. [HAOI2018]染色(容斥+NTT)

    补充一篇详细得不能再详细的题解,比如让我自己看懂. 可能与前面的题解有些相同,我想补充一下自己的想法. 显然,最多 \(K\) 最大为 \(N=min(\lfloor \frac nS\rfloor, ...

  4. 一步步Cobol 400上手自学入门教程05 - 表

    在COBOL中有几类典型结构的表.这几类典型结构的表在大体上可分为下标表和索引表两大类.另外,根据表的重复次数定义又有定长表和变长表.此外,表还允许嵌套,因此还有嵌套表.这几类表均符合表的基本定义,都 ...

  5. iOS-项目创建多个target

    在开发中,有时需要两个或多个APP版本,每个版本的改动,不是很多,但是需要另外打包,那么我们就有两套方案: 1.重新开发,把代码复制一遍,然后在修改: 2.用一套代码,根据需求生成不同的包: 我们一般 ...

  6. android studio 一直卡在Gradle:Build Running的解决办法

    转:android studio 一直卡在Gradle:Build Running的解决办法   在使用AS开发安卓应用程序的时候经常会遇到Gradle build running一直在运行甚至卡死的 ...

  7. CentOS安装与配置Powerline插件

    Powerline powerline 可用于美化终端和vim编辑器的插件,它是Python开发的,为多个应用(bash,zsh,tmux等)提供statusline. 下面我们在CentOS上为vi ...

  8. Firefox火狐 浏览器接口调试工具 JSON 格式化

    作为一名“IT界”的淫才,还是主攻Web端的淫才,相信大家经常会联调各种接口! 如今APP猖狂的年代接口联调更为频繁,当然我们常用于Firefox火狐 浏览器,所以这里主要讲Firefox火狐 浏览器 ...

  9. C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转

    对于一个空类,编译器默认产生4个成员函数:默认构造函数.析构函数.拷贝构造函数和赋值函数.1.构造函数:构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存. ...

  10. 【从0到1学Web前端】CSS定位问题一(盒模型,浮动,BFC) 分类: HTML+CSS 2015-05-27 22:24 813人阅读 评论(1) 收藏

    引子: 在谈到css定位问题的时候先来看一个小问题: 已知宽度(假如:100px)div框,水平居中,左右两百年的分别使用div框填充.且左右div自适应. 效果如下图: 这个问题的难点主要是浏览器宽 ...