2011-06-14 42 views
0

我有非常有趣的问题。我正在为我的Web应用程序登录页面,并通过AJAX发送登录请求。如果成功,我想转发用户到另一个页面。Spring MVC 3,使用Ajax时转发不工作

看来他是发生了什么事。我发送Ajax请求,控制器转发我需要视图(我看到登录调试模式),但我留在同一页面,因为我认为该页面正在等待AJAX​​响应,并因此转发不会发生。

我认为这也是错误的方法来解决这个问题,但因为我对这个不熟悉。我如何登录并将用户转发到下一页。

谢谢。

这里是我的代码:

JS代码:

Page.authenticate = function() { 
     $.ajax({ 
       url: "/login/authenticate/" + $('#username').val() + "/" + $('#password').val(), 
       type: "GET", 
       success: function(poi){ 
       // alert("nesto"); 
       } 
      }); 

     return true; 
    } 

控制器类:

@Controller 
public class LoginPageController { 

private Logger logger = Logger.getLogger(this.getClass()); 

@Autowired 
private UserManagement userManagement; 

@RequestMapping(value="/login/authenticate/{username}/{password}", method=RequestMethod.GET) 
public String authenticate(@PathVariable("username") String userName, @PathVariable("password") String password, Model model) { 

if (userManagement.authenticateUser(userName, password)) { 
     String forward = "forward:/login/success"; 
     return forward; 
    } else { 
     model.addAttribute("errorMessage", "Invalid Username/Password, please try again!"); 
     return "/"; 
    } 

} 

} 
+1

你可能想看看Spring Security的,这是SpringSource的认证/授权开发了一个成熟的框架。 – abalogh 2011-06-14 10:54:00

+0

谢谢,它看起来像一个很好的框架来保护你的应用程序。但是我仍然需要这个转发才能工作:) – 2011-06-14 11:06:12

+1

如果你使用Spring Security,你将不需要处理这个问题,因为它会被自动处理。 – abalogh 2011-06-14 11:24:21

回答

1

如果您使用的是AJAX,则需要在@ResponseBody注释中作出响应。

@RequestMapping(value="/login/authenticate/{username}/{password}", method=RequestMethod.GET) 
    public String authenticate(@PathVariable("username") String userName, @PathVariable("password") String password, Model model) { 

    if (userManagement.authenticateUser(userName, password)) { 
      String forward = "forward:/login/success"; 
      return forward; 
     } else { 
      String forward = "forward:/login/error?message=Invalid Username/Password, please try again!"; 
      return forward; 
     } 

    } 

    @RequestMapping(value="/login/success", method=RequestMethod.GET) 
     @Responsebody 
     public String handleMySuccessRedirect() { 
     return "Logged In successfully" 
       } 

@RequestMapping(value="/login/error", method=RequestMethod.GET) 
    @Responsebody 
    public String handleMyExceptionOnRedirect(@RequestParamter("message") String message) { 
    return message; 
      } 

更新:

@RequestMapping(value="/login/authenticate/{username}/{password}", method=RequestMethod.GET) 
@ResponseBody 
    public String authenticate(@PathVariable("username") String userName, @PathVariable("password") String password, Model model) { 

    if (userManagement.authenticateUser(userName, password)) { 
      String response = "Logged Successfully"; 
      return response; 
     } else { 
      String response = "Invalid Username/Password, please try again!"; 
      return response; 
     } 

    } 
+0

谢谢你的输入,但这并不能解决我的问题。由于这转发在同一个控制器内部。 我需要在其他控制器(其他页面)上转发。 我会记住为AJAX调用使用@ResponseBody注释。 – 2011-06-14 13:18:17

+0

使用完整的承诺响应,而不是转发作品。一个小问题是当你做POST时,你将请求转发给POST请求。 由于您无法更改方法(可能有反射,您可以)在页面上转发请求土地作为POST。不幸的是,我不得不为POST请求添加处理,并最终得到我想要的。不干净的解决方案,但它的开始。 – 2011-06-14 13:56:08

+0

@Dolphin,请参阅我的更新并使用此建议。你根本不需要重定向,BTW id我解决了你的问题,请将此问题标记为已接受或提高其评分。 – 2011-06-14 14:34:38

0

有一对夫妇的事情,你可以在这里做:

  1. 不要从您的c中返回视图ontroller,而不是返回JSON的基础上,JSON的响应,适当地设置的位置 - window.location = 'home.action' - 这里是一个example using ext-js

  2. 让登录页面进行完全成熟后,没有一个AJAX职位。

+0

感谢您的帮助,我正在考虑使用完整的帖子。至于其他的解决方案,那就是使用Spring Security,这对我来说目前是开销。所有失败的Spring Security在这里我来:) – 2011-06-14 13:21:13