在spring MVC中重定向期间传递模型属性并避免在URL中相同

Posted

技术标签:

【中文标题】在spring MVC中重定向期间传递模型属性并避免在URL中相同【英文标题】:Passing model attribute during redirect in spring MVC and avoiding the same in URL 【发布时间】:2014-08-09 16:01:29 【问题描述】:

我的目标是在重定向期间将模型属性从控制器传递到 JSP 页面,并避免属性显示在 URL 中。下面的源代码是使用 java 数据对象从数据存储验证登录。

控制器:

@Controller
public class LoginController 
    int count;
    PersistenceManager pm = PMF.get().getPersistenceManager();

    //Instance of data class
        User user;
    ModelAndView modelAndView=new ModelAndView();

    @RequestMapping(value="/Login",method = RequestMethod.POST)
    public ModelAndView loginValidate(HttpServletRequest req)

        //Getting login values
        String uname=req.getParameter("nameLogin");
        String pswd1=req.getParameter("pswdLogin");
        count=0;


        user=new User();

        //Generating Query
        Query q = pm.newQuery(User.class);
        q.setFilter("userName == userNameParam");
        q.declareParameters("String userNameParam");

        try
            List<User> results = (List<User>) q.execute(uname);  
            for (User u: results) 

                String userName=u.getUserName();

                if(userName.equals(uname))

                    System.out.println(u.getPassword());

                    if(u.getPassword().equals(pswd1))
                        count=count+1;
                        modelAndView.setViewName("redirect:welcome");
                        modelAndView.addObject("USERNAME",uname);
                        return modelAndView;

                    
         //rest of the logic 
    

JSP:

 <h1>Welcome $USERNAME </h1>

我当前的网址是/welcome?USERNAME=robin 我的目标是将其显示为/welcome 另外,我的页面应该显示“Welcome robin”,而它只显示 Welcome。

【问题讨论】:

不回答您的问题,只是说明您的编码风格。控制器中的数据库查询并不好。通过服务从一些 userDAO 访问它。更重要的是。在我看来,您正在存储用户的密码,因为它们是从客户端发送的,而不是对它们进行哈希处理。这是非常不安全的。 是的,我会改变的。我这样做只是为了暂时学习它们。将计算并更改它们。谢谢! ***.com/questions/15544398/… 我没有使用任何spring-security。 【参考方案1】:

RedirectAttributes 仅适用于 RedirectView,请照此办理

@RequestMapping(value="/Login",method = RequestMethod.POST)
public RedirectView loginValidate(HttpServletRequest req, RedirectAttributes redir)
...

    redirectView= new RedirectView("/foo",true);
    redir.addFlashAttribute("USERNAME",uname);
    return redirectView;

那些 flash 属性 是通过会话传递的(并且在使用后立即被销毁 - 有关详细信息,请参阅 Spring 参考手册)。这有两个兴趣:

它们在 URL 中不可见 您不限于字符串,还可以传递任意对象。

【讨论】:

出现这个新错误“参数 [RedirectAttributes] 的类型为模型或地图,但不能从实际模型中分配。” 在 Spring 3.2 下无法重现错误。您能否给出精确度,至少是错误线和最终原因? 错误:无法调用处理程序方法 [public org.springframework.web.servlet.ModelAndView com.cd.racer.LoginController.loginValidate(javax.servlet.http.HttpServletRequest,org.springframework.web. servlet.mvc.support.RedirectAttributes)];嵌套异常是 java.lang.IllegalStateException:参数 [RedirectAttributes] 是 Model 或 Map 类型,但不能从实际模型中分配。您可能需要切换较新的 MVC 基础结构类才能使用此参数。 @cm1011 答案在这里:您可能需要切换较新的 MVC 基础结构类才能使用此参数。由于您已经有了 @Controller 注释,因此您的控制器应该由 spring 找到,只有 &lt;context:component-scan&gt; 指令(如果您使用的是 xml 配置)。 但是如何从 JSP 页面访问这些值?【参考方案2】:

您需要在这里小心,因为我认为您尝试做的事情不受支持是有充分理由的。 "redirect" 指令将向您的控制器发出 GET 请求。 GET 请求应该只使用请求参数检索现有状态,这是方法协定。该 GET 请求不应依赖于先前的交互或存储在会话中某个位置的任何对象作为它的结果。 GET 请求旨在检索现有(持久)状态。您的原始 (POST) 请求应该已经保存了您 GET 请求检索状态所需的一切。

RedirectAttributes 在这种情况下并不是为支持你而设计的,即使你设法正确使用它,它也只会工作一次,然后它们就会被销毁。如果您随后刷新浏览器,您将收到一个应用程序错误,因为它无法再找到您的属性。

【讨论】:

以上是关于在spring MVC中重定向期间传递模型属性并避免在URL中相同的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring MVC 中重定向到动态 URL

如何将模型属性从一个 Spring MVC 控制器传递到另一个控制器?

Spring MVC controller中,使用redirect重定向后却无法传递session的属性

在 ASP.Net MVC3 中重定向到不影响 URL 的区域

如何在 asp.net mvc 中重定向到正确的控制器操作

在 ASP.NET MVC 中重定向未经授权的控制器