Server distinct ajax request whether sync or async

两种请求在请求的Header不同,Ajax 异步请求比传统的同步请求多了一个头参数

  1. 传统同步请求参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    accept text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
    accept-charset gb2312,utf-8;q=0.7,*;q=0.7
    accept-encoding gzip,deflate
    accept-language zh-cn,zh;q=0.5
    cache-control max-age=0
    connection keep-alive
    cookie JSESSIONID=1A3BED3F593EA9747C9FDA16D309AF6B
    host 192.168.101.72:8080
    keep-alive 300
    referer http://192.168.101.72:8080/htfsweb/spring_security_login
    user-agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.15) Gecko/2009101601 Firefox/3.0.15 (.NET CLR 3.5.30729)
  2. Ajax 异步请求方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    accept /
    accept-language zh-cn
    referer http://192.168.101.72:8080/scm/?token=3b194bff23bf6acecea5661ac8e14c51
    x-requested-with XMLHttpRequest
    content-type application/x-www-form-urlencoded,text/javascript
    accept-encoding gzip, deflate
    user-agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; QQDownload 598; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; CIBA; .NET CLR 1.1.4322; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)
    host 192.168.101.72:8080
    content-length 233
    connection Keep-Alive
    cache-control no-cache
    cookie CSS=undefined; JSESSIONID=1B9AC25036290F7FB6823CCE1A24E541

可以看到 Ajax 请求多了个 x-requested-with ,可以利用它,request.getHeader("x-requested-with"); 为 null,则为传统同步请求,为 XMLHttpRequest,则为 Ajax 异步请求。

下面是Struts拦截器示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Override
public String intercept(ActionInvocation invocation) throws Exception {

ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
User user = (User) session.get(Constants.SESSION_USER_KEY);
if (user == null) {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
PrintWriter pw = response.getWriter();
String flag = "";

// 对ajax请求的拦截
if (request.getHeader("X-Requested-With") != null
&& request.getHeader("X-Requested-With").equalsIgnoreCase(
"XMLHttpRequest")) {
response.setCharacterEncoding("text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
flag = "9999";
pw.write(flag);
return null;

// 不是异步请求的拦截
} else {
response.setCharacterEncoding("text/html;charset=utf-8");
response.sendRedirect("/businessTest/login.jsp");
return "login";
}
}
return invocation.invoke();
}