今天处理Springboot统一异常拦截的时候,遇到了页面跳转的问题,折腾了半天才大致弄明白了其中的坑坑洼洼。
有三个方面的问题需要注意:
一.jar包依赖:Springboot有自己默认的模板引擎。一定要引用相应的依赖包。我就是没引用,导致一直无法跳转。
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
二.注解:@ResponseBody
在@Controller 控制层,是否为请求地址添加该注解也是影响跳转是否成功的因素。@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,然后直接输出到页面,并不会走视图处理器。
例如1:
@RequestMapping("/tiaozhuan.htm")
@responseBody public ModelAndView tiaozhuan() { ModelAndView view = new ModelAndView("/403.html"); return view; }
GET请求:http://localhost:9999/tiaozhuan.htm ;加不加@responseBody都可以正常地访问403.html页面(springboot默认访问 src/main/resources 下的 templates文件夹目录)
例如2:
@RequestMapping("/tiaozhuan.htm") public String tiaozhuan() { return "/403.html"; }
GET请求:http://localhost:9999/tiaozhuan.htm ;不加@responseBody,可以正常访问,加上则访问的内容为:/403.html
例如3:
@RequestMapping("/tiaozhuan.htm") public String tiaozhuan() { return "redirect:/403.html"; }
GET请求:http://localhost:9999/tiaozhuan.htm ;不加@responseBody,可以正常访问(该种为重定向,默认目录为src/main/resources 下的 static文件夹目录);加上 @responseBody则访问的内容为:/403.html
三.post与get请求:post请求与get请求也会有差别
问题:使用Ajax向SpringMVC中Controller层发送POST请求,无论我们使用return "index.jsp"、转发、重定向还是 ModelAndView,都无法解决页面跳转的问题。
原因:Ajax实际上就是通过XMLHttpRequest来发送请求对象向服务器发送异步请求,从服务器获取数据,然后使用JS来操作DOM而更新页面。服务器端返回的是纯文本流,可以是xml格式,html格式,js格式,也可以是字符串格式。但是客户端获取ajax异步获取结果后,不是直接显示在页面上,而是必须要先由js处理,完成之后才能显示在页面。当Ajax请求后,返回的只能是字符流,不是页面。<详细链接:https://www.cnblogs.com/boycelee/p/6243646.html>
例如1:
@RequestMapping("/tiaozhuan.htm") public ModelAndView tiaozhuan() { ModelAndView view = new ModelAndView("/403.html"); return view; }
POST请求:http://localhost:9999/tiaozhuan.htm ;ajax报错,但是http请求成功。但是无法跳转页面。
例如2:
@RequestMapping("/tiaozhuan.htm") public String tiaozhuan() { return "redirect:/403.html"; }
POST请求:http://localhost:9999/tiaozhuan.htm ;ajax报错304,并且无法跳转界面
所以,当Ajax的post请求后,返回的只能是字符流,不是页面,无法实现跳转功能。
总结:在springmvc框架下,在前端ajax的post请求下,后端是无法实现页面跳转的,只有使用get请求才能实现跳转。所以post请求下的页面跳转只能交给前端去实现。