当前位置:首页 > Web开发 > 正文

JSONP解决跨域问题,防备表单反复提交,防备XSS打击

2024-03-31 Web开发

一.跨域问题:能够正常请求,但是没有步伐获取到响应功效
解决方案一:设置请求头,在请求的资源中设置Access-Control-Allow-Origin请求头
//3.设置请求头
response.setHeader("Access-Control-Allow-Origin", "*");

二.JSONP解决跨域问题
普通的跨域访谒问题,浏览器会进行拦截,通常src属性的都不会拦截
ajax::8080/a/AServlet

JSONP实现道理:动态加载<script>标签,操作src属性进行处事器资源的访谒,但是只撑持Get请求
1.在我们的Ajax请求傍边,需要以JSONP方法请求(通过jquery手段,动态生成sript)

jsonp:"代表的时前台传给后台,后台再通报给你 jsonpCallBack"

2.再AJAX请求傍边需要将返回的数据格局指定为jsonp

dataType:"JSONP"

3.JSONP需要以Get请求发送 ?username=zhangsan


4.后台需要做的工作:
1.正常接收数据

2.返回数据

前台通报过来的jsonp需要原路返回

String jsonp=request.getP("jsonpCallBack");

需要将返回的数据转换为JSON success

response.getWirter.write(jsonp+"("+返回的数据JSON+")");




解决方案:
改削Ajax请求:
$("#button").click(function () {
//获取到文本框的值
var username=$("#username").val();
//发送Ajax请求的A工程
$.ajax({
url:"http://www.a.com:8080/a/AServlet?username="+username,
type:"GET",
jsonp:"jsonpCallBack", //回调函数
dataType:"JSONP",
success:function (result) {
alert(result);
},
error:function () {
alert(‘系统错误~‘)
}
});
});

变动后台请求,需要将JSONP原路返回
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.接受数据
String username=request.getParameter("username");
System.out.println("接受的数据:"+username);

//接受Ajax通报的数据
String jsonpCallBack = request.getParameter("jsonpCallBack");
System.out.println("jsonpCallBack:"+jsonpCallBack);

String success = JSON.toJSONString("success");
//2.响应功效,数据必需为JSON格局
response.getWriter().write(jsonpCallBack+"("+success+")");
//3.设置请求头
/*response.setHeader("Access-Control-Allow-Origin", "*");*/
}
三.使用HTTPClient解决:就是欠亨过浏览器发送请求
B工程的页面发送的Ajax没有步伐请求到A工程,因为浏览器会拦截,走后台,后台通过HTTPClient请求请求到A工程,获取到响应功效


1.B工程的Bindex.jsp页面请求到B工程的Servlet
$("#button").click(function () {
//获取到文本框的值
var username=$("#username").val();
//发送Ajax请求的A工程
$.ajax({
url:"BServlet?username="+username,
type:"GET",
success:function (result) {
alert(result);
},
error:function () {
alert(‘系统错误~‘)
}
});
});
2.B工程的BServlet去模拟HTTP请求到A工程
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//内部通过HTTPClient进行转发
//构建一个连接
CloseableHttpClient client = HttpClients.createDefault();
//构建请求
HttpGet get=new HttpGet("http://www.a.com:8080/a/AServlet?username="+request.getParameter("username"));
//发送请求
CloseableHttpResponse httpResponse = client.execute(get);
//获取返回功效
String result = EntityUtils.toString(httpResponse.getEntity());
//将A工程响应功效给页面
response.getWriter().write(result);

}
3.A工程措置惩罚惩罚请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.接受数据
String username=request.getParameter("username");
System.out.println("接受的数据:"+username);

//2.响应功效
response.getWriter().write("success");

}


二.防备表单反复提交
1.网络延迟,再网络延迟时间内,频繁的提交表单
只能提交一次,监控表单的提交事件,通过一个boolean类型的变量来区分已经点击过还是没有点击,如果已经点击过,表单就不提交,没有点击过再提交



2.从头加载或者撤退退却页面
思路如下:在我访谒登录页面的时候,创建一个 Token令牌(看成一个标识) ,生存到session傍边,然后再表单提交的时候将令牌一起提交
后台Servlet去判断session傍边的令牌和表单提交的令牌是否相等,如果相等代表正常提交(session清空),如果不相等,代表非正常提交


Form.jsp页面
<body>
<form action="FormServlet" onsubmit="return formSubmit()" method="post">
<input type="hidden"/>
<input type="text"/>
<input type="submit" value="提交"/>
</form>
</body>


<script type="text/javascript">
//创建一个变量 false代表没有点击过,true代表已经点击过
var flag=false;
function formSubmit() {
if(!flag){ //取反值为false
flag=true;
return true;
}else {
return false;
}
}

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30373.html