gpt4 book ai didi

java - RESTlet 授权过滤器

转载 作者:行者123 更新时间:2023-11-29 05:49:43 25 4
gpt4 key购买 nike

我正在开发一个 RESTlet API (JAVA),我已经创建了一个自定义授权过滤器,我在将所有请求传递到我的路由器之前运行它。在我的请求中,我总是将 session ID 作为请求属性传递,例如

    http://localhost:8080/myAPI/{sid}/someResource/

现在,在我扩展 ServerResource 的函数中,我可以做这样的事情来轻松提取 {sid}:

    String sid = (getRequestAttributes().containsKey("sid")) ? getRequestAttributes().get("sid").toString() : "";

我的问题是,在我的授权函数中,它扩展了 Filter(授权函数不是通过路由器调用的,而是在我的主 createInboundRoot() 函数中调用的), 我无法使用相同的方法来提取 {sid}。我已经使用 request.getResourceRef().getSegments() 的字符串操作创建了一个解决方法,但一定有更好的方法吗?

任何帮助将不胜感激!

谢谢

最佳答案

您可以为 ServerResource 的任何子级创建一个通用的父级。像这样:

public class CommonParentResource extends ServerResource
{
// class definition
}

然后覆盖其中ServerResource类的doInit()方法。

public class CommonParentResource extends ServerResource
{
public void doInit()
{
boolean authorized=false;

String sid = getRequestAttributes().containsKey("sid") ? (String)getRequestAttributes().get("sid") : StringUtils.EMPTY;

// Authorization logic here.

if(!authorized)//after authorization process completed.
{
getResponse().setStatus(Status.CLIENT_ERROR_UNAUTHORIZED);
getResponse().setEntity(/*Representation carrrying message for unauthorized user*/);
}
}
}

现在,您要执行此授权检查的 ServerResource 的任何新子类都必须扩展此 CommonParentResource 类。像这样:

public class FriendsListResource extends CommonParentResource
{
@Get
//......
}

这里有两点很重要:

  1. doInit() ServerResource 的任何子类在调用任何用 @Get/ 注释的方法之前被调用@Post/...

  2. (注意)如果你不使用这个语句:

    getResponse().setStatus(Status.CLIENT_ERROR_UNAUTHORIZED);

    即如果您没有将 responsestatus 设置为 error,则使用 @Get/ 注释的方法@Post/@Put/... 会被调用!但是,如果您的程序将响应状态设置为错误状态,则 @Get/@Post/@Put/.. . 将不会被执行,最终用户将看到由以下内容表示的错误消息:

    getResponse().setEntity(/*Representation carrrying message for unauthorized user*/);

关于java - RESTlet 授权过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com