javaweb重定向什么意思,Javaweb的跳转问题
大家好,如果您还对javaweb重定向什么意思不太了解,没有关系,今天就由本站为大家分享javaweb重定向什么意思的知识,包括Javaweb的跳转问题的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
java web应用如何实现单点登录
实现方式一:父域 Cookie
实现方式二:认证中心
实现方式三:LocalStorage跨域
补充:域名分级
在 B/S系统中,登录功能通常都是基于 Cookie来实现的。当用户登录成功后,一般会将登录状态记录到 Session中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID或 Token),并要求客户端在之后的每次请求中携带它们。在这样的场景下,使用 Cookie无疑是最方便的,因此我们一般都会将 Session的 ID或 Token保存到 Cookie中,当服务端收到请求后,通过验证 Cookie中的信息来判断用户是否登录。
单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。
单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session中的,要实现共享登录状态,就要先共享 Session,比如可以将 Session序列化到 Redis中,让多个应用系统共享同一个 Redis,直接读取 Redis来获取 Session。
当然仅此是不够的,因为不同的应用系统有着不同的域名,尽管 Session共享了,但是由于 Session ID是往往保存在浏览器 Cookie中的,因此存在作用域的限制,无法跨域名传递,也就是说当用户在 app1.com中登录后,Session ID仅在浏览器访问 app1.com时才会自动在请求头中携带,而当浏览器访问 app2.com时,Session ID是不会被带过去的。实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。
实现方式一:父域 Cookie
在将具体实现之前,我们先来聊一聊 Cookie的作用域。
Cookie的作用域由 domain属性和 path属性共同决定。domain属性的有效值为当前域或其父域的域名/IP地址,在 Tomcat中,domain属性默认为当前域的域名/IP地址。path属性的有效值是以“/”开头的路径,在 Tomcat中,path属性默认为当前 Web应用的上下文路径。
如果将 Cookie的 domain属性设置为当前域的父域,那么就认为它是父域 Cookie。Cookie有一个特点,即父域中的 Cookie被子域所共享,换言之,子域会自动继承父域中的Cookie。
利用 Cookie的这个特点,不难想到,将 Session ID(或 Token)保存到父域中不就行了。没错,我们只需要将 Cookie的 domain属性设置为父域的域名(主域名),同时将 Cookie的 path属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie了。不过这要求应用系统的域名需建立在一个共同的主域名之下,如 tieba.baidu.com和 map.baidu.com,它们都建立在 baidu.com这个主域名之下,那么它们就可以通过这种方式来实现单点登录。
总结:此种实现方式比较简单,但不支持跨主域名。
实现方式二:认证中心
我们可以部署一个认证中心,认证中心就是一个专门负责处理登录请求的独立的 Web服务。
用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token写入 Cookie。(注意这个 Cookie是认证中心的,应用系统是访问不到的。)
应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心。由于这个操作会将认证中心的 Cookie自动带过去,因此,认证中心能够根据 Cookie知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL,并在跳转前生成一个 Token,拼接在目标 URL的后面,回传给目标应用系统。
应用系统拿到 Token之后,还需要向认证中心确认下 Token的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token写入 Cookie,然后给本次访问放行。(注意这个 Cookie是当前应用系统的,其他应用系统是访问不到的。)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token发现用户已登录,于是就不会有认证中心什么事了。
这里顺便介绍两款认证中心的开源实现:
Apereo CAS是一个企业级单点登录系统,其中 CAS的意思是”Central Authentication Service“。它最初是耶鲁大学实验室的项目,后来转让给了 JASIG组织,项目更名为 JASIG CAS,后来该组织并入了Apereo基金会,项目也随之更名为 Apereo CAS。
XXL-SSO是一个简易的单点登录系统,由大众点评工程师许雪里个人开发,代码比较简单,没有做安全控制,因而不推荐直接应用在项目中,这里列出来仅供参考。
总结:此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。
实现方式三:LocalStorage跨域
前面,我们说实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。
父域 Cookie确实是一种不错的解决方案,但是不支持跨域。那么有没有什么奇淫技巧能够让 Cookie跨域传递呢?
很遗憾,浏览器对 Cookie的跨域限制越来越严格。Chrome浏览器还给 Cookie新增了一个 SameSite属性,此举几乎禁止了一切跨域请求的 Cookie传递(超链接除外),并且只有当使用 HTTPs协议时,才有可能被允许在 AJAX跨域请求中接受服务器传来的 Cookie。
不过,在前后端分离的情况下,完全可以不使用 Cookie,我们可以选择将 Session ID(或 Token)保存到浏览器的 LocalStorage中,让前端在每次向后端发送请求时,主动将 LocalStorage的数据传递给服务端。这些都是由前端来控制的,后端需要做的仅仅是在用户登录成功后,将 Session ID(或 Token)放在响应体中传递给前端。
在这样的场景下,单点登录完全可以在前端实现。前端拿到 Session ID(或 Token)后,除了将它写入自己的 LocalStorage中之外,还可以通过特殊手段将它写入多个其他域下的 LocalStorage中。
————————————————
版权声明:本文为CSDN博主「风水道人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jcmj123456/article/details/114296482
前端通过 iframe+postMessage()方式,将同一份 Token写入到了多个域下的 LocalStorage中,前端每次在向后端发送请求之前,都会主动从 LocalStorage中读取 Token并在请求中携带,这样就实现了同一份 Token被多个域所共享。
总结:此种实现方式完全由前端控制,几乎不需要后端参与,同样支持跨域。
补充:域名分级
从专业的角度来说(根据《计算机网络》中的定义),.com、.cn为一级域名(也称顶级域名),.com.cn、baidu.com为二级域名,sina.com.cn、tieba.baidu.com为三级域名,以此类推,N级域名就是 N-1级域名的直接子域名。
从使用者的角度来说,一般把可支持独立备案的主域名称作一级域名,如 baidu.com、sina.com.cn皆可称作一级域名,在主域名下建立的直接子域名称作二级域名,如 tieba.baidu.com为二级域名。
Javaweb的跳转问题
通俗来说,form表单是写在前端页面(如html、jsp)上的,<form>有一个‘action’的参数,这里需要填写目标地址,如果不填写的话客户端是不知道往哪里发送信息的,因此form是由客户端主动发送给服务器(具体的地址就是action索要填的值)的。这属于客户端向服务器发起请求,代码表现为:
<form
action='10086.jsp' method='get'>
…………
</form>
就像你打10086,你问问题(提交表单),客服(服务器)会根据你的问题(form)反馈答案。同理,正常来说,后台接收到前端发来的信息后,会进行一系列操作,最后发送结果回去。
====分割线====
而转发和重定向的代码是写在后台代码里的,因为并不是所有的业务都由同一个后台页面处理(例如统一管理平台),前端form填的是页面A,但实际上页面A在接收到form后并不进行处理,而是通过转发或者重定向的方式,发送给页面B,页面B处理后会把结果发送给A,然后A再反馈给前端。因此,这属于服务器向服务器发起请求
转发的代码是request.getrequestdispatcher(10086-2.jsp).forward(request,response),特点是url不会变,客户端无法判断是form表单的后台页面在处理还是别的页面在处理(你在浏览器上是无法知道10086-2.jsp这个页面的存在)。就像10086客户有时候会让你稍等,等待期间你是不知道他是在敲电脑还是找外援寻求答案。
重定向的代码是response.sendRedirect("10086-2.jsp"),特点是url会变。浏览器的地址栏会明显看到地址发生改变。就像10086客服告诉你该问题不是他负责的范围,然后帮你转接到其他相应的客户。
至于怎么判断啥时候使用转发,啥时候使用重定向,还请理解jsp的四大作用域之后再回头思考。
h5 android 怎么重定向
html,js可以实现页面跳转。
jsp, asp, PHP也有各自页面跳转与重定向的方式。
下文针对js和jsp的页面跳转实现方式进行一个总结。
html页面跳转方式
可以使用html的meta标签实现页面的跳转。
下面解释来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳。
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<TITLE>NewDocument</TITLE>
<METANAME="Author"CONTENT="oscar999">
<metahttp-equiv="refresh"content="0;URL=http://www.csdn.net">
<script>
</script>
</HEAD>
<BODY>
ThisisTestPage
</BODY>
</HTML>
<!--Addbyoscar999--><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"><HTML><HEAD><TITLE>NewDocument</TITLE><METANAME="Author"CONTENT="oscar999"><metahttp-equiv="refresh"content="0;URL=http://www.csdn.net"><script></script></HEAD><BODY>ThisisTestPage</BODY></HTML>这种用法比较常使用在:
新旧系统升级的状况下,暂时保留旧系统,通过域名进入时自动转到新系统中。
JS页面跳转方式
1.使用window.location="newurl"
[html]viewplaincopyprint?
<!--Addbyoscar999-->
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<TITLE>NewDocument</TITLE>
<METANAME="Author"CONTENT="oscar999">
</HEAD>
<BODY>
ThisisTestPage.
<script>
window.location="http://www.csdn.net";
</script>
</BODY>
</HTML>
<!--Addbyoscar999--><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"><HTML><HEAD><TITLE>NewDocument</TITLE><METANAME="Author"CONTENT="oscar999"></HEAD><BODY>ThisisTestPage.<script>window.location="http://www.csdn.net";</script></BODY></HTML>
也可以使用 window.location.rel="external nofollow" href="http://www.csdn.net";
2.使用 window.navigate
window.navigate("http://www.csdn.net");
</script>
<script>window.navigate("http://www.csdn.net");</script>
3. window.loction.replace方式实现页面跳转
<scriptlanguage="JavaScript">
window.location.replace("target.aspx");
</script>
有3个jsp页面(1.aspx, 2.aspx, 3.aspx),进系统默认的是1.aspx,当我进入2.aspx的时候, 2.aspx里面用window.location.replace("3.aspx");
与用window.location.href("3.aspx");
从用户界面来看是没有什么区别的,但是当3.aspx页面有一个"返回"按钮,调用window.history.Go(-1); wondow.history.back();方法的时候,一点这个返回按钮就要返回2.aspx页面的话,区别就出来了,当用 window.location.replace("3.aspx");连到3.aspx页面的话,3.aspx页面中的调用 window.history.go(-1);wondow.history.back();方法是不好用的,会返回到1.aspx。
JSP跳转方式
JSP跳转方式大约有三种:
1. response.sendRedirect(“newurl”);
--此语句前不允许有out.flush(),如果有,会有异常:
Java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
--跳转后浏览器地址栏变化
--如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了
如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;
2. response.setHeader("Location","newurl");
[html] view plain copy print?
response.setStatus(302);
response.setHeader("location","newurl");
response.setStatus(302);
response.setHeader("location","newurl");
这种使用方式要结合 setStatus(302), 302这个状态码就是告诉浏览器要重定向了。
此语句前不允许有out.flush(),如果有,页面不会跳转。
跳转后浏览器地址栏变化
此语句后面的语句执行完成后才会跳转
3.<jsp:forward page="newurl"/>
此语句前不允许有out.flush(),如果有,会有异常:
跳转后浏览器地址栏不变,但是只能跳到当前主机下
此语句后面的语句执行完成后才会跳转
跳转后得路径变为当前路径,图片不是绝对路径将无法显示
例子:
整个简单的例子:两个文件 a.jsp和 b.jsp.
<%@pagelanguage="java"contentType="text/html;charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1">
<title>Inserttitlehere</title>
</head>
<body>
Before:Thisisa.jsp!<br>
<%
//response.sendRedirect("b.jsp");
//response.setStatus(302);
//response.setHeader("location","b.jsp");
%>
<jsp:forwardpage="b.jsp"/>
After:Thisisa.jsp!
</body>
</html>
<!--byoscar999--><!--Thisisa.jsp--><%@pagelanguage="java"contentType="text/html;charset=ISO-8859-1"pageEncoding="ISO-8859-1"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1"><title>Inserttitlehere</title></head><body>Before:Thisisa.jsp!<br><%//response.sendRedirect("b.jsp");//response.setStatus(302);//response.setHeader("location","b.jsp");%><jsp:forwardpage="b.jsp"/>After:Thisisa.jsp!</body></html>
对于jsp而言,就需要嚼一嚼Redirect和 forward的差别了。
就字面意思而已: Redirect翻译成重定向, forward翻译成转发。
两者的区别是:
重定向是客户端行为,转发是服务器行为
重定向过程:客户浏览器发送http请求——》web服务器接受后发送302状态码响应及对应新的location给客户浏览器——》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
转发过程:客户浏览器发送http请求——》web服务器接受此请求——》调用内部的一个方法在容器内部完成请求处理和转发动作——》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
关于javaweb重定向什么意思的内容到此结束,希望对大家有所帮助。