如何在 jersey 1.11 过滤器中添加自定义响应和中止请求

Posted

技术标签:

【中文标题】如何在 jersey 1.11 过滤器中添加自定义响应和中止请求【英文标题】:How to add custom response and abort request in jersey 1.11 filters 【发布时间】:2013-06-13 04:05:29 【问题描述】:

我正在尝试在 jersey 1.11 过滤器中为 rest 调用实现用户身份验证。

这是我尝试过的

package com.ilrn.session.webservices.rest.filter;

import com.ilrn.entity.User;;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerRequestFilter;

public class CustomFilter implements ContainerRequestFilter

    @Override
    public ContainerRequest filter(ContainerRequest request) 
        User user = Helper.getCurrentUser();
        if(user == null)
            //Need to add custom response and abort request
        
        return request;
    


有没有人知道任何方法或东西可以达到同样的效果?

【问题讨论】:

【参考方案1】:

如果发生错误,如果要发送自定义响应,则需要抛出 WebApplicationException。创建一个 Response 对象并使用以下异常构造函数将其发回:

WebApplicationException(Response response) 
          Construct a new instance using the supplied response

试试这个:

@Override
public ContainerRequest filter(ContainerRequest request) 
    User user = Helper.getCurrentUser();
    if(user == null)
        ResponseBuilder builder = null;
        String response = "Custom message";
        builder = Response.status(Response.Status.UNAUTHORIZED).entity(response);
        throw new WebApplicationException(builder.build());

    
    return request;

【讨论】:

@JunedAhsan 感谢您提供答案。 Jersey 2.X 的文档比 1.X 好,这部分不是很清楚,直到我看到你的回复。 @AkshayaAradhya Jersey 自成立以来在代码和文档方面都有很大改进。但我喜欢这个框架,因为 jersey 是我用于 RESTful 服务的第一个框架,它让我的生活变得更简单。 @JunedAhsan 请让我知道是否有办法在上面显示的示例中返回 ok 响应。 @AkshayaAradhya 过滤器旨在修改请求。所以通常你不需要通过抛出异常来中止请求。只需返回原始请求。如果您仍想以 ok 响应中止,只需将“Response.Status.UNAUTHORIZED”替换为 Response.Status.ok。 @TheoBriscoe 是否可以在不抛出异常的情况下返回请求。我想返回一个好的响应。在不需要异常的情况下抛出异常似乎是错误的。

以上是关于如何在 jersey 1.11 过滤器中添加自定义响应和中止请求的主要内容,如果未能解决你的问题,请参考以下文章

Jersey统一异常处理

将自定义数据从 Jersey Filter 服务传递到 Jersey End-Point 服务

在 Jersey 生命周期中如何拦截请求?

使用 ContainerRequestFilter 在 Jersey WebService 中自定义 @RolesAllowed 角色

将对象注入过滤器

如何在 Spring Cloud Gateway 中添加特定于路由的自定义过滤器