2

我有一个用 Aspect 包装的 restful 服务接口。

@Path("/rs-service/")
public interface ServiceRSI 
{
  @Override
  @POST
  @Path("/lookupParam/")
  @Produces(MediaType.APPLICATION_XML)
  ParamValue getParamValue(GetParamValue request);
}

然后我的 XML 方面..

<aop:config>
    <aop:aspect id="auditLoggingAspect" ref="auditLogging">
        <aop:pointcut id="aspectA" expression="execution(* com.ServiceRSI.*(..))" />
               <aop:around pointcut-ref="aspectA" method="logRequest" />
             />
    </aop:aspect>
</aop:config>

我想要/需要做的是登录已通过身份验证以发出此请求的用户的方面。我使用 MessageDigest 作为我的身份验证的一部分。

通常我会访问 HTTPRequest 以找出在进行调用时经过身份验证的用户,但在这种情况下,它没有传递给方法,所以我不能在这方面拦截它。

任何人都可以建议一种方法来从围绕 restufull 调用的一个方面访问经过身份验证的用户?

谢谢

4

2 回答 2

2

如果您可以从 中访问您需要的信息HttpServletRequest,那么您可以使用RequestContextHolderSpring 来访问这些信息。

ServletRequestAttributes t = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();  
HttpServletRequest req = t.getRequest();

它有帮助吗?

于 2013-06-29T07:32:29.920 回答
1

添加到 web.xml

<listener>  
  <listener-class>  
   org.springframework.web.context.request.RequestContextListener  
  </listener-class>  
</listener>
<listener>  
  <listener-class>
   org.springframework.web.context.ContextLoaderListener  
  </listener-class>  
</listener>

在课堂上,您需要访问它...

@Autowired
  private HttpServletRequest context;

然后是一些代码......(在这种情况下,它从消息摘要登录中提取)

private String getAuthenticationUser()
  {
    String authorization = context.getHeader("authorization");
    if (authorization.startsWith("Digest response")) {
      String[] splits = authorization.split(",");
      for (String split : splits)
      {
        String[] splitKeyValue = split.trim().split("=");
        if(splitKeyValue[0].equalsIgnoreCase("username")) {
          authorization = splitKeyValue[1];
          authorization = authorization.replace("\"", "");
          break;
        }
      }
    }
    return authorization;
  }
于 2013-07-01T15:53:11.813 回答