springboot实现修改请求状态404改为200
作者:一盏红烛,一杯烧酒
springboot修改请求状态404改为200
描述
前端请求 localhost:8090/hello,而我后端没有 /hello 对应的 url,正常请求的话会报错 404。
我这里想修改请求结果,改为 200 加自定义结果返回
解决办法
@Order(0)
@WebFilter(value = "/*")
@Component
public class EntranceFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 请求放行
chain.doFilter(request,wrapper);
try{
Class clazz=ResponseFacade.class;
Field field=clazz.getDeclaredField("response");
field.setAccessible(true);
Object o = field.get(((ResponseFacade) response));
// 修改状态,默认情况 放过调用链执行后 response.setStatus 失败
((Response)o).setAppCommitted(false);
((Response)o).setSuspended(false);
}
catch (Exception e){
logger.error("========> 反射获取response失败");
}
// =====> reset() 方法可以清空缓冲区以及重置状态码 200 但是这里又需要依赖前面的try模块,需要先设置他们
// =====> 还需要设置 内容类型,这块也被重置了
response.reset();
response.setContentType("text/html;charset=UTF-8");
response.getOutputStream().write("Don't ask at will".getBytes());
response.flushBuffer();
}
}我这里是使用了 过滤器,controller中也是类似的。
这里需要主要,如果没有先放行 即执行chain.doFilter(request,wrapper);,其实不用这么麻烦。
可以直接写
@Order(0)
@WebFilter(value = "/*")
@Component
public class EntranceFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
((HttpServletResponse) response).setStatus(200);
response.getOutputStream().write("Don't ask at will".getBytes());
response.flushBuffer();
}
}springboot项目404排错思路
错误页面展示

翻译:Whitelabel错误页面此应用程序没有针对/error的显式映射,因此您将其视为一个回退。
出现意外错误(类型=未找到,状态=404)。
排错思路
出现404根本原因是:浏览器找不到输入的URL地址
首先写个能访问成功的接口举例:

在浏览器输入:localhost:8080/SpringBoot/test 可以正常访问

若出现404问题,接下来进行排错
首先需要检查输入的URL是否有漏写情况,能否对应SpringBoot项目的接口,这里不做分析。
(1)端口号输入错误

启动的控制台显示是8080端口启动 所以浏览器输入的URL地址也应该是:localhost:8080/XXX/XXX这里的端口号可以在application.yml配置文件中更改
(2)接口URL地址未区别大小写
接口的地址是严格区分大小写的 转而言之:localhost:8080/SpringBoot/test 与localhost:8080/springboot/test 两者是不一样的地址
(3)controller层接口映射地址前是否漏写 " / " 斜杠

(4)Controller层注解应该是@RestController 而不是 @Controller

@Controller与@RestController两者区别注解区别:
@Controller注解
@Controller 是Spring框架提供的注解。
@Controller标识的类,该类代表控制器类(控制层/表现层)。之后分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。(@RequestMapping 用来映射请求,也就是通过它来指定控制器可以处理哪些URL请求)
@RestController注解
- @RestController 其实也是Spring框架提供的注解。
- @RestController 注解相当于 @Controller + @ResponseBody 合在一起的作用。
所以用@RestController 注解类的方法返回值,默认是json对象,也就是相当于@Controller里面的方法上添加@ResponseBody,如果方法返回值,需要跳转,那么方法的返回类型必须是View 或者ModelAndView。
(5) SpringBoot的启动类与Controller包不在同一个目录下
SpringBoot的启动类(类名上面有@SpringBootApplication注解 )解决方案就是把启动类和Controller包放在同目录下。
如下图:必须在同级目录

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
