Spring上的MVC和重定向在URL上发送目标文件

时间:2014-04-18 19:23:54

标签: java spring jsp spring-mvc post

我的Spring MVC应用程序中有一个非常奇怪的问题。我正在编写一个登录表单并通过AJAX将数据发布到Spring MVC控制器中,如下所示:

@Controller
public class LoginResourceController {
   private static final Logger log = Logger.getLogger    (LoginResourceController.class.getName());

   @RequestMapping (value="/login", method = RequestMethod.POST)
   public String checkAccount (HttpServletRequest httpRequest, HttpServletResponse    httpResponse,
            @RequestHeader (value = "User-Agent") String retrievedUserAgent,
            @RequestParam("username") String username, 
            @RequestParam("password") String password,
            @RequestParam("rememberMe") String rememberMe)
   {
       //Check username and password in DB, and then if OK,
        return "redirect:/login/redirectToMain";
   }

@RequestMapping (value = "/login/redirectToMainpage", method = RequestMethod.GET)
public String redirectControllerToMainPage (HttpServletRequest httpRequest, HttpServletResponse httpResponse)
{
return "mainPage";
}

现在,问题是,我有重定向的客户端(浏览器)请求URL中包含mainPage.jsp整个内容的URL。所以它看起来像:

https://localhost:8443/<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Page that the subscriber sees after login</title>....

我对此错误感到非常困惑。我需要更改WEB-INF/web.xmlmvc-dispatcher-servlet.xml中的某个servlet设置吗?我使用的是Spring 3.0.5。

顺便说一句,我的重定向在同一个Spring MVC应用程序中对GET方法控制器完美无缺地工作。 (例如,当我重新加载我的应用程序的主页面时,重定向到上面登录的mainPage.jsp完美无瑕)。此外,其他jsps上的其他GET方法也可正常工作(例如,通过/login login.jsp GET重定向到https://localhost:8443/页面。

我检查过以下内容,他们没有帮助:1 2

2 个答案:

答案 0 :(得分:1)

尽量不要将重定向放在控制器的返回中。这似乎要么将整个页面呈现为ajax响应,要么使用url填充重定向标头,并将页面的全部内容作为响应正文中的字符串。

作为第一种方法,尝试使请求成为普通的HTTP请求而不是ajax,它应该可以正常工作。

可选择尝试使返回体为空,并将HTTP状态代码返回给客户端。如果帐户正常,则为200 OK401 Unauthorized

  @RequestMapping (value="/login", method = RequestMethod.POST)
   public ResponseEntity checkAccount (HttpServletRequest httpRequest, HttpServletResponse    httpResponse,
            @RequestHeader (value = "User-Agent") String retrievedUserAgent,
            @RequestParam("username") String username, 
            @RequestParam("password") String password,
            @RequestParam("rememberMe") String rememberMe)
   {
       //Check username and password in DB
       ....
       HttpStatus returnCode = null;

       if(usernameAndPasswordOK) {
           returnCode = HttpStatus.OK;
       }   
       else {
           returnCode = HttpStatus.UNAUTHORIZED;
       }    

        return new ResponseEntity(returnCode);
   }

然后在客户端重定向相应的Javascript。

答案 1 :(得分:0)

这对我来说有点棘手,并且作为一个网络开发noob在这里没有帮助。无论如何,@ jhadesdev上面的回答向我指出了这个问题。

在我的客户端,我这样做:

$("#loginForm").submit(function(evt)
{
    evt.preventDefault();

    if (loginFormInputIsValid ())
    {
       $.ajax ({
                type: "POST",
                url: "/login",
                data: $(this).serialize(),
                success: function (response)
                {
                   window.location = response;
                }
         });
    }
}

这是问题 - 你看,设置window.location=response;导致客户端(浏览器)向服务器请求上面的时髦URL。我必须改变我的客户电话(这是@jhadesdev的回复帮助),以确保我不会做错事。

感谢您的时间,@ jhadesdev。