为什么我的 Angular 服务请求没有到达 Java servlet?

Why does my Angular service request not reach Java servlet?

提问人:lxiscas 提问时间:10/31/2023 更新时间:11/12/2023 访问量:32

问:

人:

我是 Angular 的新手。我们的团队正在用 Angular 16.1.8 重写前端,并保留 Java(开放的 JDK 1.8)作为后端编程语言。我需要在 Angular 中实现一个日志类,以便我们可以将 GUI 日志信息保存到后端文件。我们计划从 GUI 发送日志服务调用,并使用 Java servlet 接受请求并使用现有 Java log4j 写入日志文件。但是,我无法进行日志服务调用以访问 servlet;在调试模式下,根本没有在 Servlet 中执行任何语句。另一方面,在我的代码进行服务调用之前,一切正常。还有其他类似的服务调用,其他 servlet 确实会收到请求。谁能给我一个提示?

我附上 Angular 代码如下:

import { Injectable } from '@angular/core';
import { WebServiceClient } from './web.service.client';

@Injectable({
  providedIn: 'root'
})
export class LogService {

    constructor(private departureService : WebServiceClient) { }

    public logToServer(severity : string, message : string) {
    // We are using POST instead of GET for security reasons. GET is flagged by 
    // Software Security testing tools like WebInspect
        return this.departureService.post(
          "http://localhost:8080/departures"
          , '/application-log'
          , {
             "applicationName" :  "Departure-ui",
             "dateTime" : new Date(),
             "severity" : severity,
              "message" : message
         }
         , "json");
    }

  }

我将按如下方式附上 Java 代码:

package gov.faa.infra.ifp.web.portlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;

import gov.faa.infra.ifp.bo.IfpAccessBo.ModeType;
import gov.faa.infra.ifp.domain.ResponseMessage.Importance;
import gov.faa.infra.ifp.util.IfpSession;
import gov.faa.infra.ifp.util.JsonUtils;

@WebServlet("/application-log")
public class LogServlet extends BaseServiceServlet {
    private static final long serialVersionUID = 1L;
    private static final Logger logger = null;

    @Override
    protected void doGet(
            HttpServletRequest request, HttpServletResponse response) 
                    throws ServletException, IOException {
        response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
        throw new ServletException("GET method is not supported");
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        long start = System.currentTimeMillis();
        int transactionHashCode = -1;
        String parameter = null;
        Boolean serviceIsValid = null;
        int status = HttpServletResponse.SC_OK;
        String statusMessage = null;

        Log logInput = null;
        String severity = null;
        String logMessage = null;

        try {
            transactionHashCode = 
                    IfpSession.getSession().beginReadOnlyTransaction();
            
            if(this.verifyAccess(ModeType.QueryFlightProcedure, request)) {
                logInput = JsonUtils.hydrateObject(
                            (parameter = this.readInputAsString(request))
                            , Log.class);

                
                if (StringUtils.isNotEmpty(logInput.getMessage())) {
                    logMessage = "";
                    
                    if (StringUtils.isNotEmpty(logInput.getDateTime()))
                        logMessage = logMessage + logInput.getDateTime();
                    
                    if (StringUtils.isNotEmpty(logInput.getApplicationName()))
                        logMessage = logMessage + logInput.getApplicationName();                
                    
                    if (StringUtils.isNotEmpty(logInput.getSeverity()))
                        logMessage = logMessage + logInput.getSeverity();
                    
                    if (StringUtils.isNotEmpty(logInput.getMessage()))
                        logMessage = logMessage + logInput.getMessage();
                    
                    severity = logInput.getSeverity();
                    
                    switch (severity) {
                        case "success": 
                            logger.trace(logMessage);
                            break;
                        case "info": 
                            logger.info(logMessage);
                            break;
                        case "warning": 
                            logger.warn(logMessage);
                            break;
                        case "error": 
                            logger.error(logMessage);
                            break;
                    }
                    
                } else {
                    IfpSession.getSession().addMessage(Importance.Failure, "empty log message", null);
                    status = HttpServletResponse.SC_BAD_REQUEST;
                }
                
            }
            else
                status = HttpServletResponse.SC_UNAUTHORIZED;       
                IfpSession.getSession().addMessage(Importance.Failure, "unauthorized access", null);
            
        }
        catch(Exception exception) {
            this.ifpSessionResponseWithExceptionAndRollback(
                    response, null, transactionHashCode
                    , "unable to write log" 
                            + (statusMessage == null 
                                    ? "" : " while " + statusMessage)
                    , exception
                    , new Object[] { 
                            serviceIsValid, parameter 
                    });
        }
        finally {
            IfpSession.getSession().rollbackTransaction(transactionHashCode);
            this.logTiming("completed LogServlet.doPost", start);
        }
    }

}
Java Angular Servlets 服务

评论

2赞 Andrei 10/31/2023
您应该将此 metod 称为 ,因为 angular http 服务返回可观察对象。Observables 是惰性的,如果没有隐式或显式调用,甚至不会调用logService.logToServer('warning', 'message').subscribe().subscribe()
0赞 Henrik Bøgelund Lavstsen 10/31/2023
WebServiceClient 它返回什么?此外,它有 4 个参数,它们看起来有点奇怪,您能否从该服务中透露 post 方法的外观。只是为了更清楚地了解它是如何工作的。

答:

0赞 Peter Nagy 11/12/2023 #1

也许您可以检查一下 CORS 策略是否禁止调用您的后端。在开发时使用代理可能是个好主意。您会在控制台中看到一些错误消息吗?