在doFilter这里可以直接把异常抛出吗?通过全局Handler来返回异常信息,而不是通过直接拼接返回给前端

在doFilter这里可以直接把异常抛出吗?通过全局Handler来返回异常信息,而不是通过直接拼接返回给前端

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = request.getSession();
User user =(User)session.getAttribute(Constant.IMOOC_MALL_USER);
if(user==null){
throw new ImoocMallException(ImoocMallExceptionEnum.NEED_LOGIN);
}
//校验是否是管理员
   Boolean adminRole = userService.checkAdminRole(user);
if (!adminRole){
throw new ImoocMallException(ImoocMallExceptionEnum.NEED_ADMIN);
}
filterChain.doFilter(servletRequest,servletResponse);
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小班 2021-05-05 18:55:18

同学你好,1、这里同学可以使用ApiRestResponse.error来生成响应对象再输出,这样也是可以的。

    2、但是需要直接使用try catch捕获,只是这样的方式并不合理,并不能完成这个过滤器的作用,比如:在当前的AdminFilter类中,完成对用户非空判断和是否管理员的判断

当userService.checkAdminRole(currentUser)的返回值是true或者false时,需要对这个结果进行判断,它并没有报错信息,所以try catch异常管理也不会生效,所以就没有完成这个是否管理员的判断。

所以这样配置并不合理。

祝学习愉快!

  • pleine #1

    老师那我可以根据结果判断来抛出异常吗?比如为false 我直接抛出这个

    throw new ImoocMallException(ImoocMallExceptionEnum.某个异常);

    为true 我就filterChain.doFilter(servletRequest,servletResponse);


    2021-06-09 21:54:42
  • 同学你好,这样可能会出现问题,可能捕获不到异常信息,因为过滤器会先运行,当发送一个请求时,会先在过滤器中进行处理,如果通过了才会向下执行,所以当在过滤器中抛出异常时,并未执行到统一处理异常的类中。从而在过滤器中抛出的异常无法进行统一处理。

    祝学习愉快!

    2021-06-10 11:11:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师