java工程积累——权限验证在Ajax中失效的解决方案

最近在公司做的项目一直测试和使用都很好,客户反响也很不错,但是,就在前两天,客户提出了一个bug,但是全队都愁眉不展,在今天做公交车的时候,我突然想到了一种可能,就是我们习以为常的ajax提交出了问题!

起因:

需求:在判断用户session有没有超时的情况,我们使用的是在所有的请求前通过aop进行判断,如果session中,用户登录信息丢失,则重新登录,否则继续!

bug情况:在页面提交,跳转下正常判断,但是在用户session过期后,直接使用Ajax提交时,提交失败!

初期方案:

方案1:

修改session失效时间(未治本)

方案2:

抽象公共js,先验证session是否登陆,未登录,则返回登陆页面(个人认为最好,因为在不改动原有的基础上,增加,而不是修改)

方案3:

抽象公共ajax方案,用到ajax方法的,统一调用这个方法

利弊分析:

修改session失效时间(未治本)治标不治本,还会导致系统性能下降,应该是调试到一个合适的时间,或者用cookie方案代替!

抽象公共js, 抽象公共ajax方案,每个调用都需要更改,改动太大,造成系统维护工作增加!

更优雅方案:

首先建了个拦截器,来判断session超时。用户登录后会保存用户信息在一个session里,在session的监听里,session超时会销毁保存在session里的用户信息,而拦截器就通过session里是否有用户信息来判断session超时。(我总觉得这种方法不怎么好。不知还有什么更好的办法。)

拦截器是spring-mvc的拦截器,在拦截器里判断是不是ajax请求:

<span style="font-size:18px;">1.	public boolean preHandle(HttpServletRequest request,
2.	             HttpServletResponse response, Object handler) throws Exception
3.	     {
4.	         if (request.getSession().getAttribute("user") == null)//判断session里是否有用户信息
5.	            {
6.	             if (request.getHeader("x-requested-with") != null
7.	                     && request.getHeader("x-requested-with")
8.	                             .equalsIgnoreCase("XMLHttpRequest"))//如果是ajax请求响应头会有,x-requested-with;
9.	             {
10.	                 response.setHeader("sessionstatus", "timeout");//在响应头设置session状态
11.	                 return false;
12.	             }
13.
14.	         }
15.	         return true;
16.	     }
</span>

这样,如果session超时,而且是ajax请求,就会在响应头里,sessionstatus有一个timeout;

再用一个全局的方法来处理,session超时要跳转的页面。

jquery 可以用$.ajaxSetup 方法,ext也有类似的方法

<span style="font-size:18px;">1.	//全局的ajax访问,处理ajax清求时sesion超时
2.	         $.ajaxSetup({
3.	             contentType:"application/x-www-form-urlencoded;charset=utf-8",
4.	             complete:function(XMLHttpRequest,textStatus){
5.	                     var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,sessionstatus,
6.	                     if(sessionstatus=="timeout"){
7.	                                 //如果超时就处理 ,指定要跳转的页面
8.	                                         window.location.replace("${path}/common/login.do");
9.	                                 }
10.	                      }
11.	             }
12.	           });
</span>

总结:

一个合格的工程师,可以为系统bug及时提供解决方案,但是一个优秀的工程师,绝不止步于此,他会分析各个方案的优劣,选择一种更优雅的方案,或者提供这种方案!

当我们适应了合格的工程师这个称谓,我们是否在朝着优秀的工程师迈进呢?

时间: 2024-10-17 05:06:10

java工程积累——权限验证在Ajax中失效的解决方案的相关文章

java工程积累——前台页面的统一校验

在项目中,我们面临这样的问题,就是如果在前台做抽象,大家想想后台代码的抽象,我们耳熟能详,但是前台的抽象,我们是如何做的呢?恐怕这个问题,如果是第一次抛给自己,自己也很惶恐,就是,我们不是对应一个业务写好一个页面吗?以前从来没有想过抽象,这里,我就要说,那是咱们最初级的方式,今天带大家一起见证先比较靠谱一种方式! 回顾 我们回顾下html编码的历程,在web1.0时代,我们面向的大多是静态页面,这时候,能够展示出来就好,由于网速的限制,电脑处理能力的约束,我们只能把什么都写在一起,但是随着时间的

java工程积累——java 反射 invoke

