多种情况会导致循环重定向即302报错。你提到了shiro,在shiro最常见的情况是过滤器循环触发,检查思路:
通过浏览器debug, 找到循环访问了哪个请求状态为302, 根据这个请求url,修改shiro配置文件中:
bean名为[orgapacheshirospringwebShiroFilterFactoryBean]中
property名为[filterChainDefinitions]中的[value]对应的过滤值
当然也有可能是其他filter、controller类中的代码反复触发了这个url。
建议写一个能够捕获所有请求的类,例如HandlerInterceptorAdapter类,在preHandle方法中,获取每次请求的url,有助于快速定位存在问题的uri,再找到触发这个请求的源头。
一,业务分析
在分布式系统架构中,假设把上述的三个子系统部署在三个不同的服务器上。前提是用户登录之后才能访问这些子系统。那么使用传统方式,可能会存在这样的问题:
1当访问用户中心,需要用户登录帐号
2当访问购物车,还需要用户登录帐号
3当访问商品结算,又一次需要用户登录帐号
访问每一个子系统都需要用户登录帐号,这样的体验对于用户来说是极差。而使用单点登录就可以很好地解决上述的问题。
二,单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的 session 是无法解决的,我们需要使用相关的单点登录技术来解决。
第一步 :用户访问应用系统1。过滤器判断用户是否登录,没有登录,则重定向(302)到认证系统去进行认证 *** 作。
第二步 :重定向到认证系统,显示登录界面,用户输入用户名密码。认证系统将用户登录的信息记录到服务器的session中。
第三步 :认证系统给浏览器发送一个特殊的凭证ticket,浏览器将凭证交给应用系统1,应用系统1则拿着浏览器交给他的凭证ticket去认证系统验证凭证ticket是否有效。凭证ticket若是有效,将用户信息保存到应用系统1的session中一份,并告知应用系统1,用户通过认证。
第四步 :用户通过认证,浏览器与网站之间进行正常的访问。
第五步 :当用户再次访问应用系统1,由于应用系统1的session中有用户信息,所以就不用经过认证系统认证,就可以直接访问应用系统1了。
第六步 :当用户再去访问其他应用系统时,浏览器会带着凭证ticket过去,其他应用系统到认证系统验证凭证,凭证ticket若是有效,将用户信息保存到其他应用系统的session中一份,并告知其他应用系统,用户通过认证。
第七步 :用户通过认证,浏览器与网站之间进行正常的访问。
第八步 :当用户再次访问其他应用系统,由于其他应用系统的session中有用户信息,所以就不用经过认证系统认证,就可以直接访问其他应用系统了。
三、Yelu大学研发的CAS(Central Authentication Server)
1什么是CAS?
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
1开源的企业级单点登录解决方案。
2CAS Server 为需要独立部署的 Web 应用。这个CAS框架已经提供
3CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括Java, Net, PHP, Perl, Apache, uPortal, Ruby 等。
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:
2CAS的详细登录流程
该图主要描述
1第一次访问>
估计你的Filter配置的拦截地址是
/
也就是所有的请求都会被过滤掉
你的逻辑有点混乱,你必须明白的是,你配置过滤规则是过滤所有的地址。当session里面没有某变量时,你应该跳转到一个地址,这个地址在过滤器里面应该在任何时候都放弃过滤。
例如代码可以这样写:
//如果session里面没有user,则,只有请求indexjsp时放行,否则就跳转到登录
if(requestgetSessiongetAttribute("user")==null){
//如果请求的地址是indexjsp,则放行
if(requestgetRequestURI()endsWith("indexjsp")))
arg2doFilter(arg0, arg1);
else
responsesendRedirect(requestgetContextPath()+"/loginjsp");
}
else{//如果session里面有user,则统统放行
arg2doFilter(arg0, arg1);
}
此外,你的过滤器拦截的地址应该映射为
jsp
不知道你说的是什么意思,你可以吧数据加在url上一起发送,在filter中用requestgetParameter(“数据名称”)获得,request要转为>
其实做站点开发的很少使用java的,像Apache等可以直接配置301跳转,可是tomcat只是一个servlet容器,没办法我只能使用过滤器来实现301跳转,下面把代码分享给大家。
import javaioIOException;
import javaxservletFilter;
import javaxservletFilterChain;
import javaxservletFilterConfig;
import javaxservletServletException;
import javaxservletServletRequest;
import javaxservletServletResponse;
import javaxservlet>
原因在于所连接的页面进行了Redirect。
2302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在>
3所以,Servlet也提供了一个专用的方法,即sendRedirect。使用responsesendRedirect(url)比使用responsesetStatus(responseSC_MOVED_TEMPORARILY)和responsesetHeader("Location",url)更好。原因有以下几点:
(1)使得整个网页代码更加简洁
(2)使用sendRedirect,Servlet会自动构造一个包含新链接的页面(用于那些不能自动重定向的老式浏览器)
(3)sendRedirect能够处理相对URL,自动把它们转换成绝对URL。 注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求>
4严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。
:
出现302错误的原因是由于后端代码写了拦截器Filter,当从网站A访问带有某关键词路径的接口时就会被拦截,因而我将网站A要访问的接口的关键词进行了修改,使其不会被拦截器拦截,就能正常从后端获取数据了。
2302是>
3302转向可能会有URL规范化及网址劫持的问题。可能被搜索引擎判为可疑转向,甚至认为是作弊。
参考资料:
以上就是关于shiro cas 重定向循环 怎么解决的 哥们全部的内容,包括:shiro cas 重定向循环 怎么解决的 哥们、CAS单点登录原理分析(一)、我写的servlet过滤器有问题大家看看这是怎么了谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)