小编Mar*_*ele的帖子

如何使用基于JWT的身份验证处理文件下载?

我正在Angular中编写一个webapp,其中身份验证由JWT令牌处理,这意味着每个请求都有一个带有所有必要信息的"身份验证"标头.

这适用于REST调用,但我不明白我应该如何处理后端托管的文件的下载链接(这些文件驻留在托管webservices的同一服务器上).

我不能使用常规<a href='...'/>链接,因为它们不会携带任何标头,验证将失败.同样的各种咒语window.open(...).

我想到的一些解决方案:

  1. 在服务器上生成临时不安全的下载链接
  2. 将身份验证信息作为url参数传递并手动处理案例
  3. 通过XHR获取数据并保存文件客户端.

以上所有都不太令人满意.

1是我现在使用的解决方案.我不喜欢它有两个原因:首先它不是理想的安全性,其次它可以工作,但它需要相当多的工作,特别是在服务器上:下载一些我需要调用一个生成一个新"随机"的服务"url,将它存储在某个地方(可能在数据库上)一段时间,并将其返回给客户端.客户端获取URL,并使用window.open或类似的.请求时,新URL应检查它是否仍然有效,然后返回数据.

2似乎至少同样多的工作.

3看起来很多工作,甚至使用可用的库,以及许多潜在的问题.(我需要提供自己的下载状态栏,将整个文件加载到内存中,然后要求用户在本地保存文件).

这个任务似乎是一个非常基本的任务,所以我想知道是否有更简单的东西我可以使用.

我不一定在寻找"Angular方式"的解决方案.常规Javascript会没事的.

javascript jwt angularjs

95
推荐指数
6
解决办法
2万
查看次数

使用Java Generics为实体实现转换器

我正在使用Spring和Hibernate开发JSF项目,其中包括许多Converter遵循相同模式的s:

  • getAsObject 接收对象id的字符串表示形式,将其转换为数字,并获取给定种类的实体和给定的id

  • getAsString receive和entity并返回转换为的对象的id String

代码基本上是以下内容(省略检查):

@ManagedBean(name="myConverter")
@SessionScoped
public class MyConverter implements Converter {
    private MyService myService;

    /* ... */
    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
        int id = Integer.parseInt(value);
        return myService.getById(id);
    }

    @Override
    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
        return ((MyEntity)value).getId().toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于大量的ConverterS中的完全一样(除了类型MyServiceMyEntity当然的),我想知道,如果它使用一个通用的转换器是值得的.通用本身的实现并不困难,但我不确定声明Beans的正确方法.

可能的解决方案如下:

1 - 编写通用实现,让我们调用它MyGenericConverter,不需要任何Bean注释

2 - 将特定转换器ad写为子类,MyGenericConverter<T>并根据需要对其进行注释:

