Java Web应用程序安全性:向请求添加令牌

我正在寻找一种方法或当前的API,允许您将令牌添加到Web应用程序请求。 也许在会议期间但不是坚持。 或者,如果您可以通过概述一种有效的方法来帮助我

例如

1. GET request => Servlet生成一个令牌并在视图中打印它

2.返回带有隐藏令牌的视图

  

3.提交POST请求=>表单并检查令牌是否相同。

很少有事情需要注意,如果有Ajax请求,那么其他一些令牌必须在许多请求中处于活动状态。

如果用户决定关闭浏览器,则当会话超时时,令牌将不得不死亡。

如果用户未能完成表单,则在网站上执行其他操作,则必须在未使用时删除这些令牌。

但实现这样的系统的最佳方法是什么,

Spring Security 3有一个我可以使用的系统吗?

在Java,Grails,Spring MVC,Spring Security 3和Hibernate领域

您是否在http://grails.org/doc/1.2.0/guide/single.html上的Grails文档中查看了“Synchronizer Token Pattern”?

请访问http://www.hdiv.org/查看HDIV项目。 他们正是这样做的。 即使你不使用HDIV项目的代码,那么那里的信息可能会为你提供一个如何自己做的选项。 对于我来说,学习CSRF和其他用途(如双提交控件)之类的东西是很好的入门读物。

首先想到的是你可能只使用已经生成的会话ID。 但是如果你试图分叉状态我会建议使用像接缝对话模型这样的东西

为什么不在调用request.getSession()时只使用Web容器为您生成的session_id?

如果您想创建自己的“令牌”,可能需要检查Cookie。 Cookie是由Web服务器作为HTTP标头发送到Web浏览器的键值对,然后每次访问该服务器时由浏览器保持不变。

要在Servlet中创建cookie,您可以使用:

 public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { // Create a cookie Cookie c1 = new Cookie("yourdomain.token","the value"); response.addCookie(c1); //build your response 

}

Cookie将自动包含在下一个http请求中。 您可以通过以下方式阅读:

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie[] cookies = request.getCookies(); //build your response } 

我最近遇到了一个用例。

如果浏览器中存在旧的应用程序窗口,并且从另一个浏览器窗口单击了登录链接,则登录操作首先创建一个新会话,然后重定向到应用程序窗口。 这触发了旧窗口的onunload方法方法,该方法导致向服务器注销新用户的注销请求。

依赖于javascript onunload事件进行注销对我来说似乎有点糟糕,但是这无法更改,因此我们选择按照OP建议进行操作,并在每个渲染视图中添加一个标记,并针对每个请求进行检查。 这会停止onunload注销请求终止新会话。

至于最好的方式,我会说这非常简单。 例如,您可以使用http://java.sun.com/j2se/1.5.0/docs/api/java/util/UUID.html生成唯一键。 如果您使用的是基于组件的框架,如Tapestry,JSF或Wicket,则可能有更高级的方法来处理它。

这与您的用例类似吗? 或者你想要实现完全不同的东西?