在JSP中处理页面导航的最佳策略

时间:2011-06-15 05:04:17

标签: java jsp navigation

我正在探索JSP来实现动态网页。要解决的一个问题是页面之间的导航。用户可以在浏览器中前后移动。

必须处理。如果有人退出(例如),我们不希望其他人通过单击“返回”来检索会话或数据。另一个例子是我们不想两次重新提交表单。

我正在寻找解决页面导航问题的提示和建议。我想创建一个需要处理的问题清单+可能的解决方案:

的问题:

  • 使用返回/前进点击确保无法检索/劫持会话
  • 确保表格而不是两次提交
  • 确保用户无法控制cookie或URL数据或隐藏字段以破坏控制流和安全性

解决方案:

  • 实施一堆访问过的网页
  • 调用页面时,请注册显示的时刻以区分新请求与“返回”
  • 控制当前会话

P.S。:我看过这个question,但没有真正的答案。

4 个答案:

答案 0 :(得分:1)

为了防止双重提交,我将使用使用HttpSession使用的Apache Struts 1示例。

Struts所做的是生成一个随机令牌,该令牌存储在会话中并添加到表示层(JSP)中的表单页面中。当用户提交表单时,它会从会话中检查表单给出的令牌是否与会话中找到的会话完全相同。如果是真的,那么处理请求,否则它是双重提交。

示例:

public class AuthenticationAction extends Action {

    public void displayLogout(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response) throws Exception {

        saveToken(request);
        return mapping.findForward("displayLogout");
    }

    public ActionForward doLogout(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response) throws Exception {

        if (isValidToken(request)) {
            //It wasn't yet a double submission, delete token generated by Struts
            resetToken(request);
            //logout.
            ...
            //return back home
            return mapping.findForward("home");
        } else {
            //Double submission..
            throw new Exception("double submission");
        }
    }
}

找到了更好的教程here

答案 1 :(得分:1)

嗯,如果你愿意,也可以使用Spring Webflow框架,但是通过定义你的控制器,可以轻松地解决后面和刷新两次提交表单的问题。我认为使用REST也可以帮助解决一些问题。

隐藏字段操作是另一回事,因为始终可以在页面源中查看隐藏字段。如果可以查看该字段,则可以进行操作。

答案 2 :(得分:1)

  

通过返回/转发点击确保无法检索/劫持会话

这些页面只有disable browser cache个。另请参阅Prevent user from seeing previously visited secured page after logout


  

确保表格并且未提交两次

生成一个长而独特且无法猜测的字符串,将其存储在会话中..

String token = UUID.randomUUID().toString();
((Set<String>) session.getAttribute("tokens")).add(token);
request.setAttribute("token", token);
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);

..并作为表单的隐藏输入字段。

<input type="hidden" name="token" value="${token}" />

提交后,比较并删除会话中的密钥。如果它在会话中,则继续提交。

if (((Set<String>) session.getAttribute("tokens")).remove(request.getParameter("token")) {
    // Valid token. Proceed with submit.
} else {
    // Invalid token. Possible double submit.
}

  

确保用户无法控制cookie或URL数据或隐藏字段以破坏控制流和安全性

只需编写健壮的代码自己或使用现有的强大的MVC框架,如JSF2,Spring-MVC,Struts2等。


  

解决方案:

     
      
  • 实施一堆访问过的网页
  •   
  • 调用页面时,请注册显示的时刻以区分新请求与“返回”
  •   
  • 控制当前会话
  •   

繁琐。

答案 3 :(得分:0)

为避免重新发明轮子,使用现有框架似乎是最佳解决方案。 Struts看起来像个好人。可以使用简单的介绍tutorial