Java Servlet:确定请求是不是为 AJAX 的最佳方法

Posted

技术标签:

【中文标题】Java Servlet:确定请求是不是为 AJAX 的最佳方法【英文标题】:Java Servlet: Best Way to Determine if request is AJAXJava Servlet:确定请求是否为 AJAX 的最佳方法 【发布时间】:2014-11-13 15:28:31 【问题描述】:

确定进入 java servlet 的 GET 或 POST 请求是 AJAX 请求的最佳方法是什么?到目前为止,我在搜索中遇到的方法是使用

从标题中删除信息
"XMLHttpRequest".equals(request.getHeader("X-Requested-With"));

还有其他方法可以解决这个问题吗?似乎依赖标头并不是一个非常强大的解决方案。

【问题讨论】:

how to detect if a request is ajax or normal on server side 的可能重复项 JSP/Servlet How to identify if the HTTP request came from an ajax request的可能重复 没有其他可靠的方法 afaik。但是您发布的方法有什么问题? 是的,这不是一个非常强大的解决方案。如果这很重要,请让 Ajax 请求转到单独的 URL 或包含额外的参数(当然,这仍然可以被欺骗)。 任何用户端信息都可以被欺骗所以不,没有完全证明的方法。我不明白为什么人们需要知道这一点? 【参考方案1】:

以下 html 文档使用 jQuery.post() 方法向 Servlet 发送异步 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 header 参数来获取请求类型。如果是 Ajax 请求,request.getHeader('x-requested-with') 将返回 XMLHttpRequest 作为字符串,否则返回 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();
        
    


【讨论】:

【参考方案2】:
$.ajaxSetup(
  headers: "X-My-Header":"Bob"
);

【讨论】:

请不要只发布代码;解释它的作用以及为什么您认为这是正确的解决方案。 控制器需要同时处理这两种类型的请求,可以使用 request.getHeader() 方法来检测请求类型。开发者可以使用 x-requested-with 头参数来获取请求类型。如果是 Ajax 请求 request.getHeader('x-requested-with') 将返回 XMLHttpRequest 作为字符串,否则返回 null。 您可以单击答案上的“编辑”来改进它。但是您的评论讨论了 OP 已经使用的 X-Requested-With 标头,而不是您发布的解决方案。

以上是关于Java Servlet:确定请求是不是为 AJAX 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

服务器端的Java应用程序就是指java—servlet吗?

servlet入门

为啥 java servlet 不是过滤器? [复制]

是否有理由不将 JSONP 用于 AJA~X 请求?

《Head First Servlets & JSP》-13-过滤器和包装器

Java面试题:Servlet是线程安全的吗?