JHipster一知半解- 4.6.3 webapp-block目录

回文集目录:JHipster一知半解

block并非一个子模块,所以并没有index.ts,里面放了系统的一些配置信息、拦截器。

config子目录

prod.config.ts启动时候用的配置,根据传入的DEBUG_INFO_ENABLED决定是否启动生产模式。(DEBUG_INFO_ENABLED实际是根据用的dev还是prod的webpack文件判断的)
uib-pagination.config.ts用来构造通用的PaginationConfig分页配置,可根据工程实际使用情况修改

inteceptor子目录(划重点,JHipster的拦截器实现)

  1. auth-expired.interceptor.ts
responseIntercept(observable: Observable<Response>): Observable<Response> {
        return <Observable<Response>> observable.catch((error, source) => {
            if (error.status === 401) {
                const loginService: LoginService = this.injector.get(LoginService);
                loginService.logout();
            }
            return Observable.throw(error);
        });
    }
仅拦截Response,实现任何通讯请求,只要服务器返回了401,就执行登出操作。
  1. auth.interceptor.ts
requestIntercept(options?: RequestOptionsArgs): RequestOptionsArgs {
        //判断一下是否是向SERVER_API_URL的请求,如果是测试test的就不拦截
        if (!options || !options.url || (/^http/.test(options.url) && !(SERVER_API_URL && options.url.startsWith(SERVER_API_URL)))) {
            return options;
        }
        //从localStorage和sessionStorage两个地方取出认证Token,并加上'Bearer '放到请求头中。
        const token = this.localStorage.retrieve('authenticationToken') || this.sessionStorage.retrieve('authenticationToken');
        if (!!token) {
            options.headers.append('Authorization', 'Bearer ' + token);
        }
        return options;
    }

仅拦截请求Request,这里用Jhipster推荐的JWT方式存储会话认证信息。'Bearer '这个是魔数,前后端都按照这个方式设置和读取。
参见\security\jwtJWTFilter.java。
(HttpSession)方式,代码?

  1. errorhandler.interceptor.ts
responseIntercept(observable: Observable<Response>): Observable<Response> {
        return <Observable<Response>> observable.catch((error) => {
            //401未授权错误,无响应说明text,路径为/api/account用户操作。
            if (!(error.status === 401 && (error.text() === '' ||
                (error.json().path && error.json().path.indexOf('/api/account') === 0 )))) {
                if (this.eventManager !== undefined) {
                    this.eventManager.broadcast( {name: 'jhipsterSampleApplicationNg2App.httpError', content: error});
                }
            }
            return Observable.throw(error);
        });
    }

仅拦截响应Response,针对3种错误,才使用eventManager广播httpError。JhiAlertErrorComponent会接收这个错误,提示一个错误Alert给用户。

  1. notification.interceptor.ts
responseIntercept(observable: Observable<Response>): Observable<Response> {
        return observable.map((response: Response) => {
            const headers = [];
            //取出app-alert,app-params的head信息。
            response.headers.forEach((value, name) => {
                if (name.toLowerCase().endsWith('app-alert') || name.toLowerCase().endsWith('app-params')) {
                    headers.push(name);
                }
            });
            //使用alertService显示成功信息
            if (headers.length > 1) {
                headers.sort();
                const alertKey = response.headers.get(headers[ 0 ]);
                if (typeof alertKey === 'string') {
                    if (this.alertService) {
                        const alertParam = headers.length >= 2 ? response.headers.get(headers[ 1 ]) : null;
                        this.alertService.success(alertKey, { param : alertParam }, null);
                    }
                }
            }
            return response;
        }).catch((error) => {
            return Observable.throw(error); // here, response is an error
        });
    }

仅拦截响应Response,遍历响应头中与app-alert,app-params相关的信息,调用alertService构造一个成功信息。
值得注意的是:

    // tslint:disable-next-line: no-unused-variable
    constructor(private injector: Injector) {
        super();
        setTimeout(() => this.alertService = injector.get(JhiAlertService));
    }

为什么需要手工从注入器获取JhiAlertService,而不是直接注入JhiAlertService?
5.http.provider.ts

defaultOptions,
        [
            new AuthInterceptor(localStorage, sessionStorage),
            new AuthExpiredInterceptor(injector),
            // Other interceptors can be added here
            new ErrorHandlerInterceptor(eventManager),
            new NotificationInterceptor(injector)
        ]

这里定义了Jhipster实现的有拦截器功能的Http客户端,并在app.module.ts中替换掉angular的http。Angular5原生也支持了拦截器,具体实现方式也差不多。
注意这里new 的各个拦截器顺序很重要,JHipster也很贴心提示了,在自己添加拦截器时,修改的位置。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容