会话是否应该用于处理表单验证的错误消息?

时间:2010-08-24 20:28:09

标签: java jsp session error-handling

我正在创建注册页面,我已经完成了基本的客户端(JS)表单验证 现在我要编写服务器端验证。

我所做的是调用request.getParameter():

String username = request.getParameter("username");

然后,如果用户名输入无效,我将错误消息放入ArrayList:

ArrayList<String> errors = new ArrayList<String>();
errors.add("username is not valid");

然后,将ArrayList对象添加到会话变量

session.setAttribute("inputErrors", errors);

这样我可以使用逻辑来查看ArrayList是否为空(即存在错误), 重定向回注册页面并获取会话值以显示正确的错误消息。

但我想知道以这种方式使用会话是否是处理错误消息的好方法。 由于此操作仅涉及2个页面:注册UI(regis.jsp)和处理注册输入验证和处理(例如,process_regis.jsp)的页面。 我对会话的理解是在多个页面中使用,主要用于登录用户数据。

如果您需要更多说明,请告诉我。

1 个答案:

答案 0 :(得分:5)

服务器端会话已在来自同一客户端会话的所有请求之间共享。只要用户第一次访问站点直到会话过期(未使用超过30分钟(可配置)),或者显式无效,会话就会存在。使用您的方法,在新的浏览器选项卡中打开同一页面。您仍然会看到错误消息,而新页面中的表单根本没有输入/提交。这对用户体验不利。

通常的做法是将错误消息存储在请求范围中,并将转发请求存储到同一页面,而不是重定向到它。如果您使用一个完整的Servlet类而不是JSP文件进行处理和验证,这很容易。 E.g。

/WEB-INF/register.jsp

<form method="post" action="register">
    <p><label for="username">Username</label>
    <input type="text" id="username" name="username" value="${fn:escapeXml(param.username)}">
    <span class="error">${messages.username}</span>
    <p><label for="password">Password</label>
    <input type="password" id="password" name="password">
    <span class="error">${messages.password}</span>
    <p><label for="confirm">Confirm password <span class="required">*</span></label>
    <input type="password" id="confirm" name="confirm">
    <span class="error">${messages.confirm}</span>
    <p><input type="submit" value="Register">
    <p>${messages.result}</p>
</form>

com.example.RegisterServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Map<String, String> messages = new HashMap<String, String>();
    request.setAttribute("messages", messages); // Will be available by ${messages}.

    String username = request.getParameter("username");
    if (username == null  || username.trim().isEmpty()) {
        messages.put("username", "Please enter username");
    }

    // ...

    request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);
}

web.xml

中按如下方式映射此servlet
<servlet>
    <servlet-name>registerServlet</servlet-name>
    <servlet-class>com.example.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>registerServlet</servlet-name>
    <url-pattern>/register</url-pattern>
</servlet-mapping>

http://example.com/context/register打开并继续。

另见