我有一个login.jsp页面,用于对GWT程序进行身份验证(使用spring-security)。
<form name="signinForm" action="<c:url value='/security_check' />" method="post">
在客户端GWT中,如果我收到会话过期提示,我使用
Window.Location.assign(GWT.getHostPageBaseURL() + "login.jsp");
重定向到登录页面。它工作没有问题,但在输入用户名和密码并提交后,它会发送到错误的网址
http://localhost:8080/myApp/myApp/myAppGwtService.rpc
并在浏览器中打印以下消息
The call failed on the server; see server log for details
tomcat日志:
SEVERE: Exception while dispatching incoming RPC call
javax.servlet.ServletException: Content-Type was '(null)'. Expected 'text/x-gwt-rpc'.
at com.google.gwt.user.server.rpc.RPCServletUtils.checkContentTypeIgnoreCase(RPCServletUtils.java:476)
at com.google.gwt.user.server.rpc.RPCServletUtils.readContent(RPCServletUtils.java:207)
at com.google.gwt.user.server.rpc.RPCServletUtils.readContentAsGwtRpc(RPCServletUtils.java:250)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.readContent(AbstractRemoteServiceServlet.java:182)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:296)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at ir.dpi.bourse.web.view.server.GwtRpcController.handleRequest(GwtRpcController.java:39)
有人可以帮助我吗?
答案 0 :(得分:0)
<强>解决强> 通过添加
always-use-default-target="true"
到
<form-login />
在春季安全环境中,但我不知道出了什么问题?
答案 1 :(得分:0)
在会话中的servlet存储中对最后请求的URL进行表单身份验证,并使用该值作为目标,在登录后将您重定向到。
在您的情况下,您调用了RPC并且它失败了,因为您不再登录,并且安全过滤器通过存储请求的URL并将您重定向到登录页面来处理错误(在AJAX请求中,所以它是隐藏给用户)。客户端代码检测到此情况并将浏览器重定向到登录页面,但最后请求的URL仍然是RPC 如果登录页面尝试加载受保护资源(例如CSS或图像),则可能会出现同样的问题:登录后,您将被重定向到登录页面暂时加载的CSS或图像!
快速解决方法是刷新页面(Window.Location.reload()
)并让安全过滤器将您重定向到登录页面。最后加载的URL是应用程序,因此您将被重定向回应用程序。
更好的解决方案IMO将不保护您的RPC(至少不使用表单身份验证,但在同一个Web应用程序中并不总是可以使用多种身份验证机制,例如,如果您只是使用web.xml
来配置安全性,而是检查RPC方法中的当前用户并将特定错误返回给客户端(或者如果在servlet过滤器中完成,则只需返回401
状态代码并处理客户端的StatusCodeException
:因为安全过滤器不会拦截RPC,所以它们不会产生您遇到的副作用。