小编skr*_*bel的帖子

Javadoc重用和重载方法

我正在开发一个带有许多同名方法的API,这些方法因签名而异,我猜这是相当常见的.它们都做同样的事情,除非他们默认初始化各种值,如果用户不想指定.作为一个易于理解的例子,请考虑

public interface Forest
{
  public Tree addTree();

  public Tree addTree(int amountOfLeaves);

  public Tree addTree(int amountOfLeaves, Fruit fruitType);

  public Tree addTree(int amountOfLeaves, int height);

  public Tree addTree(int amountOfLeaves, Fruit fruitType, int height);
}
Run Code Online (Sandbox Code Playgroud)

所有这些方法所采取的基本行动是相同的; 在森林里种了一棵树.我的API用户需要了解的有关添加树的许多重要信息都适用于所有这些方法.

理想情况下,我想编写一个由所有方法使用的Javadoc块:

  /**
   * Plants a new tree in the forest. Please note that it may take
   * up to 30 years for the tree to be fully grown.
   *
   * @param amountOfLeaves desired amount of leaves. Actual amount of
   * leaves at maturity may differ …
Run Code Online (Sandbox Code Playgroud)

java javadoc

74
推荐指数
3
解决办法
2万
查看次数

Web应用程序的RESTful身份验证

嗨已经写了这个观察和问题,关于这个问题的较早,但后来才发现,这是一个老"死"的问题.由于我非常喜欢其他人的一些见解,我将其作为一个新问题重新发布.

对于如何进行RESTful身份验证的问题,人们通常会热情地喊出"HTTP身份验证".但是,我怀疑这些人是否曾尝试使用REST 制作基于浏览器的应用程序(而不是机器到机器的Web服务).(没有违法行为 - 我只是认为他们没有遇到过并发症)

我在RESTful服务上使用HTTP身份验证发现的问题是生成可在浏览器中查看的HTML页面:

  • 用户通常会得到一个丑陋的浏览器制作的登录框,这对用户不友好.你不能添加密码检索,帮助框等.
  • 以不同的名称注销或登录是一个问题 - 浏览器将继续向站点发送身份验证信息,直到您关闭窗口
  • 超时很难

铲球这些逐点非常有见地的文章是在这里,但是这导致的很多特定浏览器的JavaScript两轮牛车,变通办法变通办法,等等的.因此,它也不是向前兼容的,因此在发布新浏览器时需要不断维护.我不认为干净清晰的设计,而且我觉得这是一项额外的工作和头痛,这样我就可以热情地向我的朋友展示我的REST徽章.

我相信cookie是解决方案.但等等,饼干是邪恶的,不是吗?不,他们不是,饼干的使用方式往往是邪恶的.Cookie本身只是一条客户端信息,就像浏览器在浏览时会跟踪的HTTP身份验证信息一样.这条客户端信息在每次请求时都会发送到服务器,就像HTTP身份验证信息一样.在概念上,唯一的区别是所述内容这块客户端状态中的可以由确定服务器作为其响应的一部分.

通过使用以下规则使会话成为RESTful资源:

  • 一个会话映射一个关键用户ID(也可能是最后行动时间戳超时)
  • 如果存在会话,则表示该密钥有效.
  • 登录意味着POST到/ sessions,新密钥被设置为cookie
  • 注销意味着DELETEing/sessions/{key}(重载POST,请记住,我们是浏览器,HTML 5还有很长的路要走)
  • 通过在每个请求时将密钥作为cookie发送并检查会话是否存在且有效来完成身份验证

现在,与HTTP身份验证的唯一区别在于,身份验证密钥由服务器生成并发送给不断发送回来的客户端,而不是客户端从输入的凭据计算它.

我认为这是一个运行良好的充分解决方案,但我必须承认,我不足以识别此方案中的潜在漏洞 - 我所知道的是,数百个非RESTful Web应用程序使用的基本相同登录协议($ _SESSION inphp,j2ee中的HttpSession等).cookie头内容仅用于寻址服务器端资源,就像接受语言可能用于访问翻译资源一样,等等.我觉得它是一样的,但也许其他人不一样?你们觉得怎么样?

rest web-applications restful-authentication

24
推荐指数
1
解决办法
8102
查看次数

将Collection <SomeClass>转换为Collection <SomeSuperClass>

我确信之前已经回答了,但我真的找不到它.

我有一个java类SomeClass和一个抽象类SomeSuperClass.SomeClass延伸SomeSuperClass.

另一个抽象方法有一个返回a的方法Collection<SomeSuperClass>.在一个实现类中,我有一个Collection<SomeClass> myCollection

我明白我不能只返回myCollection,因为Collection<SomeClass>不会继承Collection<SomeSuperClass>.然而,我知道所有内容myCollection都是SomeSuperClass因为它毕竟是SomeClass延伸的对象SomeSuperClass.

我怎样才能做到这一点?

就是我想要的

public class A
{
  private Collection<SomeClass> myCollection;

  public Collection<SomeSuperClass> getCollection()
  {
    return myCollection; //compile error!
  }
}
Run Code Online (Sandbox Code Playgroud)

我发现的唯一方法是通过非泛型类型进行投射并获取未经检查的警告和诸如此类的东西.但是必须有更优雅的方式吗?我觉得Collections.checkedSet()也不需要使用和朋友,因为静态地确定返回的集合只包含SomeClass对象(在向下转换而不是向上转换时不会出现这种情况,但这不是我正在做的事情).我错过了什么?

谢谢!

java generics casting

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

南希:从"/"提供静态内容(例如index.html)?

我正在尝试使用Nancy制作单页Web应用程序.因此,我希望我的根URL提供一个普通的.html文件,没有任何视图逻辑或任何东西.

我试过了

Get["/"] = parameters => Response.AsHtml("content/index.html")
Run Code Online (Sandbox Code Playgroud)

但是没有AsHtml.

我试过一个自定义引导程序

conventions.StaticContentsConventions.Add(
    StaticContentConventionBuilder.AddFile("/", @"content/index.html")
);
Run Code Online (Sandbox Code Playgroud)

但显然它认为"/"不是一个文件 - 南希给了我一个目录列表http://localhost:<port>/.

我该怎么办?这应该不是这么难,对吧?

PS.任何方式关闭该目录列表?感觉不安全.

c# nancy

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

将私有部分保留在c ++头之外:纯虚基类vs pimpl

我最近从Java和Ruby切换回C++,令我惊讶的是,当我更改私有方法的方法签名时,我必须重新编译使用公共接口的文件,因为私有部分也在.h文件中.

我很快想出了一个解决方案,我想这对于Java程序员来说是典型的:接口(=纯虚拟基类).例如:

BananaTree.h:

class Banana;

class BananaTree
{
public:
  virtual Banana* getBanana(std::string const& name) = 0;

  static BananaTree* create(std::string const& name);
};
Run Code Online (Sandbox Code Playgroud)

BananaTree.cpp:

class BananaTreeImpl : public BananaTree
{
private:
  string name;

  Banana* findBanana(string const& name)
  {
    return //obtain banana, somehow;
  }

public:
  BananaTreeImpl(string name) 
    : name(name)
  {}

  virtual Banana* getBanana(string const& name)
  {
    return findBanana(name);
  }
};

BananaTree* BananaTree::create(string const& name)
{
  return new BananaTreeImpl(name);
}
Run Code Online (Sandbox Code Playgroud)

这里唯一的麻烦就是我不能使用new,而必须打电话BananaTree::create().我不认为这确实是一个问题,特别是因为我希望无论如何都要使用很多工厂.

然而,现在,C++成名的聪明人提出了另一个解决方案,即pImpl成语.有了它,如果我理解正确,我的代码将如下所示:

BananaTree.h:

class BananaTree
{
public: …
Run Code Online (Sandbox Code Playgroud)

c++ pimpl-idiom header pure-virtual

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

Git备份:我可以在推送到的时候复制一个git裸存储库吗?

在我们公司,我们正在尝试从svn转到git.我们希望为团队提供这么简单,同时不会给系统管理员造成太大负担.

我们已经找到了一种方法,通过在每个团队拥有的(Windows)网络驱动器上创建一个裸存储库,然后推送/拉出该存储库.通过文件访问权限安排身份验证,因此无需设置https和整个身份验证.大!(我们可以通过VPN远程访问驱动器,所以它几乎和https或git + ssh解决方案一样好)

更好的是,我们甚至可以免费获得备份,因为网络共享已经备份.但是,此备份运行相当不可预测(备份持续数小时,因此可能会持续到下一个工作日).

因此,有可能开发人员推送到存储库时备份驱动器.使用SVN,这可能会导致问题,这就是为什么svn hotcopy存在的问题.

git存在同样的风险吗?当有人推动它时,我可以在某处复制裸存储库吗?当然,如果无法恢复推送,那就没关系了.如果必须完成某些工作来恢复在推送时所做的备份(即通过删除半完成的推送残留数据),那也没关系.但是如果整个裸存储库破坏并且无法使用,那么这就是一个问题.

我做了一些实验,看不出问题,但这并不意味着没有任何问题.

编辑:我接受了一个'做正确的方法'的答案,因为这是我打算长期做的事情.然而,就目前而言,对于我们来说,在自动备份开始git clone大约一小时,一个简单的解决方案就是整个裸存储库(在同一个驱动器上).自动备份可能会错误地复制"真实"存储库(如果它已被使用)那时,但最近克隆的副本不会有问题.我们知道备份何时开始,而不是何时结束,这对我们来说已经足够了.

git

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

Doxygen:如何链接到以不受支持的语言编写的源文件?

我们正在使用Doxygen为跨语言项目生成HTML文档。在某些文档中,我想链接到以Doxygen不支持的语言(实际上是Visual Studio T4模板)编写的文件的源。

目前,我只是在doc注释内写出文件名。

在Doxyfile中包括文件扩展名可以使链接起作用,但是Doxygen完全误解了文件,并链接到了这个被误解的文档,而不是我想要的源文件。

但是,如果我排除文件扩展名,则Doxygen根本不会占用该文件。

是否有任何Doxygen命令直接链接到文件的来源,而不是其文档?

我不太在乎Doxygen是否为此文件生成了错误的文档:只要我可以直接链接到文件的而不是文档,我就会很高兴。文档本身非常明显是不正确的,以至于不会损害页面的生成并可能被发现。

有任何想法吗?

t4 doxygen

2
推荐指数
1
解决办法
5047
查看次数