我的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.xml
或mvc-dispatcher-servlet.xml
中的某个servlet设置吗?我使用的是Spring 3.0.5。
顺便说一句,我的重定向在同一个Spring MVC应用程序中对GET
方法控制器完美无缺地工作。 (例如,当我重新加载我的应用程序的主页面时,重定向到上面登录的mainPage.jsp
完美无瑕)。此外,其他jsps上的其他GET
方法也可正常工作(例如,通过/login
login.jsp
GET
重定向到https://localhost:8443/
页面。
答案 0 :(得分:1)
尽量不要将重定向放在控制器的返回中。这似乎要么将整个页面呈现为ajax响应,要么使用url填充重定向标头,并将页面的全部内容作为响应正文中的字符串。
作为第一种方法,尝试使请求成为普通的HTTP请求而不是ajax,它应该可以正常工作。
可选择尝试使返回体为空,并将HTTP状态代码返回给客户端。如果帐户正常,则为200 OK
或401 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。