关于异步请求时出现的问题

第一个问题:

在struts2的配置文件中  如果不指定type的类型 那么在action中任何跳转都是默认forword类型的  称为内部跳转  比如下面的例子

第一个例子:

管理员登录成功之后  跳转到list.jsp页面

但是网页上的url却是下面的

第二个例子:

用户登录成功之后  跳转到detail.jsp页面

但是url

说了这么多   就是为了解决上面的操作和异步请求时   容易出现的问题

继续拿第二个例子来说明  如果在该详情页面中  我使用异步操作(比如做更新)

只要我们使用了异步操作  那么有没有想过  将来action中做了相应操作之后   无论是否返回数据给浏览器

异步请求之后  最终都是需要一个返回一个地址的   这个地址怎么确定呢

就是你在那个url上发送的异步请求   说到这  我们似乎有点明白了  即如果在一个url=.jsp上发送的异步请求  那么将来返回的

地址就是这个.jsp页面   如果在url =xxx.action上发送的异步请求  那么将来返回的时候 还会去找这个action地址

所以就造成了如下的结果

登录成功之后(url=xx.action  只是把登录成功之后的detail.jsp页面在当前url下展示了出来  所以请求地址不是xx.jsp  在以前的总结中提到过forward和redirect的区别)  在该页面上 我想要修改员工的信息

那么我们点击提交  打个断点来观察 下面是点击“信息变更”之后  准备发送异步请求(时刻记得当前请求的url=empAction_login.action  因为一会返回时就会返回个这个action  而不是detail这个页面)

继续下一步

正常进入提高的更新action  这里我把response给注销掉了(其实有没有该语句  执行效果都 一样  如下面的情况)

首先 我在empAction_login.action中  打上了断点  易于观察

然后继续下一步

可以看到 我们刚才的推论是正确的  它的确返回给了发送异步请求处的url  即empAction.action

所以这就出现了问题  我们明明做的是更新操作  预想结果:要么成功 要么失败  可以现在却又来到了登录处的action  无论登录成功或者失败  都不是我们想要的处理流程

所以   结论:

如果在一个url=.jsp上发送的异步请求  那么将来返回的地址就是这个.jsp页面   如果在url =xxx.action上发送的异步请求  那么将来返回的时候 还会去找这个action地址

问题二:根据上边出现的问题  我现在的思路就是在登录成功之后  在struts2中的配置文件中  改变type类型  使其直接重定向到detail.jsp页面  这样就可以解决上面的问题了

修改如下:

然后登录访问

登录成功

然后根据struts2.xml的配置  进行重定向

但是却出现了如下的结果:

这是因为 我们的detail.jsp页面在WEB-INF下面  重定向 相当于客户端重新发送一次请求  直接访问   所以  访问不到

到这都非常有意思了  一方面是 为了保证页面的安全  不登录不让其访问  一方面又想通过重定向访问   这怎么搞呢

解决办法(其实也可以把该页面给拿到web-inf外部  因为这个页面不是安全性不是非常高)

看到没  我在web.xml中配置了一个映射  注意和servlet程序映射的不同

这样配置之后   就可以通过浏览器直接访问web-inf下的内容了

然后 在struts配置文件中  我们这样写

不过因为使用了重定向  所以需要把查询到的数据放在session域中  但是问题还是存在  因为我们登录成功   重定向之后的url是这样的

比较坑爹   这样提交之后

时间: 2024-11-08 21:35:17

关于异步请求时出现的问题的相关文章

怎么在调用异步请求时不阻塞当前线程

在异步编程中,经常会调用已经写好的异步方法.这时会有一个需求:根据异步方法的返回值,做一些别的操作.这时会有两种实现方式: 1. 使用await,阻塞线程,等待异步方法的完成,然后获得返回值,再进行别的操作.示例: static void Main(string[] args) { Console.WriteLine("--------------程序运行开始-----------"); string url = "http://www.baidu.com"; va

POST和GET以及同步请求和异步请求的区别

一.HTTP是应用层的网络传输协议,对于HTTP的请求方式主要流行的GET请求与POST请求对于GET请求与POST请求的区别 1.GET请求,服务器以及参数都会出现在请求接口中,也就是请求参数也是接口的一部分,而POST请求在接口中只有服务器地址,而参数会作为请求提交给服务器. 2.因为GET请求会出现在请求接口中,所以信息容易被捕获,安全性低,POST请求参数封装在请求体中,作为二进制流进行传输,不易被捕获,安全性高. 3.GET在请求时,接口的字节数有限制,支持小数据的提交,而POST请求

移动App,AJAX异步请求,实现简单的增、删、改、查

用ajax发异步请求时,要注意url."AppServer"为后台项目名,"LoginServlet.action"为web.xml中的<url-pattern></url-pattern>标签中的内容. 前台代码如下(核心代码): index.html: 1 $(function() { 2 $('#login').click(function() { 3 var account = $("#account").val(

SpringBoot异步请求

何为异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如访问数据库.调用第三方服务接口等,那么其所对应的线程将同步地等待**IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题.其请求流程大致为: 而在Servlet3.0发布后,提供了一个新特性:异步处理请求.可以先释

关于ajax异步请求的一个细节问题

首先描述一下问题场景:我们正在做一个汽车出租项目,使用maven+ssm+easyui来完成,这个问题是在做汽车办理出租业务的时候出现的. 问题描述:在使用ajax发送异步请求时,遇到一个问题,就是在回调函数中接受到了异步响应的数据,但是在前端页面中的表单中却不回显该数据. 下面请看问题代码: 1 /* 办理出租业务 */ 2 function rentCars(value){ 3 /* 获取选中的行 */ 4 var row = $("#dgCarRents").datagrid(&

Vue 异步请求

vue最初使用vue-resource来实现异步请求(ajax),vue 2.0开始推荐使用 axios 来代替vue-resource. 准备工作 1.使用npm下载axios npm install axios 2.引入axios.js <script src="js/axios.js"></script> 上线时换为min.js 前端   vue使用axios发起异步请求 可以这样写: <!DOCTYPE html> <html>

C# .Net FrameWork3.5中异步HTTP请求时,由于安全协议的问题System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)方法抛出“基础连接已经关闭: 发送时发生错误”的解决办法

现象描述: C# .Net FrameWork3.5中异步HTTP请求时,由于安全协议的问题System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)方法抛出“基础连接已经关闭: 发送时发生错误”. 原因分析: 大多数情况下是由于客户端所设置的HTTP访问请求的安全协议不符合服务器端的安全协议要求.比如,NASA提供瓦片服务的http://worldwind25.arc.nasa.gov/wms?service=WMS&v

jQuery基础(Ajax,load(),getJSON(),getScript(),post(),ajax(),同步/异步请求数据)

1.使用load()方法异步请求数据 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功后,执行的回调函数. 2.使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数据,并对获取的数据进行解析,显示在页面中,它的

ajax发送异步请求

一:得到XMLHttpRequest对象 ajax其实只需要学习XMLHttpRequest一个对象 大多数浏览器都支持: var xmlHttp = new XMLHttprequest(); IE 6.0: var mltHttp = new ActiveXObject("Msxml2.XMLHTTP"); IE 5.5 及更早的IE var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); * 编写创建XMLH