是否有可能拦截angularjs中使用的html,css和js文件?

时间:2015-04-15 04:33:38

标签: angularjs angular-http-interceptors

我已经创建了一个http拦截器,根据我的观察,它只适用于所有使用$ http服务的拦截器。如果我想拦截模板中使用的css,html和js文件怎么办?有可能吗?

这是我上面提到的拦截器的代码:

app.factory('redirectInterceptor', function($q,$location,$window){
return  {
    'response':function(response){
    if (typeof response.data === 'string' && response.data.indexOf("My Login Page")>-1) {
        $window.location.href = "/login.html";
        return $q.reject(response);
    }else{
        return response;
    }
    }
}

});

app.config(['$httpProvider',function($httpProvider) {
    $httpProvider.interceptors.push('redirectInterceptor');
}]);

我希望能够为css,html和js(模板)做一个拦截器,就像上面那样。

3 个答案:

答案 0 :(得分:1)

正如你所说,

  

它仅适用于所有使用$ http服务

的人

所以,如果你想拦截对html,css和js文件的请求。最好在服务器上完成,而不是在客户端上完成。

答案 1 :(得分:1)

你可以拦截html文件

    var requestInterceptor = function (config) {

        if (config.url.indexOf(".html") != -1) {
            //custom logic
        }
   }

虽然上面的内容不适用于.js.css,因为它们是使用代码加载的。

.html文件保存在模板缓存中并触发$ http请求...

虽然您应该继续测试拦截器中执行console.log(config.url)所要求的内容以确保..

答案 2 :(得分:1)

这是一个经典的X-Y问题。您正在考虑解决问题,但这是错误的解决方法。

您的评论中的这一行解释了实际问题:

  

但我所指的js文件是项目的业务逻辑。所以公开它不是一种选择。

因此,您的问题是,您不希望将业务逻辑公开给那些无法登录/无法登录的人。

有几个解决方案。但这一切都归结为一件事:将您的业务逻辑与用于UI等的常见js代码分开

一旦你将你的js分成两部分(不一定是两个文件,但它必须至少有两个文件,它可以更多)你可以将你的公共js文件暴露为公共文件。然后,您可以决定如何处理加载业务逻辑:

  1. 让它失败

    这可能是最简单的策略。什么也不做,它将无法加载。据推测,您只需要在登录页面上使用您的业务逻辑,因此不应该在登陆页面或登录页面中使用它。

  2. 动态地将其包含在模板中

    如果用户未登录,只需省略加载业务逻辑js的脚本标记。

  3. 在JS中动态加载业务逻辑

    使用AJAX加载它然后评估它或使用require.js或使用jQuery getScript()或类似的东西仅在用户登录时加载业务逻辑。

  4. 如果你有创意,你可能会想出几种方法来处理加载业务逻辑JS。不管它是什么,关键是你需要公开常见的js和css文件。