jsp 中request 、response以及filter互相之间的关系

  大家都知道request和response是servlet第一次被创建时由web容器创建的,filter时用来在客户端与服务器之间进行过滤操作设置的。

   首先 当客户端要访问服务器时,本地浏览器会将当前html页面上的数据包括本地磁盘上的cookie封装到request内,然后通过http协议传送到服务器,在它到达服务器之后不会马上到达目标servlet并执行service()方法,而是会先调用过滤器经过过滤器过滤处理(比如将request内数据编码转换格式)之后,过滤器调用chain.dofilter(request,response)方法,意思是执行后面的servlet或者下一个过滤器,最后到达servlet后开始执行相应service()方法,request内的数据被取出处理。这时候就开始用到了respons,response就是服务器用来向客户端传输数据用的。这个地方注意,因为好多人会认为response可以用来在服务器servlet之间传输数据,这是不正确的,也许大家看到过response.sendRedirect("a.jsp");虽然jsp也是servlet,但是这里的意思是重定向,同样是将重定向数据“a.jsp”回送给了客户端浏览器,由浏览器重新访问“a.jsp”。response可以给客户端传输以下信息:1,cookie (由服务器生成传送回本地磁盘)2 重定向网址资源信息比如上面的a.jsp  3、通过response.getOutputStream()获取的传输流向客户端传输html静态页面。而当客户端请求经过过滤器到达servlet 并且执行完了service()方法(这时需要回送给客户端的信息已经封装到了response数据流之中)之后,这个流程会再次进入过滤器,并从chain.dofilter()之后开始执行,执行完过滤器dofilter()之后服务器端response才会继续传输给客户端浏览器,保存cookie,形成html显示页面。

       所以说request和response是相辅相成的一对对象,前者封装客户端请求数据,后者封装会送给客户端的数据。至于filter一定要注意是对客户端和服务器端的过滤,像服务器端的转发是不会再次触发filter的(当然可以通过独特配置实现触发过滤器),因为转发是服务器内部的操作,但是重定向会触发filter,因为重定向可以说是完成了两次客户端到服务器端的访问。filter一般不止一个,像这样的话,filter会按照filter-mapping的配置顺序依次过滤

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现异步Servlet的反向代理功能,需要按照以下步骤进行操作: 1. 在Filter使用异步上下文(AsyncContext)对象,开启异步处理模式。 ``` HttpServletRequest request = (HttpServletRequest) servletRequest; final AsyncContext asyncContext = request.startAsync(); ``` 2. 在异步上下文添加异步操作完成的回调函数,用于在异步操作完成时进行处理。 ``` asyncContext.addListener(new AsyncListener() { @Override public void onComplete(AsyncEvent event) throws IOException { // 异步操作完成时的处理逻辑 } // 其他回调函数的实现 }); ``` 3. 创建一个新的ServletRequest和ServletResponse对象,用于在异步操作处理请求和响应。 ``` ServletRequest asyncRequest = asyncContext.getRequest(); ServletResponse asyncResponse = asyncContext.getResponse(); ``` 4. 创建一个新的HttpRequest和HttpResponse对象,用于向目标Servlet或JSP页面发起HTTP请求。 ``` String targetUrl = "http://localhost:8080/targetServlet"; HttpRequest httpRequest = new HttpRequest(asyncRequest, targetUrl); HttpResponse httpResponse = new HttpResponse(asyncResponse); ``` 其,HttpRequest和HttpResponse对象是自定义的用于包装requestresponse的类。 5. 使用HttpRequest对象,将请求转发给目标Servlet或JSP页面,并在异步操作完成时,调用HttpResponse对象的writeToAsyncResponse()方法,将目标Servlet或JSP页面的响应结果写入异步ServletResponse对象的输出流,最后调用异步上下文的complete()方法。 ``` HttpProxy httpProxy = new HttpProxy(); httpProxy.doPost(httpRequest, httpResponse); httpResponse.writeToAsyncResponse(); asyncContext.complete(); ``` 6. 在HttpRequest和HttpResponse对象编写具体的转发和响应处理逻辑,确保异步操作能够正常完成,并且在异步操作完成后正确处理响应结果。 需要注意的是,在实现异步Servlet的反向代理功能时,应该避免阻塞当前请求线程,确保异步操作能够快速完成。同时,也需要注意HttpRequest和HttpResponse对象的一些设置,如请求方法、请求参数、响应结果的读写等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值