解决使用gateway后静态资源失效的问题

关于使用gateway后静态资源失效问题

配置文件方式对应服务配置文件目录提供参考

F12可以看到静态资源路径全部都是加载失败。这是因为我们没有对静态文件进行路由导致。

配置文件方式

贴出主要配置:/static/**表示对静态资源的路由

routes:
        - id: home-service
          uri: lb://home-service #lb表示从注册中心找到服务
          predicates: #路由规则
            - Path=/home-service/**, /static/**
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user-service/**, /static/**

对应服务配置文件

spring:
  resources:
    static-locations: 静态资源路径

目录提供参考

记录一次SSO gateway=true 失效的问题

问题发生场景:

当用户在门户登录后(门户集成sso(4.0 版本)单点登录,门户使用自己的登录界面,使用sso中的gateway=true特性实现),经过一段时间后,用户刷新门户,如果门户会话状态和全局sso失效,按照设想是会回到门户登录界面,而不是sso的登录界面,但是有时却回到sso的登录界面,并且浏览器地址栏带有“gateway=true”查询参数。

用户在刷新一次浏览器才能回到门户登录界面。

一开始想到是sso中的gateway=true参数失效,在login-webflow.xml文件中增加一个action-state用来再次检查gateway参数,并在decision-state id 为“gatewayRequestCheck”中使用新增加的action-state 对gateway再一次检查。

配置以及代码如下:

xml配置

login-webflow.xml

	<decision-state id="gatewayRequestCheck">
		<if
			test="requestParameters.gateway != '' and requestParameters.gateway != null and flowScope.service != null"
			then="gatewayServicesManagementCheck" else="gatewayParameterCheck" />
	</decision-state>

	<!-- 增加再次对gateway参数检查 -->
	<action-state id="gatewayParameterCheck">
		<evaluate expression="gatewayParameterCheck"/>
		<transition on="yes" to="gatewayServicesManagementCheck" />
		<transition on="no" to="serviceAuthorizationCheck" />
	</action-state>
	<!-- 增加再次对gateway参数检查 #-->

cas-servlet.xml

  <!-- 检查gateway参数 -->
  <bean id="gatewayParameterCheck" class="com.wisdragon.cas.web.flow.GatewayParameterCheck"
    c:servicesManager-ref="servicesManager" />
  <!-- 检查gateway参数# -->

Java代码:

public class GatewayParameterCheck extends AbstractAction {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @NotNull
    private final ServicesManager servicesManager;
    /**
     * Initialize the component with an instance of the services manager.
     * @param servicesManager the service registry instance.
     */
    public GatewayParameterCheck(final ServicesManager servicesManager) {
        this.servicesManager = servicesManager;
    }

    @Override
    protected Event doExecute(final RequestContext context) throws Exception {
        final Service service = WebUtils.getService(context);
        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
        String gateWayV = request.getParameter("gateway");
        if (StringUtils.hasText(gateWayV) && service != null) {
        	if ("true".equals(gateWayV)) {
        		logger.info("gateway参数校验,校验信息:gateway={}, 请求服务信息:{}", gateWayV, service.toString());
        		return  yes();
        	}
        }
        return no();
    }
}

更新到生产环境后,经用户测试发现此方案无效。此方案无效后,只能再次去回归login-webflow的登录流程,总结的流程图如下:

上图只是涉及到登录部分简单截图,不涉及到TGT以及ST。

由上图可以发现,在“ticketGrantingTicketCheck”节点之后,如果TGT不存在,则会去检查gateway参数,如果gateway存在,则会去到节点“gatewayServicesManagementCheck”,如果不存在,则回到节点“serviceAuthorizationCheck”,到该节点一般也就会到sso的登录界面了。

之前在节点“gatewayRequestCheck”后增加了gateway参数再次检查的节点“gatewayParameterCheck”发现无效果。

因此可以排除走这条线的可能性,剩下的只有TGT存在无效到sso登录界面这条线了。在这个action-state之中只是对tgt相关的cookie进行清除,并没有对gateway参数进行检查,因此有可能是问题的所在。

验证猜想。

1. 将TGT的存活时间暂时设置为60秒(默认为2小时),方便测试。

