当前位置: 首页 > 知识库问答 >
问题:

如何从泽西2请求过滤器访问wicket会话?

陆耀
2023-03-14

在Jersey 1.x中,我们从一个(Jersey)会话属性访问Wicket会话,如这里https://stackoverflow.com/a/15767824/1399659.所述

在迁移到Jersey 2.x时,使用ContainerRequestFilter似乎是合适的模式,它还允许Springbean注入。我们通过包括

<param-name>jersey.config.server.provider.packages</param-name>

作为 Servlet 容器的初始化参数,并在容器请求筛选实现上使用@Provider注释。但是这个容器过滤器是一个单例的,不可能将 HttpServlet请求注入到其中(参见 JERSEY-2114)

在filter()方法中,我们可以访问ContainerRequest estContext,但不能从那里访问HttpServletRequest。

那么有没有办法:

  1. 在servlet过滤器中启用Spring bean注入(也使用泽西)?
  2. 从ContainerRequest estFilter中访问servlet请求?
  3. 以其他方式从具有泽西过滤能力的Spring-bean感知对象访问wicket会话?

`

import java.io.IOException;

import javax.servlet.http.HttpSession;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.Provider;

import org.apache.wicket.injection.Injector;

@Provider
public class SecurityContextFilter implements ContainerRequestFilter {

//@Context
//HttpServletRequest webRequest;

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
    //HttpSession httpSession = webRequest.getSession();
    //MyWicketSession mySession = (MyWicketSession) httpSession.getAttribute("wicket:" + BaseConstants.WICKET_FILTER_NAME + ":session");
    //doAuthCheck(mySession, requestContext);
}
...
}

`

预先感谢

共有1个答案

施宏大
2023-03-14

固定在泽西2.4:

import javax.annotation.Priority;
import javax.ws.rs.Priorities;

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthRequestFilter implements ContainerRequestFilter {
    @Context
    HttpServletRequest webRequest;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        final HttpSession session = webRequest.getSession();

        requestContext.setSecurityContext(new SecurityContext() {
            @Override
            public Principal getUserPrincipal() {
                return new PrincipalImpl((String)session.getAttribute("USER_NAME"));
            }

            @Override
            public boolean isUserInRole(String s) {
                return false;
            }

            @Override
            public boolean isSecure() {
                return false;
            }

            @Override
            public String getAuthenticationScheme() {
                return null;
            }
        });
    }
}

您也可以在不使用@Provider注释的情况下注册过滤器:

import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ApplicationPath;

/**
 * Root REST resource class.
 */
@ApplicationPath("/rest")
public class RootResource  extends ResourceConfig {
    /**
     * Initializes all resources from REST package.
     */
    public RootResource() {
        packages("com.example.rest");
        register(AuthRequestFilter.class);
    }
}

注意:Glassfish 4.0.0使用旧的Jersey 2.0。你必须使用这些提示来升级球衣(事实证明效果并不好)。或者更好的方法是下载Glassfish 4.0.1的夜间版本。但目前还不完全稳定。希望新版本早日发布。

 类似资料:
  • 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 为空。我可以将上下文注入到被调用的实际endpoint中,但这相当粗糙和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端找到这个对象。 必须有一种简单的方法来做到这一点。到目前为止,我看到的所有问题/答案都不适用于灰熊,或者注入了RESTendpoint调

  • 泽西应用编程接口中是否有任何注释可用于实现基于头值的请求过滤?同样的情况在Spring like中实现 @RequestMapping(value=“/test”,method=RequestMethod.POST,headers={“version=v1.1”})

  • 我正在尝试使用wicket创建一个web应用程序。以下是我遵循的步骤: > < li> 我使用以下命令创建了一个maven项目: mvn原型:generate-DarchetypeGroupId=org.apache。wicket-DarchetypeArtifactId=wicket原型快速启动-DarchetypeVersion=6.6.0-DgroupId=com。mycompany-Dar

  • 在Jersey 2中,我可以将一个定制的、请求特定的值注入到我的资源中吗?具体来说,我想注入一个< code>MyThing,它可以从我的自定义安全上下文< code>MySecurityContext中派生出来。我想直接注入< code>MyThing来使代码变得干净。 有什么办法可以做到这一点吗?根据这个问题,它不能使用尽管本文和此示例表明它可能是可能的。 使用身份验证筛选器,我可以使用以下代

  • 在Jersey中,可以添加或 两者都是使用PackagesResourceConfig添加的: 谢谢