引: 在java项目中,我们听了很多ORM的概念,我就一直耿耿于怀,怎么就从rs转换成了对象呢?难道要写非常多的判断吗?答案肯定是否定,我们就要探索怎么解决这个问题,刚好在研究我们系统底层架构的时候,挖掘了这一点,现在和大家分享: 深入: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能:在运行时判定任意一个对象

java工程积累——项目管理:破窗理论

年后这段时间,我一直带着项目,在项目中,最后总会遇到这样那样的问题,搞得自己有些狼狈!在向我的恩师求助后,我翻阅了一些资料和书籍,最后找到了一个特别有意思的问题!就是咱们的题目,破窗理论,咱们一起来探讨探讨. 百科-破窗理论: 一个房子如果窗户破了,没有人去修补,隔不久,其它的窗户也会莫名其妙地被人打破:一面墙,如果出现一些涂鸦没有被清洗掉,很快的,墙上就布满了乱七八糟.不堪入目的东西:一个很干净的地方,人们不好意思丢垃圾,但是一旦地上有垃圾出现之后,人就会毫不犹豫地抛,丝毫不觉羞愧. 当然,这

java工程积累——加密hibernate数据源连接符

最近很多公司因为安全问题被各种折磨,我们公司出于这方面的考虑,需要对数据库连接进行加密,在网上很容易就找到了解决方案,在这里分享给大家,但是这个解决方案的内容,也引起了我对程序的思考! 解决方案: 环境要求: Spring管理数据库连接 配置步骤 1,  配置spring文件 <span style="font-size:18px;"><!-加密解密类--> <!-加密解密类:因为它继承了配置类,所以它可以更改配置规则--> <beanclas

java工程积累——如何处理Tomcat内存溢出

在项目的部署中,我们设置不当,有时会常常遇到一个bug,就是内存溢出,而在百般调试,释放资源之后,却还是没有解决,这时,不要着急,我们静下心来,在数据量,代码量都不多情况下,并且不是很经常出现这bug时,我们要进行一下小小的总结,来处理这类事件的发生! 错误 我们先看,内存溢出的提示,一般会有三种,我们一一看看: 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三种情况: 1.OutOfMemoryError: Java heap space 2.OutOfMemoryError

java工程积累——saas之multi-tenancy解析

最近做的项目涉及到比较深入的一部分,就是定义客户关系,在我们的商讨中,我们决定,采用服务商的模式,就是我们是基础服务商,由客户组合服务,向客户提供基于云端的服务支持!这就自然引出了以下概念: saas百科: SaaS是Software-as-a-Service(软件即服务)的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式.它与"on-demand software"(按需软件),the application service provide

java工程积累——树形结构的操作

最近一直被树形结构整的很头大,又是递归,又是循环,但是,好在我们在经历了千辛万苦后,终于弄出来了,其实就是组织机构的常规操作,有些是我们过度设计,有些是我们想错了,而对数的逻辑读取,我们就属于想错了的类型,今天拿出来和大家分享,主要是树形结构在数据库的读取问题! 原始: 在最开始,我们对树的查询,肯定是从最简单的select开始,我们现在回顾一下: 定义: 表名:tb_tree 字段:id(主键),title(标题),parentId(父节点id) 举例: 1.查找树中的所有顶级父节点(辈份最长

$(this)在ajax中无效的解决方案

在ajax方法里写$(this)指向的是最近调用它的jquery对象,所以这里的$(this)指的是ajax对象,而不是$(".enter_caozuo").find(".gd"),要想解决这个问题,就需考虑增加一个中间变量传递这个对象,示例:$(".enter_caozuo").find(".gd").click(function(){var mythis = $(this); $.ajax({type:"GET&

margin:0 auto在IE中失效的解决方案

转自:http://www.cnblogs.com/hongchenok/archive/2012/11/29/2795041.html 最近在开发项目的时候,发现在火狐浏览器中设置外容器margin:0 auto是可行的. 但是到了IE6,IE7,IE8则出现了不能居中的现象. 开始也没怎么在意,刚刚在浏览网页的时候看到这篇文章,帮我解决了这个疑问. 解决方案如下: 很多人都忽略了“文档类型”.下面就是正确设置的文档类型了. <!DOCTYPE html PUBLIC “-//W3C//DTD