在Spring MVC重定向期间传递模型属性,并避免在URL中使用相同的属性


问题内容

我的目标是在重定向期间将模型属性从控制器传递到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>

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


问题答案:

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中不可见
  • 您不限于String,而是可以传递任意对象。