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吗?