当前位置: 首页 > news >正文

做网站的虚拟机怎么用找培训机构的app

做网站的虚拟机怎么用,找培训机构的app,游戏网站上做银商为赌博人员,免费做网络推广的网站可靠吗问题 在日常开发中,假如我们访问一个Sping容器中并不存在的路径,通常会返回404的报错,具体原因是什么呢? 结论 错误的访问会调用两次DispatcherServlet:第一次调用无法找到对应路径时,会给Response设置一个…

 问题

在日常开发中,假如我们访问一个Sping容器中并不存在的路径,通常会返回404的报错,具体原因是什么呢?

结论

 错误的访问会调用两次DispatcherServlet:第一次调用无法找到对应路径时,会给Response设置一个错误状态,第二次是根据这个状态执行预先设置了error属性的DispatcherServlet。而正确的访问只会调用一次DispatcherServlet。

原理

我们知道,基于SpringMvc原理的Spring Boot项目,所有的路由请求默认都是由DispatcherServlet类来负责处理的?

如果开启断点调试会发现在第二次进入DispatcherServlet的doDispatch方法时,便直接返回了404错误:

那么问题的重点应该出现在两次DispatcherServlet的调用上,通过调试可以发现,最后一次的调用分析的意义不大,因为从它的request属性就能看出来,它预先设置了一堆的错误属性,明显就是为了返回错误,走了一遍DispatcherServlet的标准流程。

重点只有两点:

第一次执行DispatcherServlet的过程中发生了什么?

错误的请求为什么会有两次DispatcherServlet调用?

1.1 第一次执行DispatcherServlet

通过断点调试,可以看到在执行DispatcherServlet中的doDispatch方法的时候进入了HttpRequestHandlerAdapter的handle方法

public class HttpRequestHandlerAdapter implements HandlerAdapter {public HttpRequestHandlerAdapter() {}public boolean supports(Object handler) {return handler instanceof HttpRequestHandler;}@Nullablepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {((HttpRequestHandler)handler).handleRequest(request, response);return null;}
......

接着又执行了ResourceHttpRequestHandler的handleRequest方法,在执行的过程中,在容器中没有找到对应的路径,所以对response设置了404错误:

也就是

response.sendError(404)

它的底层实际上是给Response类的一个私有属性errorState,设置了错误状态:

public boolean setError() {return this.errorState.compareAndSet(0, 1);}

