0

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

例如

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

2.返回一个带有隐藏标记的视图

<input type="hidden" name="token" value="UA37jdjs9UDJS3">
<input type="submit" name="deleteEmail" value="Delete">

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

需要注意的一点是,如果有 Ajax 请求,那么对于一些请求,其他一些令牌必须是活动的。

如果用户决定关闭浏览器,则令牌将在会话超时时失效。

如果用户未能完成表单,去网站上做其他事情,这些令牌将不得不被删除,因为它们没有被使用。

但是实现这样一个系统的最佳方式是什么,

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

在 Java、Grails、Spring MVC、Spring Security 3 和 Hibernate 领域内

4

5 回答 5

2

查看http://www.hdiv.org/上的 HDIV 项目。他们正是这样做的。即使您不使用 HDIV 项目的代码,那里的信息也可能会为您提供如何自己操作的选项。这对我来说是一本很好的入门书,可以帮助我了解如何处理诸如 CSRF 之类的令牌以及其他用途(例如双重提交控件)。

于 2010-01-08T02:20:50.380 回答
1

当您调用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
}
于 2010-01-07T16:45:29.610 回答
1

第一个想法是您可能只使用已经生成的会话 ID。但是,如果您尝试分叉状态,我建议您使用诸如接缝对话模型之类的东西

于 2010-01-07T15:35:46.227 回答
1

您是否查看了位于http://grails.org/doc/1.2.0/guide/single.html的 Grails 文档中的“同步器令牌模式” ?

于 2010-01-12T16:13:18.520 回答
0

我最近遇到了一个用例。

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

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

至于最好的方法,我想说这很简单。例如,您可以使用http://java.sun.com/j2se/1.5.0/docs/api/java/util/UUID.html来生成唯一密钥。如果您正在使用 Tapestry、JSF 或 Wicket 等基于组件的框架,则可能有更高级的方法来处理这个问题。

这与您的用例相似吗?还是您想实现完全不同的目标?

于 2010-01-07T18:31:19.707 回答