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

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

该系列的完整写做计划,可见:系列概述html

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

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

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

基本概念

基本原理

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

重定向的基本原理

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

重定向类型

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

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

临时重定向,若是请求的资源临时不可用,但可从其余地方访问。搜索引擎不会记录该临时的连接。常见的状态码有302 Found,307 Temporary Redirect。服务器

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

设置重定向方法

除了上面介绍的重定向方法,还能够经过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";  
}  
复制代码

系列索引:

  1. session和cookie介绍
  2. HTTP重定向
  3. 单点登陆介绍
  4. cookie安全问题
  5. 权限管理介绍

情情说
相关文章
相关标签/搜索