[Servlet] Ajax 요청 처리가 완료되었는데도 404에러가 발생할 때

Published: by Creative Commons Licence

$.ajax({
  type: "POST",
  url: submitUrl,
  data: $(form).serialize(),
  contentType: 'application/x-www-form-urlencoded; charset=utf-8',
  success: function (data) {
    if(data.code == '0') {
      alert("code:"+ data.code + "\n" + "msg:" + data.msg);
    } else {
      alert("code:" + data.code + "\n" + "msg:" + data.msg);
    }
  }
});

이런 코드가 있을 때, AJAX 요청에 대한 처리가 정상적으로 완료되어도 브라우저에 404 에러로 표시되는 경우가 있다.

@RequestMapping("/faqDetailAjax")
public void faqDetailAjax(@RequestParam HashMap<String, String> params) {
    //로그인
    params.put("regstaff_id", "admin_test");

    params.put("view_cnt", "0");
    faqDao.insertFaq(params);
}

이는 서버에서 아무것도 응답하지 않기 때문이다. Response 객체에 응답값을 설정해주면 404 에러는 발생하지 않는다.

example 1: JSONObject

$.ajax({
  ...
  dataType: "json",
  ...
});
import net.sf.json.JSONObject;

public class Dispatcher extends HttpServlet {
    doGet() { ..생략.. }
    doPost() { ..생략.. }

    protected void process(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

        JSONObject json = new JSONObject();

        json.put("code", "200");
        json.put("msg", "success");

        PrintWriter out = resp.getWriter();
        out.print(json);
    }
}

example 2: String

$.ajax({
  // 생략
  dataType: "text",
  success: function (data) {
    var jsonData = $.parseJSON(data);
      alert(jsonData.msg);
    }
});
protected void process(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    PrintWriter out = resp.getWriter();
    out.print("'{code:\"200\", msg:\"success\"}'");
}

example 3: 스프링

@ResponseBody 어노테이션을 추가하고 아무값이나 던져준다. View를 따로 설정하지 않으면 기본 설정인 JsonView 클래스를 이용해서 파싱한 값을 응답한다. (spring3: jackson, spring4: gson)

@RequestMapping("/faqDetailAjax")
@ResponseBody
public HashMap<String, String> faqDetailAjax(@RequestParam HashMap<String, String> params) {
    //로그인
    params.put("regstaff_id", "admin_test");

    params.put("view_cnt", "0");
    faqDao.insertFaq(params);

    HashMap<String, String> map = new HashMap<String, String>();
    map.put("code","1");
    map.put("msg", "등록하였습니다.");
    return map;
}