如何通知客户端关于Servlet中的错误?



我正在Servlet + ReactJS应用程序。问题出现了——如何准确地组织客户端关于任何错误的通知。

我只看到两个选项:

  1. 在服务层中,捕获异常(在代码中手动抛出或在),然后将消息和操作结果代码返回给servlet
  2. 。例如:

Servlet:

@WebServlet("/")
public class TestServlet extends HttpServlet {
SomeSerivce service= new SomeSerivce();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Message msg=service.someDo(req.getParameter("test"));
resp.setStatus(msg.getCode());
PrintWriter printWriter = resp.getWriter();
printWriter.write(msg.getText());
}
}

检查get-request参数类型的服务

public class SomeSerivce {
public Message someDo(String param){
Message msg = new Message();
try {
int a = Integer.parseInt(param);
}catch (IllegalArgumentException e){
msg.setCode(HttpServletResponse.SC_BAD_REQUEST);
msg.setText("some text");
return  msg;
}catch (Exception e){
msg.setCode(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
msg.setText("some text");
return  msg;
}
msg.setCode(HttpServletResponse.SC_OK);
msg.setText("some text");
return msg;
}
}

public  class Message{
private int code;
private String text;
.........
}
  1. 不要捕获任何异常,只创建单独的servlet,在确定时调用
  2. 例如:

在web . xml

<error-page>
<exception-type>java.lang.IllegalArgumentException</exception-type>
<location>/AppExceptionHandler</location>
</error-page>

为路径/AppExceptionHandler

创建一个servlet
@WebServlet("/AppExceptionHandler")
public class AppExceptionHandler extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
PrintWriter printWriter = response.getWriter();
printWriter.write("Some text");
printWriter.close();
}

}

哪个选项更好?

选项1。好一点了,但还可以改进。请记住,如果您的服务向Internet公开,任何人都可以向它发送HTTP请求,这就是您不想公开应用程序内部工作原理的原因。你应该捕捉在你的服务方法中抛出的异常,如果抛出了异常,设置一个通用的错误状态,比如500,并将详细信息记录在文件中。

这是一个例子

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Message msg = null;
try {
msg = service.someDo(req.getParameter("test"));
PrintWriter printWriter = resp.getWriter();
printWriter.write(msg.getText());
} catch (ExceptionType e) {
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
logger.error("Some message", e);
}
}

在前端触发HTTP请求,读取HTTP响应状态并显示您的业务页面,如果它是200,否则只显示一个错误页面。

选项2。是不好的,因为它创建了一个重定向,你必须设置你的HTTP客户端遵循重定向。