zoukankan      html  css  js  c++  java
  • 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)了,所以只能返回页面了;至此完美解决问题。

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

  • 相关阅读:
    最近这段时间
    一元多项式的
    珍藏
    运行命令大全
    Google
    Windows Live Writer插件
    Word写论文的技
    安装Windows Live Writer后Ƃ
    比尔盖茨给人
    不经意的感悟
  • 原文地址:https://www.cnblogs.com/kanyun/p/8092933.html
Copyright © 2011-2022 走看看