处理Tomcat中未经授权的错误消息响应正文

时间:2017-04-28 08:59:05

标签: java security tomcat servlets http-authentication

我正在使用标准servlet容器身份验证(web.xml安全条目)和Tomcat Realm功能(读取用户角色<)为webapp的一部分设置身份验证/ em>来自数据库)。

除了一个方面,一切似乎都符合我的要求:由于身份验证将保护我们的REST API,我希望每个响应都是JSON格式。

但是使用我将要使用的工具,当身份验证失败时,Tomcat会发回一个带有HTML正文的响应。

我发现this question on Spring解决了同样的问题,但它依赖于Spring组件。

是否可以仅使用servlet和Tomcat组件进行自定义?

2 个答案:

答案 0 :(得分:0)

从第一眼看,简单的解决方案可能看起来像错误代码401(或任何其他)的自定义错误页面。  在那里寻找答案: how to specify the default error page in web.xml

P.S。您也可以使用自定义Servlet过滤器来处理错误内容。

答案 1 :(得分:0)

因为您使用的是标准JAX-RS提供程序,所以您可以利用现有的标准。通常你会想要这样的东西:

import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;


@Provider
public class MyExceptionMapper implements ExceptionMapper<RuntimeException> {

    @Override
    @Produces(MediaType.APPLICATION_JSON)
    public Response toResponse(RuntimeException exception) {

        return Response.status(Response.Status.FORBIDDEN)
                       .entity("{\"error\": \"your error message\"}")
                       .type(MediaType.APPLICATION_JSON)
                       .build();
    }
}

这里的难点在于JAX-RS提供商之间的例外情况各不相同。因此,虽然我可能会使用RestEasy获得RuntimeException(我知道我这样做),但泽西的异常可能会有所不同。如果您实现了一个只接受Exception的异常映射器,您可以快速找出JAX-RS提供程序抛出的Exception类型。

这样做的好处是,它主要是标准的,你可以移动到另一个应用服务器,它不会是特定于Tomcat的。