我正在使用标准servlet容器身份验证(web.xml
安全条目)和Tomcat Realm功能(读取用户和角色<)为webapp的一部分设置身份验证/ em>来自数据库)。
除了一个方面,一切似乎都符合我的要求:由于身份验证将保护我们的REST API,我希望每个响应都是JSON格式。
但是使用我将要使用的工具,当身份验证失败时,Tomcat会发回一个带有HTML正文的响应。
我发现this question on Spring解决了同样的问题,但它依赖于Spring组件。
是否可以仅使用servlet和Tomcat组件进行自定义?
答案 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的。