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

2022-09-01 10:15:53

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


答案 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;
}

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

  • 它们在 URL 中不可见
  • 您不限于 String,但可以传递任意对象。

答案 2

你需要在这里小心,因为我认为你试图做的事情是没有充分理由的。“重定向”指令将向控制器发出 GET 请求。GET 请求应仅使用请求参数检索现有状态,这是方法协定。该 GET 请求不应依赖于以前的交互或因此而存储在会话中的某个位置的任何对象。GET 请求旨在检索现有(持久化)状态。您的原始 (POST) 请求应保留 GET 请求检索状态所需的所有内容。

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