是否可以拦截html、css和angularjs中使用的js文件?
Is it possible to intercept html, css and js files used in angularjs?
我已经创建了一个 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(用于模板)做一个拦截器。
正如你所说,
it only applies to all that uses $http service
所以,如果要拦截对html、css和js文件的请求。最好在服务器上完成,而不是客户端。
您可以拦截 html 个文件
var requestInterceptor = function (config) {
if (config.url.indexOf(".html") != -1) {
//custom logic
}
}
尽管以上不适用于 .js
或 .css
,因为它们是使用标签加载的。
.html 文件保存在模板缓存中并触发 $http 请求...
尽管您应该继续并通过在拦截器中执行 console.log(config.url)
来测试所有请求以确保..
这是一个经典的 X-Y 问题。您正在考虑解决问题的方法,但这是错误的方法。
这一行来自您的评论,解释了实际问题:
but the js files that I'm referring to are the business logic of the project. So making it public is not an option.
所以,您的问题是您不想将业务逻辑暴露给尚未登录的人t/can。
对此有多种解决方案。但这一切都归结为一件事:将您的业务逻辑与用于 UI 等 .
的通用 js 代码分开
一旦你将你的 js 分成两部分(不一定是两个文件,但它必须至少是两个文件,它可以更多)你可以将你的公共 js 文件公开为 public .然后您可以决定如何处理加载您的业务逻辑:
让它失败
这可能是最简单的策略。什么都不做,它将无法加载。据推测,您只需要在登录页面上使用您的业务逻辑,因此在登录页面或登录页面中没有它应该不是问题。
将其动态包含在模板中
如果用户未登录,则省略加载业务逻辑js的脚本标签。
在 JS 中动态加载业务逻辑
使用 AJAX 加载它然后评估它或使用 require.js 或使用 jQuery getScript()
或类似的东西仅在用户登录时加载业务逻辑英寸
如果您有创意,您可能会想出更多方法来处理业务逻辑 JS 的加载。不管是什么,关键是你要把普通的js和css文件做成public.
我已经创建了一个 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(用于模板)做一个拦截器。
正如你所说,
it only applies to all that uses $http service
所以,如果要拦截对html、css和js文件的请求。最好在服务器上完成,而不是客户端。
您可以拦截 html 个文件
var requestInterceptor = function (config) {
if (config.url.indexOf(".html") != -1) {
//custom logic
}
}
尽管以上不适用于 .js
或 .css
,因为它们是使用标签加载的。
.html 文件保存在模板缓存中并触发 $http 请求...
尽管您应该继续并通过在拦截器中执行 console.log(config.url)
来测试所有请求以确保..
这是一个经典的 X-Y 问题。您正在考虑解决问题的方法,但这是错误的方法。
这一行来自您的评论,解释了实际问题:
but the js files that I'm referring to are the business logic of the project. So making it public is not an option.
所以,您的问题是您不想将业务逻辑暴露给尚未登录的人t/can。
对此有多种解决方案。但这一切都归结为一件事:将您的业务逻辑与用于 UI 等 .
的通用 js 代码分开一旦你将你的 js 分成两部分(不一定是两个文件,但它必须至少是两个文件,它可以更多)你可以将你的公共 js 文件公开为 public .然后您可以决定如何处理加载您的业务逻辑:
让它失败
这可能是最简单的策略。什么都不做,它将无法加载。据推测,您只需要在登录页面上使用您的业务逻辑,因此在登录页面或登录页面中没有它应该不是问题。
将其动态包含在模板中
如果用户未登录,则省略加载业务逻辑js的脚本标签。
在 JS 中动态加载业务逻辑
使用 AJAX 加载它然后评估它或使用 require.js 或使用 jQuery
getScript()
或类似的东西仅在用户登录时加载业务逻辑英寸
如果您有创意,您可能会想出更多方法来处理业务逻辑 JS 的加载。不管是什么,关键是你要把普通的js和css文件做成public.