一尘不染

应该使用session处理错误消息以进行表单验证吗?

jsp

我正在创建注册页面,并且已经完成了基本的客户端(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)。我对会话的理解将主要在多个页面上用于登录的用户数据。

如果需要进一步说明,请告诉我。


阅读 238

收藏
2020-06-10

共1个答案

一尘不染

服务器端会话在同一客户端会话的所有请求之间共享。只要用户首次访问该站点,会话就一直存在,直到该会话过期(超过30分钟不使用(可配置)),或者该会话被明确禁用。使用您的方法,在新的浏览器选项卡中打开同一页面。当根本不输入/提交新页面中的表单时,您仍然会看到错误消息。这不利于用户体验。

通常的做法是将错误消息存储在请求范围内,然后将请求 转发
到同一页面,而不是重定向到该页面。如果使用完全有价值的Servlet类而不是JSP文件进行处理和验证,则这很容易。例如

/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);
}

如下所示映射此servlet web.xml

<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将其打开,然后继续。

2020-06-10