• 单点登录与权限管理本质:HTTP重定向


    继续介绍「单点登录与权限管理」系列的第一部分:单点登录与权限管理本质,本篇说说HTTP重定向,它也是完成单点登录的基础知识。

    该系列的完整写作计划,可见文章:系列概述

    单点登录需要在多个web项目之间相互跳转,使用重定向技术,自动完成登录操作。另外,当实际资源被迁移到其他URL时,可使用重定向技术,将访问原有URL的请求,自动跳转到新URL,保持原有URL有效。

    本篇主要从以下几个方面介绍:

    • 重定向基本概念
    • Nginx重定向
    • Servlet重定向
    • Spring使用重定向

    基本概念

    基本原理

    在HTTP协议中,服务器通过发送特定的响应实现重定向,浏览器在接收到响应后,可根据状态码判定重定向,并使用指定的新URL重新请求。重定向的响应状态码为3xx,不同的状态码表示不同的重定向类型。

    重定向的基本原理

    浏览器从响应头中的Location获取新的URL,重新发送请求。

    重定向类型

    重定向类型包括永久重定向、临时重定向、特殊重定向,不同的重定向类型,一方面会影响浏览器的操作,一方面会影响搜索引擎的收录。

    永久重定向,是指原URL不再被使用,应优先选择新的URL,搜索引擎机器人会在遇到该状态码时,触发更新操作,使用新的URL。常见的状态码有301,Moved Permanently。

    临时重定向,如果请求的资源临时不可用,但可从其他地方访问。搜索引擎不会记录该临时的链接。常见的状态码有302 Found,307 Temporary Redirect。

    特殊重定向,304 Not Modified 资源未被修改,会从本地缓存中获取网页;300 Multiple Choice,是一种手工重定向,用户可选择重定向的页面。

    设置重定向方法

    除了上面介绍的重定向方法,还可以通过HTML的metay元素,或者JS实现重定向,但还是建议优先选择上面介绍方法。

    <head> 
      <meta http-equiv="refresh" content="0;URL=https://www.mi.com" />
    </head>
    

    content属性值,第一个数字表示等待多少秒后进行跳转。

    window.location = "https://www.mi.com";
    

    Nginx重定向

    rewrite

    nginx的rewrite主要功能就是实现URL的重定向,其语法规则如下:

    rewrite <regex> <replacement> [flag]
    

    regex 正则匹配需要重定向的url
    replacement 替换内容,将正则匹配的内容替换成replacement
    flag 标记,具体如下:

    • last:本条规则匹配之后,继续向下匹配新的rewrite;
    • break:本条规则匹配完成即终止,后面的规则不再匹配;
    • redirect:返回302临时重定向;
    • permanent:返回301永久重定向;

    rewirte参数的标签段位置:server,location,if

    rewrite示例

    将 mi.com 重定向 www.mi.com

    server {
            listen 80;
            server_name mi.com;
            rewrite ^/(.*) http://www.mi.com/$1 permanent;
    }
    
    return

    可通过return直接重定向,如下:

    server {
        listen 80;
        server_name example.com;
        return 301 $scheme://www.mi.com$request_uri;
    }
    

    Servlet重定向

    首先要区分开转发和重定向的概念,转发是在服务端完成的,浏览器地址栏中的地址不会改变,是一次请求;重定向是在浏览器端完成的,浏览器地址栏会变化,是二次请求。

    无论是转发还是重定向,在执行方法前,不要向客户端输出内容.

    转发
    public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { 
        response.setContentType("text/html; charset=utf-8"); 
        ServletContext sc = getServletContext();    
        RequestDispatcher dispatcher = null; 
        dispatcher = sc.getRequestDispatcher("index.jsp");              
        dispatcher.forward(request, response); 
    }
    
    重定向
    public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { 
        response.setContentType("text/html; charset=utf-8"); 
        response.sendRedirect("/index.jsp"); 
    }
    

    Spring使用重定向

    不带参数
    return new ModelAndView("redirect:/toList");
    
    return "redirect:/toList";
    
    带参数
    public String test(RedirectAttributes attributes) 
    { 
        attributes.addAttribute("hello", "hello"); 
        return "redirect:/toList"; 
    }
    

    这样会在重定向后的url中自动追加参数。

    Spring MVC 3.1 版本添加了一个新特性,Flash属性,可以实现传递参数,并且可以解决重复提交的问题。

    一个正常的Controller处理时,处理完成之后,会被forward到一个操作成功的页面,如果用户按F5,就会再次提交一遍,如果使用redirect,就可以避免这个问题。

    public String test(RedirectAttributes attributes)  {  
        attributes.addFlashAttribute("hello", "hello");
        return "redirect:/toList";  
    }
    

     


    情情说

     

  • 相关阅读:
    2020-2021-1 20201329 《信息安全专业导论》第十一周学习总结
    python gui
    2020-2021-1 20201329 《信息安全专业导论》第十周学习总结
    2020-2021-1 20201329 《信息安全专业导论》第九周学习总结
    四则运算
    熟悉编程语言
    链表
    网站设计
    使用nmap扫描队友
    熟悉编程语言
  • 原文地址:https://www.cnblogs.com/qqtalk/p/8793493.html
Copyright © 2020-2023  润新知