前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shiro眼皮下玩ajax,玩出302 Found

Shiro眼皮下玩ajax,玩出302 Found

作者头像
赵小忠
发布2018-01-24 19:30:08
1K0
发布2018-01-24 19:30:08
举报
文章被收录于专栏:禁心尽力禁心尽力
代码语言:javascript
复制
 1   public static String sendCode(String url,String encoded,String mobile,String SMSTemplate){
 2         //获取随机6位验证码
 3         String code = VerifyCodeUtils.generateVerifyCode(6);
 4         HttpClient client = new HttpClient();
 5         PostMethod post = new PostMethod(url);
 6         post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset="+encoded);
 7         NameValuePair[] data = { 
 8                 new NameValuePair("Uid", 用户名), 
 9                 new NameValuePair("Key", 秘匙),
10                 new NameValuePair("smsMob", mobile), 
11                 new NameValuePair("smsText", "验证码:"+code+SMSTemplate)};
12         post.setRequestBody(data);
13         try {
14             client.executeMethod(post);
15             Header[] headers = post.getResponseHeaders();
16             int statusCode = post.getStatusCode();
17             System.out.println("statusCode:" + statusCode);
18             for (Header h : headers) {
19                 System.out.println(h.toString());
20             }
21             String result = new String(post.getResponseBodyAsString().getBytes("gbk"));
22             System.out.println(result); // 打印返回消息状态
23 
24             post.releaseConnection();
25         } catch (Exception e) {
26             e.printStackTrace();
27         }
28         
29         return code;
30     }

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

  需求分析及场景还原:

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

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

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

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

代码语言:javascript
复制
 1      <!-- shiro连接约束配置 -->
 2         <property name="filterChainDefinitions">
 3             <value>
 4                 <!-- 对静态资源设置允许匿名访问 -->
 5                 /images/** = anon
 6                 /js/** = anon
 7                 /css/** = anon
 8                 <!-- 可匿名访问路径,例如:短信验证码、登录连接、退出连接等 -->
 9                 /auth/login = anon
10                 /user/sendCode = anon            
11                 <!-- 剩余其他路径,必须认证通过才可以访问 -->
12                 /** = authc
13             </value>
14         </property>

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-06-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档