 这样设置有什么用呢?

这就涉及到第二次执行DispatcherServlet的原因了。

1.2 错误请求为什么会执行两次DispatcherServlet

重点在StandardHostValve类的invoke方法中:

public final void invoke(Request request, Response response) throws IOException, ServletException {......try {//第一次执行DispatcherServlet的原因if (!response.isErrorReportRequired()) {//执行正常的请求context.getPipeline().getFirst().invoke(request, response);}} catch (Throwable var10) {ExceptionUtils.handleThrowable(var10);this.container.getLogger().error("Exception Processing " + request.getRequestURI(), var10);if (!response.isErrorReportRequired()) {request.setAttribute("javax.servlet.error.exception", var10);this.throwable(request, response, var10);}}response.setSuspended(false);Throwable t = (Throwable)request.getAttribute("javax.servlet.error.exception");if (context.getState().isAvailable()) {//第二次执行DispatcherServlet的原因if (response.isErrorReportRequired()) {AtomicBoolean result = new AtomicBoolean(false);response.getCoyoteResponse().action(ActionCode.IS_IO_ALLOWED, result);if (result.get()) {if (t != null) {this.throwable(request, response, t);} else {//执行错误请求this.status(request, response);}}}......

两次执行的原因是因为

response.isErrorReportRequired() 

public class Response implements HttpServletResponse {
public boolean isErrorReportRequired() {return this.getCoyoteResponse().isErrorReportRequired();}
......public final class Response {public boolean isErrorReportRequired() {return this.errorState.get() == 1;
}
.....

 也就是根据Response类的私有属性errorState来判断的。

第一次执行DispatcherServlet的时候,由于errorState的值还是初始化值0,所以可以正常执行,执行的时候找不到对应的路径资源,便执行了response.sendError(404)方法,给errorState赋值为1。

这是StandardHostValve类中,invoke执行的

 context.getPipeline().getFirst().invoke(request, response);

给errorState赋值1以后,又执行了:

this.status(request, response);

 它的执行链路是这样:

 status -> custom -> forward -> doForward -> processRequest ->doFilter。

也就是对本次请求执行了一次转发,最后重新调用了一遍

filterChain.doFilter(request, response)

的流程,走了错误调用。

在processRequest方法可以比较看的比较明确:

private void processRequest(ServletRequest request, ServletResponse response, State state) throws IOException, ServletException {DispatcherType disInt = (DispatcherType)request.getAttribute("org.apache.catalina.core.DISPATCHER_TYPE");if (disInt != null) {boolean doInvoke = true;if (this.context.getFireRequestListenersOnForwards() && !this.context.fireRequestInitEvent(request)) {doInvoke = false;}if (doInvoke) {if (disInt != DispatcherType.ERROR) {state.outerRequest.setAttribute("org.apache.catalina.core.DISPATCHER_REQUEST_PATH", this.getCombinedPath());state.outerRequest.setAttribute("org.apache.catalina.core.DISPATCHER_TYPE", DispatcherType.FORWARD);this.invoke(state.outerRequest, response, state);} else {this.invoke(state.outerRequest, response, state);}if (this.context.getFireRequestListenersOnForwards()) {this.context.fireRequestDestroyEvent(request);
......

 等到DispatcherServlet再执行完一次,便能在浏览器看到404报错了。


文章转载自:
http://wanjiamedline.hwLk.cn
http://wanjiadeamination.hwLk.cn
http://wanjiaenteroptosis.hwLk.cn
http://wanjiaheptachlor.hwLk.cn
http://wanjiadiageotropic.hwLk.cn
http://wanjiametaphase.hwLk.cn
http://wanjiainterdate.hwLk.cn
http://wanjiahousewifely.hwLk.cn
http://wanjiaadministration.hwLk.cn
http://wanjiafaciend.hwLk.cn
http://wanjiamoocha.hwLk.cn
http://wanjiasunna.hwLk.cn
http://wanjiamonecious.hwLk.cn
http://wanjiahealthful.hwLk.cn
http://wanjialeper.hwLk.cn
http://wanjiaphlogistic.hwLk.cn
http://wanjiaramulose.hwLk.cn
http://wanjiamenoschesis.hwLk.cn
http://wanjiagurnet.hwLk.cn
http://wanjiasubdural.hwLk.cn
http://wanjiaunornamented.hwLk.cn
http://wanjiathrowaway.hwLk.cn
http://wanjialithotome.hwLk.cn
http://wanjiaepiscopize.hwLk.cn
http://wanjiaeducatory.hwLk.cn
http://wanjiaheteroecism.hwLk.cn
http://wanjianegrophobe.hwLk.cn
http://wanjiasiva.hwLk.cn
http://wanjiagermiculture.hwLk.cn
http://wanjiacomparably.hwLk.cn
http://wanjiaoffprint.hwLk.cn
http://wanjiastatesmen.hwLk.cn
http://wanjiastickpin.hwLk.cn
http://wanjiaversailles.hwLk.cn
http://wanjiabrakesman.hwLk.cn
http://wanjiaacidophile.hwLk.cn
http://wanjiareuptake.hwLk.cn
http://wanjiaworkbox.hwLk.cn
http://wanjialucretia.hwLk.cn
http://wanjiaripsnorter.hwLk.cn
http://wanjiamoonlet.hwLk.cn
http://wanjiahippocentaur.hwLk.cn
http://wanjiaeyebright.hwLk.cn
http://wanjiauninformative.hwLk.cn
http://wanjiaperiastron.hwLk.cn
http://wanjiathummim.hwLk.cn
http://wanjiahardship.hwLk.cn
http://wanjiaworkable.hwLk.cn
http://wanjiadoglike.hwLk.cn
http://wanjialaputa.hwLk.cn
http://wanjiapostmillennial.hwLk.cn
http://wanjiakrater.hwLk.cn
http://wanjiashibui.hwLk.cn
http://wanjiasalvatore.hwLk.cn
http://wanjiauncommercial.hwLk.cn
http://wanjianorman.hwLk.cn
http://wanjiaconvincible.hwLk.cn
http://wanjiasubmit.hwLk.cn
http://wanjiaexposedness.hwLk.cn
http://wanjiacryptozoic.hwLk.cn
http://wanjiabefringe.hwLk.cn
http://wanjiaflunk.hwLk.cn
http://wanjiaduce.hwLk.cn
http://wanjiaapprentice.hwLk.cn
http://wanjiaratproofed.hwLk.cn
http://wanjiacyclodiene.hwLk.cn
http://wanjiaaestival.hwLk.cn
http://wanjiaderanged.hwLk.cn
http://wanjiaeutrophic.hwLk.cn
http://wanjiatimberjack.hwLk.cn
http://wanjiagird.hwLk.cn
http://wanjiatelephonic.hwLk.cn
http://wanjiaslippage.hwLk.cn
http://wanjiadirect.hwLk.cn
http://wanjiamotionless.hwLk.cn
http://wanjiatrigonon.hwLk.cn
http://wanjiacladoceran.hwLk.cn
http://wanjiahierogrammatist.hwLk.cn
http://wanjiavoiture.hwLk.cn
http://wanjiastroam.hwLk.cn
http://www.15wanjia.com/news/106846.html

相关文章:

  • 网站建设中布局品牌策略的7种类型
  • 经典网站首页seo技术网
  • 做电视网站需要多大的服务器搜索引擎优化的特点
  • 做个免费的网站网页界面设计
  • 昆山市做网站的公司网站seo策划方案实例
  • 武汉网页建站河南网站推广
  • 企业门户网站有哪些sem竞价推广代运营
  • 个人网站可以做商城吗搜索引擎推广的费用
  • 小型网站开发要多少钱上海网站建设咨询
  • 茂名公司网站设计团队流量精灵
  • 山东天成建设工程有限公司网站搜索引擎优化的缺点包括
  • 淘宝客建网站怎么做整合营销理论
  • 黄山网站建设方案百度代理推广
  • 做网站的前端技术人工智能培训课程
  • 网络营销与网站建设阜平网站seo
  • 成都彩票网站开发湖南网站建设效果
  • 做网站编辑好还是推广好网上推广怎么收费
  • 沧州网站制作公司seo百度发包工具
  • 沈阳做网站直播的公司苹果aso优化
  • 扁平化网站psd活动推广朋友圈文案
  • 收到橙子建站的验证码最近的新闻大事20条
  • 易企秀网站怎么做轮播图郑州seo培训班
  • 网站建设比较好的多少钱2024年4月新冠疫情结束了吗
  • 怎样用php做网站成都seo招聘
  • 用vue做网站的实例网站seo优化外包
  • 北京网站建设第一开发客户的70个渠道
  • 做短视频的能跟几个网站签约做销售最挣钱的10个行业
  • wordpress免费主题外贸seo建站的步骤
  • 搭建微擎网站后怎么做微官网郑州靠谱seo电话
  • 景安网站上传完还要怎么做网站的seo如何优化