为了账号安全,请及时绑定邮箱和手机立即绑定

一次每次请求过滤器无法设置不同于 404 的错误代码

一次每次请求过滤器无法设置不同于 404 的错误代码

qq_遁去的一_1 2022-09-14 15:32:51
我有一个弹簧应用程序(不使用弹簧启动)部署到雄猫我尝试在给定条件下使用 返回特定URL上的错误401() 。HttpServletResponse.SC_UNAUTHORIZEDOncePerRequestFilter但我不断得到 找不到错误:Response code: 404我的过滤器(删除条件):@Componentpublic class MyFilter extends OncePerRequestFilter {    private static final Logger logger = Logger.getLogger(MyFilter.class);    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Not autorized");                       response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);            try {                PrintWriter out = response.getWriter();                out.write(""); // Empty                out.flush();            } catch (IOException e) {                logger.error("error filtering", e);            }            return; // stop chain    }    }我尝试使用与以前类似答案类似的代码我相信你可以响应.send内部的错误做过滤方法。编辑如果我只是抛出一个异常,我得到一个通用错误代码500Response code: 500编辑 2我正在添加过滤器内部的方法覆盖onStartupWebApplicationInitializerFilterRegistration myFilter = servletContext.addFilter("myFilter ", MyFilter.class);myFilter.addMappingForUrlPatterns(null, false, "/myservlet/myendpoint/*");编辑 3此外,我的过滤器及其软件包包含在组件扫描中@Componenet@ComponentScan(basePackages = { "my.parent.pacakge"})
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

我尝试了你的代码,它的工作原理。成功返回了不同的错误代码。虽然,我想指出几件事 -

  1. 该方法将响应发送到客户端,并清除响应缓冲区。因此,您之后将其写入响应的任何内容都毫无用处。sendError()

  2. 呼叫也毫无用处。当您调用 时,HTTP 响应和 HTTP 响应代码已在上一行中发送到客户端。setStatus()sendError()


现在,这是我的假设,为什么你的代码不适合你,但它对我有用 -

您可能获得 HTTP 404 的原因是您的 API 不存在。这可能是由于拼写错误,也可能是由于一个简单的无知,例如调用您的API命名,即带有额外的尾随正斜杠。我相信您的过滤器正在成功执行,您必须在那里做一些有用的事情,而不是您在问题中解释的示例代码。/foo/bar/foo/bar/sendError()

此外,在筛选器中引发异常时,控件不会到达 API,并且不会发生 API 查找。因此,由于未处理的异常而不是 HTTP 404,默认的 HTTP 500 响应将发送到客户端。


查看完整回答
反对 回复 2022-09-14
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

仅当在以下时间之后执行时,它才会按预期返回 401setStatusout.write


PrintWriter out = response.getWriter();

out.write("");

response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号