首页 > 其他分享 >RedirectView 你不知道的 URL重定向原理

RedirectView 你不知道的 URL重定向原理

时间:2024-07-01 12:31:05浏览次数:19  
标签:重定向 URL springframework import response RedirectView

肖哥弹架构 跟大家“弹弹” RedirectView 业务使用与功能设计
欢迎 点赞,点赞,点赞。

关注本人的公众号Solomon肖哥弹架构获取更多精彩内容

RedirectView来实现URL重定向策略。这种技术可以用于优化网站结构、处理页面迁移或实现安全的登录跳转。

类结构设计

image.png

业务说明:

大型电子商务网站,该网站最近进行了一次重大的URL结构调整。为了确保用户在访问旧URL时能够无缝跳转至新URL,我们需要实现一个URL重定向策略。

核心技术点:

  1. URL重定向:将用户从一个URL重定向至另一个URL的过程。
  2. RedirectView:Spring MVC中的一个视图,用于实现URL重定向。
  3. 状态码:HTTP状态码,如301(永久重定向)和302(临时重定向)。

工作流程图:

前端操作:

前端页面将根据服务器的重定向响应,自动跳转到新的URL。

关键代码:

1. Spring MVC配置(Java配置方式):
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.View;
    import org.springframework.web.servlet.view.RedirectView;

    @Configuration
    public class WebConfig {

        @Bean
        public View redirectViewResolver() {
            return new RedirectView();
        }
    }
2. 控制器:
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.servlet.View;

    @Controller
    public class RedirectController {
        @GetMapping("/old-product-page")
        public View redirectOldProductPage() {
            RedirectView redirectView = new RedirectView();
            redirectView.setUrl("/new-product-page");
            // 可以设置状态码redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
            return redirectView;
        }
    }
3. RedirectView 重定向核心代码
protected void sendRedirect(HttpServletRequest request, HttpServletResponse response,
        String targetUrl, boolean http10Compatible) throws IOException {
    // 编码重定向URL,如果是远程主机则直接使用,否则进行URL编码
    String encodedURL = (isRemoteHost(targetUrl) ? targetUrl : response.encodeRedirectURL(targetUrl));

    // 如果需要兼容HTTP 1.0
    if (http10Compatible) {
        // 从请求中获取状态码,如果存在且statusCode属性未设置,则使用请求中的状态码
        HttpStatusCode attributeStatusCode = (HttpStatusCode) request.getAttribute(View.RESPONSE_STATUS_ATTRIBUTE);
        if (this.statusCode != null) {
            response.setStatus(this.statusCode.value()); // 设置自定义状态码
            response.setHeader("Location", encodedURL); // 设置Location头
        } else if (attributeStatusCode != null) {
            response.setStatus(attributeStatusCode.value()); // 使用请求属性中的状态码
            response.setHeader("Location", encodedURL);
        } else {
            // 默认情况下发送状态码302的重定向
            response.sendRedirect(encodedURL); // 发送重定向
        }
    } else {
        // 对于HTTP 1.1,获取适当的状态码
        HttpStatusCode statusCode = getHttp11StatusCode(request, response, targetUrl);
        response.setStatus(statusCode.value()); // 设置状态码
        response.setHeader("Location", encodedURL); // 设置Location头
    }
}

优点:

  1. 改善用户体验:通过重定向确保用户在访问旧URL时能够无缝跳转至新URL。
  2. 搜索引擎优化:使用301重定向可以帮助搜索引擎更新索引,避免因URL变更导致的排名下降。
  3. 维护旧链接:保留旧链接的有效性,避免链接断裂。
  4. 安全性:在登录或敏感操作后使用重定向,可以防止浏览器的"后退"按钮导致的安全问题。
  5. 灵活性RedirectView支持设置重定向的状态码和参数,提供了灵活的重定向策略。

标签:重定向,URL,springframework,import,response,RedirectView
From: https://blog.csdn.net/alises1314/article/details/140097006

相关文章

  • 【攻防世界】ez_curl
    ez_curl题目来源攻防世界NO.GFSJ1188题解是一个PHP的代码审计同时还提供了一个附件app.js,打开后内容如下app.js中:req.query.admin.includes:要求在URL中admin字段的值不包含“false"子串(必须要有admin字段)req.headers.admin.includes:要求在报文头部中admin字段的值......
  • 314 API Versions 01(UrlSegmentApiVersionReader)
    示例1、准备两个版本的CitiesController.cs删除不在需要的TestController.csControllers文件夹下新建v1文件夹,将CitiesController.cs移动到v1中,弹出的对话框点击OK和Yes;新建v2文件夹,拷贝一份CitiesController.cs,命名空间改成v2;v2CitiesController.cs如下usingSyste......
  • Blazor 判断一个内部url是否符合路由
    Blazor内部的方法不对外公开,要么反射,要么自己写写的不好,参考自https://q.cnblogs.com/q/146281,有一点改动。这个其实是适合后端的,比Blazor的路由约束支持要多,判定上可能会出现失误。而且"Microsoft.AspNetCore.Routing"Version="2.2.2"包已过时了publicclassRouteHelper{......
  • dedecms图集dede:field name='imgurls'不能二次使用的解决办法
    {dede:fieldname='imgurls'alt='图片输出区'}图片链接 [field:linkurl/]图片地址[field:imgsrc/]{/dede:field}这个标签不能同时使用2次,所以第二次的话用!!!{dede:productimagelist}图片链接 [field:linkurl/]图片地址[field:imgsrc/]{/dede:productimagelist}   ......
  • URL编码
    URL编码是浏览器发送数据给服务器时使用的编码,它通常附加在URL的参数部分。‍为什么需要URL编码举个例子,我们在百度里搜索“中文”这两个字,其发送给后台服务器的网址类似这样的:https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87我们可以打开浏览器控制台查看:​这些字符串......
  • 常见数据库url 和driver
    转自:http://blog.csdn.net/kimsoft/article/details/3305675PropertiesfilewithJDBC-relatedsettings.##########HSQLDB##########jdbc.driverClassName=org.hsqldb.jdbcDriverjdbc.url=jdbc:hsqldb:hsql://localhost:9001/bookstorejdbc.username=sajdbc.password......
  • m2_day12 [URL + Socket]
    课程内容:URL和SocketServer端Client端URL和SocketURL=>统一资源定位符:网址URLurl=newURL("网址");URLConnectionuc=url.openConnection();InputStreamis=uc.getInputStream();....​uc.getContentLength();得到目标内容长......
  • curl命令 – 文件传输工具
    curl命令来自英文词组CommandLineURL的缩写,其功能是在Shell终端界面中基于URL规则进行文件传输工作。curl是一款综合性的传输工具,可以上传也可以下载,支持HTTP、HTTPS、FTP等30余种常见协‍议。语法格式:curl参数网址URL文件名参考示例获取指定网站的网页源码:[root@linuxcoo......
  • linux - curl
    curl(commandlineuniformresourcelocator),URL命令行,用于发送http请求场景:项目运维过程中,如果没有postman工具,会用到这些命令;docker容器内,如果没有开放端口,只能进容器内用curl进行测试了。#不带有任何参数时,curl默认发出GET请求。curlhttps://www.baidu.com......
  • 如何修改 Git 远程仓库 URL
    修改Git远程仓库URL是一个常见的操作,特别是在远程仓库地址发生变化时。以下是操作步骤:查看当前远程仓库URL首先,你可以使用gitremote-v查看当前配置的远程仓库URL:gitremote-v运行该命令后,你会看到类似下面的输出,其中origin是默认的远程仓库名称:originhttps:/......