使用struts2处理普通http请求和ajax请求的对比

</pre>最近在尝试写一个简单的博客,用到了struts2框架。自己写了一个登录拦截器,继承自struts2的MethodFilterInterceptor,用来限制当前用户的一些操作,在用户进行写操作时(评论、写博客等),先让用户登录,即跳转到登录界面。之所以继承这个拦截器,因为这个拦截器可以灵活配置一些不需要拦截的方法(浏览博客等)。之前普通的action被登录拦截器拦截时,如果未登录,直接返回 “login” 字符串,在struts2的配置文件中为这个字符串配置了对应的登录页面,然后即可自动跳转到登录界面。可是,我在程序中有些操作使用了 ajax 方式提交请求(收藏博客、删除收藏、关注、取消关注等),于是在拦截器中检测到用户未登录时,如果只返回简单的“login”字符串,那么程序不会自动跳转到登录页面,因为ajax是异步更新网页,而不是传统的刷新整个网页。ajax对返回的内容都解析为普通的字符串,因此无法自动跳转登录界面。正确的做法是在拦截器中检测,如果发现是ajax请求,就进行单独处理。以下代码即用来检测是否是ajax请求:</p><p><span style="font-size:18px;"></span><pre name="code" class="java">request.getHeader("X-Requested-With") != null 
		&& request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")
如果是ajax请求,而且用户未登录,就在拦截器中使用response对象向前端页面写一个未登录的标识(“isNotLogin”),然后在页面上获取这个返回结果,直接使用js的window.location="";重定向到登录页面即可。代码如下:

//如果是ajax请求
if(request.getHeader("X-Requested-With") != null 
<span style="white-space:pre">		</span>&& request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")){
			PrintWriter out = response.getWriter();
			out.print("isNotLogin");//返回一个标识给前端
			out.flush();
			out.close();
			return null;
}

页面上的js代码为:

//使用jQuery.ajaxSetup() 方法设置全局 AJAX 默认选项,捕获刚刚在拦截器里传递的值
		$.ajaxSetup({  
		    cache: false, //关闭ajax缓存
		    contentType:"application/x-www-form-urlencoded;charset=utf-8",   
		    //complete:表示完成请求后触发。
		    //即在success或error触发后触发
		    //XHR:XMLHttpReques
		    complete:function(XHR,textStatus){ 
		    	var resText = XHR.responseText; 
		    
		    	//isNotLogin标识用户当前未登录,需要将页面转到登录页面
		        if(resText=='isNotLogin'){ 
		        	window.location="LoginAction_toLoginPage";
		        }
		    }   
		}); 

这样就可以正确的处理ajax请求了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值