在拦截器重定向请求中重新注入 postdata
事情是这样的,
为了模仿 grails 对一个表单进行多次提交的方式,我实现了这个拦截器,这样当它遇到如下 url 时:
/whatever-url/${controllerName}/index 它重定向到 /whatever-url/${controllerName}/${submitName}
我有两个问题,首先它是用 get 方法重定向的,其次我没有保留 jsp 中原始表单的 postData,有人知道如何在重定向请求中将其设置回来吗?
这是拦截器类:
public class ControllerIndexInterceptor extends HandlerInterceptorAdapter {
private static String[] redirects = {"edit", "delete"};
/**
* {@inheritDoc}
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String param = null;
for (String redirect : redirects) {
if((param = request.getParameter(redirect)) != null){
response.sendRedirect(request.getContextPath()+request.getServletPath()+
transformURI(request.getPathInfo(), redirect, handler));
return false;
}
}
return true;
}
答案:
public class ControllerIndexInterceptor extends HandlerInterceptorAdapter {
private static String[] redirects = {"edit", "delete"};
/**
* {@inheritDoc}
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String param = null;
for (String redirect : redirects) {
if((param = request.getParameter(redirect)) != null){
request.getRequestDispatcher(request.getServletPath()+
transformURI(request.getPathInfo(), redirect, handler)).forward(request,response);
return false;
}
}
return true;
}
Here's the thing,
In order to imitate the way grails does multiple submits for one form, I implemented this interceptor, so that when it encounters an url such as :
/whatever-url/${controllerName}/index it redirects to /whatever-url/${controllerName}/${submitName}
I have two problems, first it is redirected with a get method and second I don't keep the postData from the original form that was in the jsp, anyone has an idea how to set this back in the redirected request ?
Here is the interceptor class :
public class ControllerIndexInterceptor extends HandlerInterceptorAdapter {
private static String[] redirects = {"edit", "delete"};
/**
* {@inheritDoc}
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String param = null;
for (String redirect : redirects) {
if((param = request.getParameter(redirect)) != null){
response.sendRedirect(request.getContextPath()+request.getServletPath()+
transformURI(request.getPathInfo(), redirect, handler));
return false;
}
}
return true;
}
Answer :
public class ControllerIndexInterceptor extends HandlerInterceptorAdapter {
private static String[] redirects = {"edit", "delete"};
/**
* {@inheritDoc}
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String param = null;
for (String redirect : redirects) {
if((param = request.getParameter(redirect)) != null){
request.getRequestDispatcher(request.getServletPath()+
transformURI(request.getPathInfo(), redirect, handler)).forward(request,response);
return false;
}
}
return true;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
IMO
response.sendRedirect()
将向浏览器发送重定向状态代码,该浏览器最终将发出新请求,这就是您收到 GET 请求的原因。这也是无法获取 POST 数据的原因(因为它完全是一个新的且不同的请求)。请改用 request.getRequestDispatcher() 。IMO
response.sendRedirect()
will send a redirect status code to browser which will eventually make a NEW request which is the reason that you are getting GET requests. This is also the reason behind not getting POST data (as its a new and different request altogether). Userequest.getRequestDispatcher()
instead.