jsp登录页面,展示错误信息,刷新页面后错误依然存在解决方案

在做登录页面的时候,通常使用form表单同步提交的方法进行提交的,也就是在form表单里去写action,如果登录失败,jsp通过jstl表达式获取错误信息展示在页面上,但是有一个问题就是,即使你刷新了页面,错误提示一直存在,这是为什么呢;

问题分析,首先form表单采用同步校验的方式提交,那么你的浏览器地址栏的地址就会变成,你提交表单的action的地址,(当然如果你用ajax的异步验证的话,就不存在这个问题);所以数据到后台校验不通过的时候,后台会返回登录页给你

同时携带一些信息,这样前台就可以通过表达式去获取信息了,那么此时你可能会去刷新浏览器,但是错误信息却还存在,这是为什么呢?因为你的地址栏还是你提交表单的地址,所以当你在刷新的时候,实际上还是向后台提交表单了,所以会出现

页面还会展示错误信息,(解决方案:可以使用ajax提交表单,这样浏览器地址栏不会改变,你再次刷新的时候不会提交表单了,但这不是本文的主要解决方法)那么想一想为什么不用重定向呢?可以使用重定向,但是有一个问题是重定向怎么携带数据呢?

好:

Spring 3.1 提供了一个很好用的类:RedirectAttributes。 使用这个类,我们可以把参数随着重定向传到页面,不需自己拼url了。

把上面方法参数中的Model换成RedirectAttributes,参数就自动跟在url后了。

但是,这样页面不能用el获取到,还要另外处理,所以,我们还有一种方式,不拼url,用el获取参数,就像普通转发一样。

还是使用RedirectAttributes,但是这次不用addAttribute方法,spring为我们准备了新方法,addFlashAttribute()。

这个方法原理是放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢失。

 

package com.demo.controller;  
  
import java.util.Map;  
  
import org.springframework.stereotype.Controller;  
import org.springframework.ui.Model;  
import org.springframework.web.bind.annotation.ModelAttribute;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.servlet.mvc.support.RedirectAttributes;  
  

@Controller  
@RequestMapping("/user")  
public class DemoController {  
  
    @RequestMapping("/login")  
//  public String login(@RequestParam Map<String, String> user, Model model) {  
    public String login(@RequestParam Map<String, String> user, RedirectAttributes model) {  
        System.out.println("用户提交了一次表单");  
        String username;  
        if (user.get("name").isEmpty()) {  
            username = "Tom";  
        } else {  
            username = user.get("name");  
        }  
        model.addFlashAttribute("msg", username);  
//      return "home";//此方式跳转,页面刷新会重复提交表单  
        return "redirect:/user/toHome";  
    }  
      
    @RequestMapping("/toHome")  
    public String home(@ModelAttribute("msg") String msg, Model model) {  
        System.out.println("拿到重定向得到的参数msg:" + msg);  
        model.addAttribute("msg", msg);  
        return "home";  
    }  
}  

注意红色部分,在校验失败的时候,重定向到一个Handler,该Handler获取重定向的参数,将该参数保存并转发页面,由于重定向里的参数放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢失,所以该Handler第一次返回的时候,将携带错误信息,此时浏览器的地址是该Handler的RequestMapping,当浏览器刷新的时候,该Handler已经无法获取重定向参数(参数为null)了,所以只能返回页面了;至此完美解决问题。

相当于验证表单的时候,多进行了一步操作,但是也提醒了我们,增删改的时候一定要注意使用的方式,即使用异步的操作,或者同步操作时要进行重定向!

posted @ 2017-12-23 11:14  陈无问  阅读(2542)  评论(0编辑  收藏  举报