拦截和更改请求URL使用Stripes框架

时间:2012-05-20 11:46:23

标签: java servlet-filters stripes

我在拦截和更改请求网址时遇到问题,无法将其与正确的网址相关联。 我正在使用条带框架,并希望将用户重定向到他们正确的子域。 例如。如果用户属于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会使其无法接受。

在决议执行之前应该更改请求网址,因为它没有用处,我已经尝试过了。有没有办法在HTTPServeletRequest中设置请求URL。

我还试图在ActionBeanResolution期间拦截,这是进行此类活动的最佳位置。我的主要问题是POST参数。我无法重定向(因为它们被刷新或者如果使用包含reuest参数,则它们在URL中可见)。关于前瞻性的前瞻性决议。如果有办法将其转发到新网址,它将完成这项工作。

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

@JB Nizet和@Pointy感谢您的时间和回复。我找到了解决问题的方法。 @Pointy我正在更改需要重定向的用户子域,但我也不想在该请求中丢失post参数。我希望现在有意义。

我在这里做了(步骤):

  • 首先我想到我需要进行重定向并需要保存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