如何使servlet只处理来自特定网站的请求?

时间:2011-05-05 04:35:50

标签: java servlets

我有一个servlet来处理一些请求并相应地发出响应。

因此,如果我需要测试我的servlet运行良好,我只需在浏览器中直接输入url(下面)并检查响应。

http://localhost:8080/jnlpGenerator/create.htm?parameter1=someValue&parameter2=otherValue

测试期间这很好。

但是,我想阻止任何人直接从生产环境中的浏览器发送此URL。这可能吗?此网址仅用于我的基于Web的项目中。因此,当有人点击某个按钮时,它会发布上面的url来访问servlet。

我怎样才能做到这一点?

由于

3 个答案:

答案 0 :(得分:1)

考虑编写授权Filter

但是,无法确定该请求是手动浏览器请求或按下按钮的结果。您可以编写一些JavaScript函数来创建差异。

答案 1 :(得分:1)

可能的方法:

  • 检查请求的Referer http标头,看它是否来自某些源页面。
  • 您的servlet仅处理POST方法,忽略GET方法(如果在浏览器中输入类型URL则直接发送)
  • 在源页面中使用验证码/随机码/令牌并在您的servlet中验证它

但是,您不应该依赖前两种方式,因为许多客户端(wget / curl / flashget / ...)可以伪造Referer标头或更改其请求方法,如下所示:

wget --referer http://srv/app/src-page --post-data xxx http://srv/app/servlet

答案 2 :(得分:1)

您无法阻止发出网址请求 - 您基本上必须改变互联网的工作方式才能做到这一点。但是,您可以通过禁止访问单个或多个IP地址或确保用户获得授权来阻止servlet处理这些请求。

为了防止未经授权的访问,如其他地方提到的,授权过滤器和`getRemoteAddress()都很有用,但你必须先实现一些基本的东西:

  • 您必须有某种方式来决定,哪些来电是授权的,哪些不是。
  • 您不能简单地阻止IP地址,除非您确切知道哪些IP地址将连接到您的网站。
  • 您不能只检查引用或阻止通过GET访问,因为任何能够跟踪TCP / IP消息的人都可以轻松欺骗整个HTTP请求。

话虽如此,如果您只有一个简单的Web表单或一些同样微不足道的功能,您可能会使用验证码或其他随机令牌来防止滥用:您的服务器将创建一个由两部分组成的随机项目调用表单的时间,其中一个部分在浏览器中显示,例如图像或字符序列,并且只有在包含相应的第二部分时才会处理发送请求。

但是,如果您的项目更复杂,或授权基于用户身份,则必须更深入地了解安全概念,并实施会话处理,身份验证,加密等等。有无数种方法可以做到这一点 - 首先了解Web应用程序安全性,然后查看Java安全框架。