2014-09-19 2 views
5

Каков наилучший способ определить, является ли запрос GET или POST, входящий в Java-сервлет, запросом AJAX? Метод я сталкивался до сих пор в моем поиске, чтобы лишить информацию из заголовка сJava Servlet: лучший способ определить, является ли запрос AJAX

"XMLHttpRequest".equals(request.getHeader("X-Requested-With")); 

Существуют ли другие способы справиться с этим? Похоже, что полагаться на заголовок - это не очень надежное решение.

+4

возможно дубликат [Как обнаружить, если запрос Ajax или нормально на стороне сервера] (http://stackoverflow.com/questions/2419223/how-to-detect-if-a-request-is -ajax-or-normal-on-server-side) – Ilya

+2

Возможный дубликат [JSP/Servlet. Как определить, был ли HTTP-запрос отправлен с помощью запроса ajax] (http://stackoverflow.com/questions/14004877/jsp-servlet -how-to-ident-if-the-http-request-come-from-a-ajax-запрос) – icza

+0

Нет другого надежного метода afaik. Но что случилось с методом, который вы опубликовали? – icza

ответ

-1
$.ajaxSetup({ 
    headers: {"X-My-Header":"Bob"} 
}); 
+0

Пожалуйста, не просто отправьте код; объясните, что он делает и почему вы считаете, что это правильное решение. – dimo414

+0

Контроллер, который должен обрабатывать оба типа запроса, может использовать метод request.getHeader() для обнаружения типа запроса. Разработчик может использовать параметр заголовка x-request-with для получения типа запроса. В случае запроса Ajax request.getHeader ('x-request-with') возвращает XMLHttpRequest, так как строка else возвращает null. –

+2

Вы можете нажать «изменить» ответ, чтобы улучшить его. Но в вашем комментарии обсуждается заголовок 'X-Requested-With', который уже используется, а не ваше сообщение. – dimo414

1

После HTML документа использует jQuery.post() метод для отправки асинхронного запроса AJAX в сервлет:

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>click demo</title> 
    <style> 
    body {font-family: verdana;margin:20px; font-size: 14px;} 
    div.container {border: 1px solid black; 
    background-color: #f0ffff;padding:10px;width:460px; 
    } 
    p.result {color:red;font-weight:bold;} 
    h3 {color:blue;} 
    </style> 
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script> 
</head> 
<script> 
$(document).ready(function() { 
    $("#myAsyncBtn").click(function() { 
     $.post(
       "async", 
       function(data) { 
       $(".result").html(data); 
       } 
     ); 
    }); 
}); 
</script> 
<body> 
<div class="container"> 
<h3>Ajax Request Detection using Java</h3> 
<p>Click this button to make a Asynchronous Request 
    <button id="myAsyncBtn"> Click Here</button> 
</p> 
<p>Now click a Link to make a synchronous request 
    <a href="async">Sync Call</a> 
</p> 
<p class="result"></p> 
</div> 
</body> 
</html> 

контроллер, который необходимо иметь дело с обоих типов запроса может использовать request.getHeader() метод для определения типа запроса. Разработчик может использовать параметр заголовка x-requested-with, чтобы получить тип запроса. В случае запроса Ajax request.getHeader('x-requested-with') вернет XMLHttpRequest как String else return null.

package org.techzoo.async; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet("/async") 
public class AsyncServlet extends HttpServlet { 

    public AsyncServlet() { 
     super(); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, 
      HttpServletResponse response) 
     throws ServletException, IOException { 

     String headerName = request.getHeader("x-requested-with"); 

     if(null == headerName){ 
      PrintWriter out = response.getWriter(); 
      String html = "<h3>Clinet send a Synchronous request</h3>" + 
       "<p><a href=\"index.jsp\">Go Back</a> to main page</p>"; 
      out.write(html); 
     } 
     else { 
      ServletOutputStream out = response.getOutputStream(); 
      out.print("Ajax Request Detected"); 
      out.flush(); 
     } 
    } 

} 
Смежные вопросы