关于springboot转发重定向以及受保护目录的一些规律

本文介绍了SpringBoot中Thymeleaf模板引擎的使用,并详细探讨了转发与重定向的区别及实现方法。文章还讨论了项目文件结构布局,以及如何配置静态资源文件夹以支持直接URL访问。

今天闲来无事,又研究了一下springboot,涉及到了Thymeleaf模板引擎,因为之前接触过jsp,所以上手很快,但是也思考了一些关于转发以及重定向的问题,总结出以下规律

项目结构

这里写图片描述

首先解释一下每个文件夹的作用,如果你是用的是idea创建的springboot项目,会在项目创建的一开始resources文件夹下自动创建static以及templates文件夹。也就是说项目初始时有java、resource、static以及templates 这几个文件夹。
一般static下存放js以及css样式文件,templates存放html页面。
以上是默认会创建的文件夹以及其作用
下面我们来说一下转发和重定向的规律。
首先static文件夹以及templates文件夹是受保护的,也就是说相当于你将文件放到了传统的ssh或ssm项目的WEB-INF下了。所以也就是说这两个文件夹下的文件是无法通过url直接访问的,以至于在springmvc下使用重定向会报404。

那么希望直接访问的html或者css该如何存放呢?

方式一
我们可以在resources下创建一个名为public的文件夹,顾名思义,放在此文件夹下的文件是共有的,可以直接通过url访问,当然也可以springmvc重定向访问啦。
方法二
在main下创建webapp文件夹,将文件放到此文件夹下,效果同上
注!文件夹名字是固定的,起别的名字还是会报404或者无效
好,说到这里,有的同学应该就会有疑问了,我分别创建了public和webapp而且还起了相同名字的html页面,我访问会进到哪一个?
首先:最好还是不要这么做,明明两个文件夹效果一样,又何必呢?看个人需求选择一种方式就好啦。
但是:事实结果告诉我们,被优先选择的是webapp下的文件,如图
这里写图片描述

关于springmvc控制转发还是重定向的写法问题。

转发

/**
 * Created by beyondLi on 2017/6/2.
 */
@Controller
public class ThymeleafController {
    @RequestMapping(value = "cs")
    public String cs(Model model) {
        return "index";
    }
}

转发是不需要手动加html的,此时springboot发现是转发,默认配置下他会自动去templates文件夹下找到对应的文件进行转发,如果return后写的是index.html会报404

重定向

@Controller
public class ThymeleafController {
    @RequestMapping(value = "cs")
    public String cs(Model model) {

        return "redirect:index.html";
    }

首先,添加redirect:这个毋庸置疑是mvc的语法问题,其次这里需要注意的是需要手动添加.html,否则会报404,而重定向则会自动去public文件夹下寻找。至于与webapp优先级别则同上述。

结论

以上为本人在研究springboot时所想到的问题以及找到的一些规律(默认配置下)。至于上述规律的一些原因如果有兴趣的同学可以研究一下,毕竟本人研究的还比较浅显,如果有什么错误,还望提出,共同学习。

### Spring Boot Controller 实现重定向 在 Spring Boot 应用程序中,可以通过多种方式实现控制器中的重定向功能。以下是几种常见的实现方法及其对应的代码示例。 #### 方法一:通过 `redirect:` 前缀返回字符串 当控制器方法返回一个带有前缀 `redirect:` 的字符串时,Spring MVC 将自动将其解析为 HTTP 重定向响应。这种方式简单直观,适用于大多数场景。 ```java @Controller public class RedirectController { @GetMapping("/example1") public String redirectToAnotherPage() { return "redirect:/targetPage"; // 重定向到 /targetPage } } ``` 此方法利用了 Spring MVC 对视图名称的支持机制[^1]。 --- #### 方法二:使用 `ResponseEntity` 或 `HttpServletResponse` 如果需要更灵活地控制重定向行为(例如动态生成目标 URL),可以借助 `ResponseEntity` 或直接操作 `HttpServletResponse` 来完成。 ##### 使用 `ResponseEntity` 示例: ```java @RestController public class ResponseEntityRedirectController { @GetMapping("/example2") public ResponseEntity<Void> redirectUsingResponseEntity() { URI targetUri = UriComponentsBuilder.fromPath("/anotherTarget").build().toUri(); return ResponseEntity.status(HttpStatus.FOUND).location(targetUri).build(); // 设置状态码和位置头 } } ``` 此处展示了如何通过设置 HTTP 状态码以及 Location 头部字段来触发客户端跳转[^4]。 ##### 使用 `HttpServletResponse` 示例: ```java @Controller public class HttpServletResponseRedirectController { @GetMapping("/example3") public void redirectUsingHttpServletResponse(HttpServletResponse response) throws IOException { response.sendRedirect("/yetAnotherTarget"); // 手动发送重定向指令 } } ``` 这种方法绕过了 Spring MVC 的默认处理逻辑,提供了更大的灵活性[^4]。 --- #### 方法三:基于 `ViewControllerRegistry` 配置全局重定向规则 对于固定的 URL 映射关系,可以在应用启动阶段通过配置类注册重定向规则。这通常用于简化某些特定路径的访问流程。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addRedirectViewController("/source", "/destination"); // 定义从/source 到/destination 的重定向 } } ``` 该方案适合于静态化的页面导航需求,无需额外编写单独的控制器方法即可生效[^2]。 --- ### 总结 以上三种方式分别针对不同复杂度的应用场景设计而成。开发者可以根据实际业务需求选择最合适的解决方案。无论是简单的字符串返回还是复杂的自定义逻辑构建,Spring Boot 都能够很好地支持这些开发模式。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值