0

リクエスト URL を傍受して変更し、正しい URL にリンクする際に問題に直面しています。ストライプ フレームワークを使用しており、ユーザーを正しいサブドメインにリダイレクトしたいと考えています。たとえば。ユーザーが abc.sitename.com に属し、リクエストが xyz.sitename.com から来た場合、すべてのリクエスト投稿とともに abc.sitename.com にリダイレクトする必要があります。getparameter の場合、ライフサイクル解決の実行前に、リクエスト URL とリクエスト クエリを取得し、カスタム インターセプト クラスからユーザーをリダイレクトするだけでこれを実行しました。ただし、リダイレクトであるため、すべての投稿パラメーターがフラッシュされます。別の解決策は解決を転送することでしたが、コンテキスト内でユーザーを取得できるため、次のようにオーバーライドする必要があります。

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は、解決の実行前に変更する必要があります。その後は役に立たないので、試しました。HTTPSServeletRequest でリクエスト 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 パラメータを設定する場合:

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 に答える