@ManagedBean(name="myFooConverter")
@SessionScoped
public class MyFooConverter implements MyGenericConverter<Foo> { …
Run Code Online (Sandbox Code Playgroud)

java generics jsf spring converter

7
推荐指数
1
解决办法
1万
查看次数

ES6生成器:将回调转换为迭代器

我在babel的帮助下试验ES6生成器,我很难理解如何(或者如果!)我可以有效地使用基于回调的异步函数来输出迭代器.

假设我希望能够编写一个带有大量URL的函数,异步下载它们并在下载后立即返回它们.我希望能够写出如下内容:

let urls = ['http://www.google.com', 'http://www.stackoverflow.com' ];
for ( {url, data} of downloadUrls(urls) ) {
    console.log("Content of url", url, "is");
    console.log(data);
}
Run Code Online (Sandbox Code Playgroud)

我该如何实施downloadUrls?理想情况下,我希望能够写下以下内容:

var downloadUrls = function*(urls) {
    for( let url of urls ) {
        $.ajax(url).done( function(data) {
            yield data;
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,因为``yield''是在回调中调用的,而不是直接在生成器内部调用.我可以在网上找到许多尝试相同的例子,它们要么不透明,需要启用浏览器/节点标记,或者使用特定于节点的功能/库.最接近我需要的库似乎是task.js,但我无法在最新的Chrome上运行最简单的示例.

有没有办法使用标准和当前功能获得预期的行为,(目前我的意思是可以使用像babel这样的转换器,但不需要在浏览器上启用额外的标志)或者我必须等待async/await吗?

javascript asynchronous ecmascript-6 babeljs

7
推荐指数
1
解决办法
480
查看次数

使用CQL3对Cassandra 2中的多对多关系进行建模

使用CQL3建立多对多关系的规范方法是什么?假设我必须使用表格

CREATE TABLE actor (
    id text PRIMARY KEY,
    given text,
    surname text,
)

CREATE TABLE fan (
    id text PRIMARY KEY,
    given text,
    surname text,
)
Run Code Online (Sandbox Code Playgroud)

而且我想模仿一个演员可以有很多粉丝的事实,每个粉丝都可以喜欢很多演员.

来到我的第一个想法是使用集合,如下所示(以及粉丝的另一种方式):

CREATE TABLE actor (
    id text PRIMARY KEY,
    given text,
    surname text,
    fans set<text>
)

<similarly for fan>
Run Code Online (Sandbox Code Playgroud)

但似乎它们适用于小型设备,我没有看到一种方法来检查风扇是否与一个演员有关而没有完全加载任何一套.

我找到的第二个选择是制作两个映射表,每个映射表用于每个关系方向:

CREATE TABLE actor_fan (
    text actor,
    text fan,
    PRIMARY KEY(actor,fan)
);

<similarly for fan_actor>
Run Code Online (Sandbox Code Playgroud)

这会让我有能力获得演员的粉丝列表并检查特定的人是否是某个演员的粉丝?有很多关于Cassandra的文档,但它通常与旧版本有关,并且版本之间似乎存在很多差异.

database cql3 cassandra-2.0

6
推荐指数
1
解决办法
4992
查看次数

更好地处理boost :: program_options中的丢失/错误键

当下面的呼叫失败时,有没有办法知道涉及哪个密钥?

boost::program_options::variables_map vm;
...
int foo_bar = vm["some_key"].as<int>();
Run Code Online (Sandbox Code Playgroud)

如果地图中缺少密钥,或者无法转换为int,我会得到一个相当无法提供信息的bad_any_cast,我无法知道以下任何内容:

  • 关键的关键
  • 存储的值,或者即使它存在.
  • 涉及的类型

我找不到任何解决方案,不涉及修改boost标头或在try..catch块中包装对上面的每个调用.我认为这是一个常见的问题,所以也许其他人知道更好的方法.

c++ boost boost-program-options boost-any

5
推荐指数
1
解决办法
726
查看次数

在Common Lisp中读取外部程序的二进制输出

我正在尝试在SBCL中运行外部程序并捕获其输出.输出是二进制数据(png图像),而SBCL坚持将其解释为字符串.

我试过很多方法,比如

(trivial-shell:shell-command "/path/to/png-generator" :input "some input")

(with-input-from-string (input "some input")
  (with-output-to-string (output)
    (run-program "/path/to/png-generator" () :input input :output output))


(with-input-from-string (input "some input")
  (flexi-streams:with-output-to-sequence (output)
    (run-program "/path/to/png-generator" () :input input :output output))
Run Code Online (Sandbox Code Playgroud)

但我得到的错误就像

Illegal :UTF-8 character starting at byte position 0.
Run Code Online (Sandbox Code Playgroud)

在我看来,SBCL正试图将二进制数据解释为文本并对其进行解码.我该如何改变这种行为?我只对获取八位字节的向量感兴趣.

编辑:由于上面的文字不清楚,我想补充一点,至少在flexi-stream的情况下,流的元素类型是a flexi-streams:octect(这是a (unsigned-byte 8)).我希望至少在这种情况下run-program读取原始字节没有很多问题.相反,我收到了一条消息Don't know how to copy to stream of element-type (UNSIGNED-BYTE 8)

sbcl common-lisp stream

5
推荐指数
1
解决办法
2264
查看次数

在MIMEText中编码头文件

我正在使用MIMEText在Python 3.2中从头开始创建一封电子邮件,而且我在主题中使用非ascii字符创建邮件时遇到问题.

例如

from email.mime.text import MIMEText
body = "Some text"
subject = "» My Subject"                   # first char is non-ascii
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = subject                   # <<< Problem probably here
text = msg.as_string()
Run Code Online (Sandbox Code Playgroud)

最后一行给出了错误

UnicodeEncodeError: 'ascii' codec can't encode character '\xbb' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我如何告诉MIMEText该主题不是ascii?subject.encode('utf-8')根本没有帮助,无论如何我看到人们使用unicode字符串在其他答案中没有问题(参见例如Python - 如何发送utf-8电子邮件?)

编辑:我想补充一点,相同的代码在Python 2.7中没有给出任何错误(认为这并不意味着结果是正确的).

python email python-3.x mime-message

5
推荐指数
1
解决办法
5505
查看次数