SpringBoot+Thymeleaf项目解决HTTPS重定向时变成HTTP,设置redirectHttp10Compatible

3 篇文章 0 订阅
2 篇文章 0 订阅

一、前景

由于新配了https的域名,但不支持通过nginx将域名转为http,在界面有些地方的重定向会失效,显示“was loaded over HTTPS, but requested an insecure frame”报错,所以只能通过代码层面去解决。

项目是springboot+Thymeleaf,网上大概提了几种方法:

  1. 在页面上配上“<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">”

  2. controller里面的方法不要返回String,自己new一个RedirectView方法

  3. 设置redirectHttp10Compatible为false

    这个参数默认是true,表示HTTP的状态码总是302,如果设置为false,则发送HTTP请求的时候变成303,对于HTTP1.1来说是正确的,但是对于HTTP1.0来说无法解析,即不兼容HTTP1.0。虽然对于很多HTTP1.1客户端来说,302和303这两个状态码并没有什么差别,但是在重定向的时候,对于有些客户端来说是需要303的状态码的,设置为false就是为了应对这些场景。

由于重定向地方较多,所以一个个改比较麻烦,就采用方法3,然后方法3网上说的那些方法好像都没有涉及到有Thymeleaf 的情况,在配置文件上配置viewResovler,指向InternalResourceViewResolver,但其实并没有生效,下面就来具体分析看看为啥没生效。

二、视图解析器

所谓重定向,即从一个地址调到另一个地址,是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL,重定向是客户端行为。SpringMVC主要是通过DispatcherServlet来转发请求,然后视图解析器来解析、创建视图。

 1、视图解析器

打断点后进来到ContentNegotiatingViewResolver这个方法,可以看出这里有4个视图解析器,这里的顺序是根据order这个值来的,可以看出第一位是BeanNameViewResolver,之所以是在第一位是因为在创建的时候,设置了order。

来到BeanNameViewResolver的resolveViewName方法中发现,它是直接从上下文中直接获取视图的,如果有就返回,但这个时候其实还没有视图的,所以来到第二个视图解析器ThymeleafViewResolver。

2、ThymeleafViewResolver

我们知道SpringBoot有自动装配bean的功能,主要是通过AutoConfigurationImportSelector来实现的,里面会读取META-INF/spring.factories文件,根据引入的依赖去装配各种bean,ThymeleafViewResolver就是通过里面的ThymeleafAutoConfiguration来创建的。 

这里也设置了order,比上面的BeanNameViewResolver多了5,所以排在第二,另外两个视图解析器ViewResolverComposite和InternalResourceViewResolver都是取的LOWEST_PRECEDENCE = Integer.MAX_VALUE,所以排在ThymeleafViewResolver后面。所以网上说的那些通过配置InternalResourceViewResolver的redirectHttp10Compatible为false不一定能生效,要看是否有其他视图解析器的顺序在其上面。 

此外,@ConditionalOnMissingBean(name = "thymeleafViewResolver")表示根据条件装配,所以当你知道了视图解析器的加载顺序,可能想把InternalResourceViewResolver换成ThymeleafViewResolver,但其实这时候会创建多一个ThymeleafViewResolver出来的,即这个时候会有两个ThymeleafViewResolver。如果你没有指定order,那么新创建的这个会排在原来的后面,只有设置了比原来的ThymeleafViewResolver小的order,才会加载自己配的这个。但由于这个是自己新建的,所以还需要配置引擎ISpringTemplateEngine和其他一些信息,比较麻烦。

三、SpringMVC重定向原理

就像前景里面的方法2,主要是创建RedirectView这个对象去实现的,无法就是根据不同的视图解析器,在不同的地方去创建而已。这里主要说的是ThymeleafViewResolver创建的过程。

创建RedirectView的时候,有个参数是指定http10Compatible,这个这里传的就是ThymeleafViewResolver的redirectHttp10Compatible属性,所以下面就要配置这个属性。 

public RedirectView(String url, boolean contextRelative, boolean http10Compatible) {        super(url);   
    this.contextRelative = contextRelative;   
    this.http10Compatible = http10Compatible;   
    setExposePathVariables(false);
}

四、解决方法

基于上面的说明,我的解决方法是在启动类中获取到原来的ThymeleafViewResolver,然后设置一下那个属性。

ThymeleafViewResolver thymeleafViewResolver = (ThymeleafViewResolver)      SpringContextUtil.getBean("thymeleafViewResolver");thymeleafViewResolver.setRedirectHttp10Compatible(false);

