I want to handle errors differently for AJAX requests vs normal requests.
How do I identify whether a request is AJAX or not in Struts2 actions ?
The other alternative, which I use is to add the parameter ajax=true to all Ajax url strings and test in my action with an isAjax() method.
You should check if the Request Header X-Requested-With
is present and equals to XMLHttpRequest
.
Note that not all the AJAX requests have this header, for example Struts2 Dojo
requests don't send it; if you instead are generating AJAX calls with Struts2-jQuery
(or with any other new AJAX framework), it is there.
You can check if it's present by using Firebug's Net module
... for example, when you vote on Stack Overflow ;)
To check it from within a Struts2 Action
, you need to implement the ServletRequestAware
interface, then get the Request
and check if that particular header is there like this:
public class MyAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public HttpServletRequest getRequest() {
return this.request;
}
public String execute() throws Exception{
boolean ajax = "XMLHttpRequest".equals(
getRequest().getHeader("X-Requested-With"));
if (ajax)
log.debug("This is an AJAX request");
else
log.debug("This is an ordinary request");
return SUCCESS;
}
}
Note that you can obtain the request via ActionContext too, without implementing the ServletRequestAware interface, but it is not the recommended way:
HttpServletRequest request = ServletActionContext.getRequest();