0、背景:在由于不想在小项目中引入SpringSecurity这种重量级安全框架,我自定义了一个LoginFilter来处理认证+授权逻辑。对于认证或授权失败的情况,最初是在filter中抛出异常,并携带401状态码,然后利用Spring的ControllerAdvice全局捕获这些异常并转换后返回给前端。

1、实践中发现Controller层以及下层的异常均能被捕获,唯独LoginFilter这层的异常不能捕获,其原因是
ControllerAdvice的作用的纵深在filter之下,所以filter层发生异常时请求根本还没到到ControllerAdvice。

~~2、解决办法是直接在filter发生错误的地方直接将提示信息装入Response,首先,设置Response的status为401。然后,通过Response的输出流,直接输出json格式的提示信息的字节。
***~~
3、由于提示信息字段较多,我使用了枚举类。但Jackson不能方便的序列化多字段枚举类,所以使用了FastJson和它的SerilizeConfig+枚举泛型,将枚举进行完整json序列化返回。
至此实现了需求。

4、以上方案中手动封装json返回值的部分不够优雅,其实HttpServletResponse已经提供了sendError(int status, String message);方法来返回错误信息给客户端,所以此时就可以直接调用该方法并传递相应参数即可。

在ServletFilter层返回多字段提示给前端的更多相关文章

  1. 利用 Blob 处理 node 层返回的二进制文件流字符串并下载文件

    博客地址:https://ainyi.com/65 解释 | 背景 看到标题有点懵逼,哈哈,实际上是后端将文件处理成二进制流,返回到前端,前端处理这个二进制字符串,输出文件或下载 最近公司有个需求是用 ...

  2. 二 Djano模型层之模型字段选项

    字段选项 以下参数是全部字段类型都可用的,而且是可选的 null 如果为True,Django将在数据库中将空值存储为NULL.默认值为False 对于字符串字段,如果设置了null=True意味着& ...

  3. mybatis返回部分字段为空的问题

    问题: 在数据库查询的时候可以正常返回值,在程序中只能返回一部分字段,其他字段为null. 错误原因: 将resultType改为resultMap https://www.cnblogs.com/i ...

  4. 后台异常 - sql语句查询出的结果与dao层返回的结果不一致

    问题描述 sql语句查询出的结果与dao层返回的结果不一致 问题原因 (1)select 中,查询的列名称重复,数据出现错乱 (2)使用不等号,不等号(!=,<>),查询出来的结果集不包含 ...

  5. mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,

      在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记 ...

  6. mongodb中查询返回指定字段

    mongodb中查询返回指定字段   在写vue项目调用接口获取数据的时候,比如新闻列表页我只需要显示新闻标题和发表时间,点击每条新闻进入详情页的时候才会需要摘要.新闻内容等关于此条新闻的所有字段.  ...

  7. 解决后台json数据返回的字段需要替换的问题

    有时候后台json数据返回的字段含有“id”,也有可能是有时候为了减少代码的冗余,两页面之间只是数据模型个别属性的区别,所以这时候最好是用到模型属性的替换,用新的属性替换返回的json数据的字段.这里 ...

  8. MongoDB查询指定字段(field)返回指定字段的方法

    使用MongoDB的时候需要只查询指定的字段进行返回,也就是类似mysql里面的 SELECT id,name,age 这样而不是SELECT *.在MongoDB里面映射(projection)声明 ...

  9. spring boot整合mybatis查询数据库返回Map字段为空不返回解决

    1.出现问题原因原因1:mybatis的配置即mapper返回映射配置. 原因2:jackson的配置即@ResponseBody序列化配置. 2.解决方式步骤1:解决原因1 mybatis: con ...

随机推荐

  1. 面试系列-面试官:你能给我解释一下javascript中的this吗?

    一.前言 关于javascript中的this对象,可能已经被大家说烂了. 即使是这样,我依然决定将这篇文章给水出来.毕竟全国在新型肺炎的影响下,公司没法正常复工. 除了刷刷手机,还是要适当的学习一下 ...

  2. [NOI2005]维护数列(区间splay)

    [NOI2005]维护数列(luogu) 打这玩意儿真是要了我的老命 Description 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文 ...

  3. Fibonacci Nim(斐波那契尼姆)游戏

    游戏描述: Fibonacci Nim是Nim游戏的变种,其规则为两名玩家从一堆硬币中交替移除硬币,第一步中,不允许玩家拿走所有硬币,也不允许不取,并且在每次后续移动中,移除的硬币数量最多可以是上一次 ...

  4. Spring注解开发系列Ⅸ --- 异步请求

    一. Servlet中的异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果要处理一些 ...

  5. laravel路由与控制器(资源路由restful)

    目前我们大致了解了laravel下,在开始一个Http程序需要先定义路由.之前的例子中,我们的业务逻辑都是在路由里实现,这对于简单的网站或web应用没什么问题,当我们需要扩大规模,程序变得复杂,分层的 ...

  6. 论文翻译:Mastering the Game of Go without Human Knowledge (第一部分)

    长久以来,人工智能的一个目标是在那些具有挑战性的领域实现超过人类表现的算法.最近,AlphaGo成为了在围棋上第一个打败了世界冠军的程序.在AlphaGo中,使用深度神经网络来进行树搜索,评估位置,和 ...

  7. Python 入门基本知识

    编码:是把机器语言翻译成人能看懂的语言 美国信息互换标准代码<<ASSIC>>这张表就是相当于语法表随着发展后面又出现了:gb2312  ——到——  gbk18030  AS ...

  8. Redis异常 | DENIED Redis is running in protected mode because protected mode is enabled

    背景 今天重新搭了个redis环境,用简单的代码去测试下是否正常, @RunWith(SpringRunner.class) @SpringBootTest public class Springbo ...

  9. 死磕java(1)

    java入门 package com.sougn.new1; public class new1 { /**   * @param args   */  public static void main ...

  10. 小白学 Python 数据分析(3):Pandas (二)数据结构 Series

    在家为国家做贡献太无聊,不如跟我一起学点 Python 顺便问一下,你们都喜欢什么什么样的文章封面图,老用这一张感觉有点丑 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析( ...