修改配置文件:ticketExpirationPolicies.xml

<!-- TicketGrantingTicketExpirationPolicy: Default as of 3.5 -->
    <!-- Provides both idle and hard timeouts, for instance 2 hour sliding window with an 8 hour max lifetime
    "-->
    <bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.TicketGrantingTicketExpirationPolicy"
          p:maxTimeToLiveInSeconds="${tgt.maxTimeToLiveInSeconds:28800}"
          p:timeToKillInSeconds="${tgt.timeToKillInSeconds:60}"/>

2. 重新发布sso程序,从门户认证成功后,等待60秒过后,再次刷新门户系统,发现果然到sso登录界面。重复实现多次发现都时一样。由此可以得出,由于门户使用的TGT失效,并没有检查gateway参数因此跳转到sso的登录界面。

3. 解决方案:只需在action-state 节点中增加对gateway参数的检查逻辑,根据检查的结果到不同的节点即可。新的流程图如下:

在上图中增加节点 “terminateSession”的 条件为“gateway”的transition,当请求中存在gateway参数时,让流程到gatewayRequestCheck节点。

代码:

        final HttpServletResponse response = WebUtils.getHttpServletResponse(context);
        this.ticketGrantingTicketCookieGenerator.removeCookie(response);
        this.warnCookieGenerator.removeCookie(response);

        /**
         * 检查gateway参数,如果为true,走gatewayRequestCheck
         */
        final String hasGateWayParameter = WebUtils.getHttpServletRequest(context).getParameter("gateway");
        if (!VTools.StringIsNullOrSpace(hasGateWayParameter) && "true".equals(hasGateWayParameter)) {
        	 return new Event(this, "gateway");
        }
        return this.eventFactorySupport.success(this);

本地重新编译测试后发现可正常跳转回门户登录界面。将TGT的存活时间恢复默认值,发布到线上后,留意一段时间,发现没有出现改问题,至此解决问题。

总结:

sso login-webflow 登录流程较为复杂,出现问题时,应该根据登录流程图分析判断问题出现在哪些节点上,然后修改相关参数重现问题,之后修改相关逻辑验证以及解决问题。

(0)

