2019独角兽企业重金招聘Python工程师标准>>>

最近在开发项目时,由于前端代码调用后端接口,需要使用响应状体码告知前端登录异常(401)和权限验证不通过(403)。前端拿到对应的状态码会做出相应的处理。

上述的登录验证和权限验证,后端采用Spring拦截器技术实现。为了返回指定的状态码,使用了HttpServletResponse中的setStatus方法。一切都正常运行,没问题!但突然我有了个想法,如果登录验证不通过,需要跳转到专门负责显示401友好提示信息的页面,如何做?有人会说使用sendRedirect方法,可以。还有吗?

我的做法是直接根据响应状态码,依赖web.xml中的error-page配置实现报错页面的跳转。相信下面代码的配置,搞JavaWeb开发的人应该都会熟悉:

<error-page><error-code>401</error-code><location>/WEB-INF/view/401.jsp</location>
</error-page>

但在真正运行时发现,setStatus确实可以设置response的状态码,却无法像设想的那样,显示出401.jsp页面中的内容。经过一番搜索查证,发现使用sendError代替setStatus,可以达到期望的效果。可是,为什么?sendError和setStatus有何区别?下面是直译官方API文档的内容:

sendError(int sc):使用指定的状态码并清空缓冲,发送一个错误响应至客户端。如果响应已经被提交,这个方法会抛出IllegalStateException。使用这个方法后,响应则应该被认为已被提交,且不应该再被进行写操作了。

sendError(int sc, String msg):使用指定的状态码发送一个错误响应至客户端。服务器默认会创建一个HTML格式的服务错误页面作为响应结果,其中包含参数msg指定的文本信息,这个HTML页面的内容类型为“text/html”,保留cookies和其他未修改的响应头信息。如果一个对应于传入的错误码的错误页面已经在web.xml中声明,那么这个声明的错误页面将会优先于建议的msg参数服务于客户端。(ps:相比较上面的方法,我更倾向于前者。使用上面的方法,可以通过定制不同状态的响应结果显示于客户端,我们应该不想让客户端看到服务器创建出的简单粗暴的页面吧?)

setStatus(int sc):设置响应的状态码。这个方法被用于当响应结果正常时(例如,状态码为SC_OK或SC_MOVED_TEMPORARTLY)设置响应状态码。如果发生错误,而且来访者希望调用在web应用中定义的错误页面作为显示,那么应该使用sendError方法代替之。使用setStatus方法之后,容器会清空缓冲并设置Location响应头,保留cookies和其他响应头信息。

从直译的结果不难发现哈,sendError适用于报错且存在对应的报错页面配置作为输出显示的情况,而setStatus适用于正常响应的情况,仅仅可以改变响应状态码而已。

转载于:https://my.oschina.net/angerbaby/blog/468687

HttpServletResponse中sendError与setStatus的区别相关推荐

  1. jsp中forword和sendRedirect的区别

    jsp中forword和sendRedirect的区别 RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中.Reque ...

  2. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

  3. java中separator_java - File.separator和路径中的斜杠之间的区别

    java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...

  4. PHP中self和static的区别,php中self与static的区别

    原文链接,猛击这里. php中self与static的区别 通过一些示例,我们可以很容易看出self和static的区别.假定我们有class Car – 它有两个方法,model和getModel. ...

  5. php 抽象类 接口 区别,PHP中抽象类、接口的区别与选择分析

    本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过 ...

  6. php $this self,php中self与$this的区别

    学习php中self与$this的区别. 先来看下parent与self的例子: /* * parent与self的区别 * by www.jbxue.com */ class A{ function ...

  7. mysql中char与varchar的区别分析(补充一句,int和integer没区别)

    转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  8. python中bytearray和java中byte[]的区别_Python经典面试题:说说Python中xrange和range的区别?...

    昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了. 废话不多说,开 ...

  9. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

最新文章

  1. oracle 10.2 64位,Oracle 10.2.0.5 x64升级到11.2.0.3 x64
  2. dll文件复制和替换不了_重新编译mono——Android动态更新dll
  3. 数据分析和作图用python好还是R!python真有那么神吗?
  4. X-AdminABP框架开发-系统日志
  5. 电子信息工程跨考计算机武大,往届从材料跨考武大085208电子与通信工程初试303分 - 考研 - 小木虫 - 学术 科研 互动社区...
  6. Mybatis plus修改了Language Level后,IDEA运行应用出现了Information:java: javacTask: 源发行版 8 需要目标发行版 1.8
  7. 在Python中模拟do-while循环?
  8. Delphi XE +SQLServer把图片当作文本存储
  9. android学习资料整理-----高级篇
  10. java 货币格式 转换_java格式化数值成货币格式示例
  11. Java用while求100以内奇数和
  12. chrome最简单的多开方法
  13. 变限积分求导公式总结_变限积分求导的口诀记忆法及应用
  14. wind7计算机控制面板在哪,Win7控制面板在哪打开|win7打开控制面板的小技巧
  15. 向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读(经典)
  16. 全国计算机等级考试信息安全三级笔记
  17. 杭电计算机学硕专硕2019,2019杭电计算机考研总结
  18. 客户关系应该如何管理?
  19. [含文档+PPT+源码等]基于SSM个人财务记账账单收入支出统计管理系统[包运行成功]
  20. 我对新世相的刷屏海报并不感兴趣

热门文章

  1. C++基础之类的定义和对象的创捷,什么是类和对象?
  2. Java基础篇:为Box类添加一个方法
  3. 光纤非线性效应对光OFDM信号的影响研究
  4. 一个网络传输框架——zeroMQ 调研笔记
  5. 实现微信文章页面 http://mp.weixin.qq.com/s?__biz=MjM5MDI3OTAwMg==amp;mid=200337417amp;idx=1amp;sn=5959ed1...
  6. 蠎周刊 148: 新年
  7. Windows 8 VHD 概述与使用
  8. [转载] C#面向对象设计模式纵横谈——1. 面向对象设计模式与原则
  9. 【重点!记忆化递归+DP】LeetCode 72. Edit Distance
  10. 【DFS】LeetCode 40. Combination Sum II