0

我在拦截和更改请求 url 以将其链接到正确的 URL 时遇到问题。我正在使用条纹框架,并希望将用户重定向到正确的子域。例如。如果用户属于 abc.sitename.com 并且请求来自 xyz.sitename.com 他应该被重定向到 abc.sitename.com 所有请求发布。对于 getparameter,我通过简单地获取请求 url 和请求查询并在生命周期解析执行之前从自定义拦截类重定向用户来完成此操作。但是所有 post 参数都被刷新,因为它是重定向的。另一种解决方案是转发解决方案,但它可以将用户置于上下文中,我需要将其覆盖为:

resolution = new OnwardResolution<ForwardResolution>(reponseUrl) {
                    @Override
                    public void execute(HttpServletRequest request,
                            HttpServletResponse response) throws Exception {
                        request = ctx.getRequest();
                        response = ctx.getResponse();
                        String path = reponseUrl; //getUrl(request.getLocale());
                        // Set event name as a request attribute
                        String oldEvent = (String) request.getAttribute(StripesConstants.REQ_ATTR_EVENT_NAME);
                        //request.setAttribute(StripesConstants.REQ_ATTR_EVENT_NAME, event);
                        log.info("check: {}", path);
                        // Revert event name to its original value
                        request.setAttribute(StripesConstants.REQ_ATTR_EVENT_NAME, oldEvent);
                        // Figure out if we're inside an include, and use an include instead of a forward
                        RequestDispatcher dispatcher = request.getRequestDispatcher(path);
                        //request.getRequestDispatcher(path).forward(request, response);
                        dispatcher.forward(request, response);

                    }
                };

但它在应用程序上下文路径中调用,而它应该调用完整的 url。另一种解决方案,如果我使用重定向解析并设置 includerequest 参数 true 将完成这项工作,但将所有请求参数放入 url 这使得它不可接受。

请求 url 应该在解析执行之前更改,因为它没有用,我已经尝试过了。有什么方法可以在 HTTPServeletRequest 中设置请求 url。

我也尝试过在 ActionBeanResolution 期间进行拦截,这是进行此类活动的最佳场所。我的主要问题是 POST 参数。我无法重定向(因为它们被刷新或者如果使用包含 reuest 参数,它们在 URL 中可见)。上下文中的前向解决方案。如果有办法将其转发到新 URL,它将完成这项工作。

提前致谢。

4

2 回答 2

2

使用 POST 重定向是不可能的。故事结局。

只要确保abc用户永远不会看到指向xyz的链接或表单。

为 GET 请求重定向(如果用户直接在地址栏中输入xyz URL),并为 POST 请求重定向到某个错误页面或主页,因为无论如何都不应该发生这种情况。

于 2012-05-20T12:18:20.290 回答
0

@JB Nizet 和 @Pointy 感谢您的时间和回复。我想出了一个解决我的问题的方法。@Pointy我正在更改需要重定向的用户子域,但我也不想在该请求中丢失发布参数。我希望现在它是有道理的。

这是我所做的(在步骤中):

  • 首先,我想何时需要进行重定向并需要保存 post 参数。
  • 将所有帖子数据保存在会话中(临时)。
  • 如果我在会话中有任何临时发布值,我将其放入新请求中并从会话中删除发布值。

代码:用于在会话中设置 post 参数:

resolution = new RedirectResolution(reponseUrl);
            Iterator<Map.Entry<String, String[]>> requestParamter = ctx.getRequest().getParameterMap().entrySet().iterator();
            List<IdName> requestParams = new ArrayList<IdName>();
            while(requestParamter.hasNext()){
                IdName param = new IdName();
                Map.Entry<String, String[]> entry = requestParamter.next();
                param.setName(entry.getKey());
                param.setParameterValues(entry.getValue());
                log.trace("intercept - Adding Key: {} with value: {} to redirect request parameter.", entry.getKey(), entry.toString() );
                requestParams.add(param);
            }
            ctx.setRedirectRequestParameter(requestParams);

为了取回它:

if(ctx.getRedirectRequestParameter() != null && !ctx.getRedirectRequestParameter().isEmpty()){
                //Removes parameter which are already in request from redirect request parameter.
                Map<String, String[]> additionalParams = new TreeMap<String, String[]>();
                Map requestParameterMap = ctx.getRequest().getParameterMap();
                ListIterator<IdName> oldRequestParams = ctx.getRedirectRequestParameter().listIterator();
                while(oldRequestParams.hasNext()){
                    IdName oldRequestParam = oldRequestParams.next();
                    log.trace("Lopping requestparameter key: {} ", oldRequestParam.getName() );
                    if (!requestParameterMap.containsValue(oldRequestParam.getName())) {
                        additionalParams.put(oldRequestParam.getName(), oldRequestParam.getParameterValues());
                    }
                }
                HttpServletRequest newRequest = new MyperksHttpServletRequestWrapper(ctx.getRequest(), additionalParams);
                ctx.setRequest(newRequest);
                ctx.setRedirectRequestParameter(null);
            }

我还创建了一个包装器类,它向请求添加了新参数,它创建了一个新的请求包装器,它将附加参数合并到请求对象中,而不会过早地从原始请求中读取参数。有关此类的详细信息,请点击链接:PrettyFaceRequestWrapper

于 2012-06-18T03:57:50.623 回答