网络相关的可以看看这两个:

HTTP1.0和HTTP2.0的区别,以及HTTP和HTTPS的区别

计算机网络之HTTP、HTTPS、HTTP2

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: springboot+thymeleaf项目是一种基于Java语言开发的Web应用程序。它采用了Spring Boot框架和Thymeleaf模板引擎,可以快速地搭建一个高效、可靠、易于维护的Web应用程序。该项目具有以下特点: 1. 简单易用:Spring Boot框架提供了一系列的自动化配置,使得开发者可以快速地搭建一个Web应用程序,而不需要过多的配置。 2. 高效可靠:Spring Boot框架采用了一系列的优化措施,使得应用程序具有高效、可靠的性能。 3. 易于维护:Thymeleaf模板引擎提供了一种简单、易于维护的模板语言,使得开发者可以快速地开发出具有良好可读性的Web应用程序。 总之,springboot+thymeleaf项目是一种非常优秀的Web应用程序开发框架,可以帮助开发者快速地开发出高效、可靠、易于维护的Web应用程序。 ### 回答2: Spring Boot是一个基于Spring框架的快速开发框架,这个框架的优点在于其简单易用,能够快速搭建一个Java Web应用程序,无需进行复杂的配置和繁琐的XML文件编写。而Thymeleaf则是一种Web和HTML的模板引擎,可以方便地处理文本、链接和表单等元素,支持多重继承和页面片段的复用等特性。 Spring BootThymeleaf的结合,可以帮助开发人员更加简便地搭建Web应用程序。在使用Spring Boot进行项目开发,可以使用Thymeleaf来完成Web开发的视图层,进行模版板的渲染和数据绑定。这样就可以很直接地将数据通过模板引擎展现出来,且更加方便。 在一个Spring Boot Thymeleaf项目的构建中,需要进行如下步骤: 1. 首先,引入Spring BootThymeleaf的依赖以及其他必要的依赖,例如web和mybatis等相关组件。 2. 创建一个Controller类,并使用@Controller注解将类标记为Controller,编写具体的Action方法,这些方法可以用@RequestMapping或@GetMapping等注解来定义处理请求的URL路径和请求类型等相关信息。 3. 创建一个Model类,用于封装需要传输到前端的数据和相关操作等。 4. 在Controller内部设置Model变量并将相关数据注入Model,然后将需要展现的数据作为参数传递给Thymeleaf进行渲染,最后将渲染完成后的结果返回给前端页面展现。 5. 编写HTML页面,使用Thymeleaf标签来渲染动态数据。 需要注意的是,在进行Thymeleaf模板的渲染,需要遵守一定的规范,例如页面中的数据变量名称需与Model中的属性名称一致,引入Thymeleaf命名空间等等。 总之,Spring BootThymeleaf结合使用可以帮助开发人员快速地完成Web开发,整个过程简单而且高效。使用Thymeleaf能够降低模版制作的门槛,进一步提高开发效率,并且能够提供丰富的模版处理标签,使得页面制作更加灵活。 ### 回答3: 近年来,使用SpringBootThymeleaf进行Web开发已经成为越来越多的开发者选择的方案。SpringBoot是一个基于Spring框架的快速Web应用开发框架,而Thymeleaf是一种基于HTML的模板引擎,其中需要了解的内容包括以下几点: 首先,SpringBoot框架的优点是非常明显的。它提供了很多便于使用的方法,例如自动装配,以及基于配置的许多默认值。这使得开发者可以花更少的间和精力来开发项目,将重点放在业务逻辑和功能实现上。 其次,Thymeleaf是一种非常强大和灵活的模板引擎,其语法简单易懂,而且支持HTML5标准。它还提供了一些样式和布局的工具,以及易于使用的表达式和标签,使得Web页面开发更加容易。 当然,SpringBoot集成Thymeleaf的过程也并不复杂。只需添加thymeleaf-starter包依赖,SpringBoot将自动将Thymeleaf注册为默认的模板引擎。然后,您只需要编写Thymeleaf模板文件即可。 最后,值得注意的是,使用SpringBootThymeleaf进行Web开发的好处在于它们之间的紧密集成。这种紧密集成可以更轻松地创建动态和交互性的Web应用程序,这是传统的HTML和JavaScript不能提供的。 总的来说,SpringBootThymeleaf是一对非常强大且易于使用的Web开发工具组合,它们的出现大大提高了Web开发的效率和质量,同也为开发人员提供了更好的开发体验。我们相信,这对于Web开发者来说是非常有价值的组合。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值