相关推荐

  • 详解SpringCloud Gateway 2020.0.2最新版

    简述 官网:https://spring.io/projects/spring-cloud-gateway GitHub地址:https://github.com/spring-cloud/spring-cloud-gateway 本文编写自2021年4月7日,当前SpringCloud最新版本为2020.0.2版本 本文使用版本为 SpringCloud 版本2020.0.2 spring-cloud-starter-gateway版本3.0.2 spring-boot-starter版本2.

  • 解决vue打包之后静态资源图片失效的问题

    1.问题描述 在项目开发中,当我们通过npm run build打包之后将文件放在服务器上时通常会出现图片失效问题,控制台中提示某个图片没有找到(404错误),这些图片可以是以src引入的图片, 也可以是css中定义的背景图片.图片能否显示与你的静态资源文件存在位置和引入的路径直接相关,下面是我的其中一个项目的文件存放以及路径书写方式! 2.解决方法之一 静态资源static存放位置放在src目录下 你可能会问为什么放在src目录下?放在跟src同级目录下不可以吗?好吧,一开始我也是放在src同

  • Spring Cloud GateWay 路由转发规则介绍详解

    Spring在因Netflix开源流产事件后,在不断的更换Netflix相关的组件,比如:Eureka.Zuul.Feign.Ribbon等,Zuul的替代产品就是SpringCloud Gateway,这是Spring团队研发的网关组件,可以实现限流.安全认证.支持长连接等新特性. Spring Cloud Gateway Spring Cloud Gateway是SpringCloud的全新子项目,该项目基于Spring5.x.SpringBoot2.x技术版本进行编写,意在提供简单方便.可

  • 解决使用gateway后静态资源失效的问题

    关于使用gateway后静态资源失效问题 配置文件方式对应服务配置文件目录提供参考 F12可以看到静态资源路径全部都是加载失败.这是因为我们没有对静态文件进行路由导致. 配置文件方式 贴出主要配置:/static/**表示对静态资源的路由 routes: - id: home-service uri: lb://home-service #lb表示从注册中心找到服务 predicates: #路由规则 - Path=/home-service/**, /static/** - id: user-

  • 解决Django加载静态资源失败的问题

    Django项目中为什么会加载静态时会失败呢? 原因:django部署方式比较特别,采用静态文件路径:STATICFILES_DIRS的部署方式,之前你写的相对路径,绝对路径因为缺少静态文件路径而全部失效 做页面显示时,肯定少不了加载css,js等文件吧,但是在Django中,我们的这些文件应该放在哪里呢?又该如何来配置? 1.Django中有静态文件(static)文件夹 2.配置相关文件 在settings.py文件中 STATIC_URL = '/static/' #添加这段代码 STAT

  • 关于vue打包时的publicPath就是打包后静态资源的路径问题

    情况一 当不配置vue.config.js或者没有publicPath属性时,默认访问的静态路径是服务器的根目录 服务器根目录下没有js文件夹所以访问失败,把dist下的js,css等静态文件剪切到wamp/www目录下就可以正常访问了(注意重启wamp) 情况二 当配置为当前目录’./’ 访问正常,其实publicPath当前目录即打包后的index.html的当前目录,即dist目录,怎么证明,把publicPath的值设置为’…/’,看看情况三 情况三 又报错,把js,css等静态文件复制

  • 解决使用security和静态资源被拦截的问题

    目录 使用security和静态资源被拦截 解决方法 Spring Security踩坑记录(静态资源放行异常) 问题描述 解决 1.首先尝试使用网上的方法继承 WebSecurityConfigurerAdapter 2.于是我又重写了方法 protected void configure(HttpSecurity http) 3.最终发现是跨域配置和springsecurity产生了冲突 使用security和静态资源被拦截 之前的博客中我给过如何在springboot中整合security

  • vue cli3.0打包上线静态资源找不到路径的解决操作

    项目中遇到打包之后静态资源路径找不到,报如下错误: 解决方法是: 在项目的根目录下创建vue.config,js文件,在里面配置静态资源的路径,publicPath是配置静态资源路径的属性,vue.config,js文件的代码如下: module.exports = { publicPath: './' } 补充知识:vue-cli3 npm run build 打包后静态资源的配置 vue.config.js的配置 vue.config.js配置如下: const path = require

  • 解决vue项目 build之后资源文件找不到的问题

    解决静态资源失效的问题 这就需要修改我们的 config 中的 index.js了,默认的build 中的部分是这样的: build: { // Template for index.html index: path.resolve(__dirname, '../dist/index.html'), // Paths assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublic

  • vue-cli4如何打包静态资源到指定目录

    目录 打包静态资源到指定目录 解决 vue-cli打包访问静态资源404 打包静态资源到指定目录 在最近开发工作中,我打包的 dist 文件夹下,vue-cli4 打包(npm run build)的静态资源全部都平铺展开在该文件夹下,看着很别扭,于是想打包到 static 文件夹下. vue-cli4 执行打包命令时,默认打包的位置是dist文件夹下,不会自动打包为一个模块(文件夹). 解决 在 vue.config.js 文件中设置 assetsDir 指定打包的目录为根目录下的 stati

  • 如何解决flask修改静态资源后缓存文件不能及时更改问题

    run.py from flask import url_for @app.context_processor # 上下文渲染器,给所有html添加渲染参数 def inject_url(): data = { "url_for": dated_url_for, } return data def dated_url_for(endpoint, **values): filename = None if endpoint == 'static': filename = values.g

  • vue打包静态资源后显示空白及static文件路径报错的解决

    今天使用vue打包(npm run build)遇到了几个坑,在这里分享给大家 打包之后打开dist的页面显示空白: 这个问题以前就处理过,是打包过程中出现错误频率较高的一种,可能有3处地方会出现这种情况 1.记得改一下config下面的index.js中bulid模块导出的路径.因为打包后的index.html里边的内容都是通过script标签引入的,默认显示的路径不对,打开肯定是空白的. build: { index: path.resolve(__dirname, '../dist/ind

随机推荐