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

怎样做才能发布你的网站网站馆店精准引流怎么推广

怎样做才能发布你的网站,网站馆店精准引流怎么推广,网站页面设计考虑要素,电商app开发费用问题 在日常开发中#xff0c;假如我们访问一个Sping容器中并不存在的路径#xff0c;通常会返回404的报错#xff0c;具体原因是什么呢#xff1f; 结论 错误的访问会调用两次DispatcherServlet#xff1a;第一次调用无法找到对应路径时#xff0c;会给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://www.dnsts.com.cn/news/145853.html

相关文章:

  • 提供商城网站建设wordpress shard
  • 网站怎么做百度优化wordpress评论嵌套
  • 哪个网站有做形象墙p2p网站方案
  • 网站开发后服务费射击官网
  • 南京企业建站系统织梦网站环境
  • 吉林省建设厅网站周军seo学习
  • 长沙做网站备案2023最建议买10款手机
  • 潍坊建设局职称公布网站网络考试
  • 济南网站建设及推广做网站价格
  • 做阿里云网站的公司湘潭网络公司
  • 教育wordpress模板下载地址搜索引擎优化的英语简称
  • 流量网站应该怎么做做个网站要钱吗
  • 免费建网站推广wordpress阿里云图片不显示
  • 云虚拟主机可以做多少个网站秦都区建设局网站
  • 平面设计网站知乎贷款超市网站开发
  • 天猫商城网站风格石狮网站建设
  • 建设一个网站需要什么技术人员建网站签合同
  • 长沙网站制作多少钱什么是网络营销?它的内涵包括哪几个层次?
  • 怎么优化整站重庆腊肠怎么制作
  • 南京做网站的公司排名公司网页设计费用
  • 芜湖网站建设whwzjs2003网站服务器建设中
  • 外贸球衣网站牛年起广告公司名字
  • 网站建设高等教育出版社有哪些网络平台
  • 网络设计开发网站六安招聘网官网
  • 免网站域名注册新手怎样学校做网站
  • 做美工用什么素材网站网站广告推广怎么做
  • 系统管理网站建网站的宽带多少
  • 合肥建站企业电信备案网站
  • ssh做的网站山西城乡建设厅网站
  • 网站联系qq代码推广一手渠道