0

エンドユーザーにメールで送信するアプリケーションのURLがあります。

これで、urlに「username」フィールドが含まれます。このフィールドには「@」文字を含めることができます。

たとえば、エンドユーザーに送信されたリンクの場合:

http://localhost:8080/my-app/someaction/activateuser/abc@def.com/somedata/

これで、ユーザーが上記のリンクをクリックするたびに、次の例外がスローされます。

java.lang.IllegalArgumentException
    Input string 'abc@def.com' is not valid; the character '@' at position 4 is not valid.
    at org.apache.tapestry5.internal.services.URLEncoderImpl.decode(URLEncoderImpl.java:144)
    at $URLEncoder_137022607d9.decode($URLEncoder_137022607d9.java)
    at org.apache.tapestry5.internal.services.ContextPathEncoderImpl.decodePath(ContextPathEncoderImpl.java:92)
    at $ContextPathEncoder_137022607cd.decodePath($ContextPathEncoder_137022607cd.java)
    at org.apache.tapestry5.internal.services.ComponentEventLinkEncoderImpl.checkIfPage(ComponentEventLinkEncoderImpl.java:328)
    at org.apache.tapestry5.internal.services.ComponentEventLinkEncoderImpl.decodePageRenderRequest(ComponentEventLinkEncoderImpl.java:307)
    at org.apache.tapestry5.internal.services.linktransform.LinkTransformerInterceptor.decodePageRenderRequest(LinkTransformerInterceptor.java:68)
    at $ComponentEventLinkEncoder_137022607c1.decodePageRenderRequest($ComponentEventLinkEncoder_137022607c1.java)
    at org.apache.tapestry5.internal.services.PageRenderDispatcher.dispatch(PageRenderDispatcher.java:41)
    at $Dispatcher_137022607c2.dispatch($Dispatcher_137022607c2.java)
    at $Dispatcher_137022607bd.dispatch($Dispatcher_137022607bd.java)
    at org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:321)
    at org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26)

URLのエンコード/デコードなど、このようなシナリオを処理する方法はありますか?

4

3 に答える 3

2

これは予約文字であるため、URLに@を含めることはできません(特定のRFCはRFC 3986です)。

URLEncoderクラスを使用して、URLを許容可能な値にエンコードできます

于 2012-04-30T09:47:11.957 に答える
1

MiniBillがすでに回答しているように、それは機能しません。また、Howardが追加したように、TapestryにはURL用の独自のエンコーダーがあります。つまり、Tapestryが読み取れる形式のURLを取得する最も簡単な方法は、TapestryにURLを作成させてから、電子メールを送信するコンポーネントに渡すことです。

@Inject
private LinkSource linkSource;

@OnEvent(...)
void sendActivationEmail() {
    final Link activationLink = this.createUserActivationLink(email, otherStuff);
    this.activationEmailSender.sendWithActivationLink(email, activationLink);
}

private Link createUserActivationLink(String email, String otherStuff) {
    return linkSource.createPageRenderLink(
       "someaction/activateuser", false, email, otherStuff);
}
于 2012-05-02T11:38:39.100 に答える
0

文字列をBase64にエンコードし、TapestryJava側で解凍することで問題を解決できました。私の文字列はUTF-8でエンコードされた文字でした。

私はこの答えからBase64エンコーダーを変更しました:https ://stackoverflow.com/a/40392850/5339857

function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    })).replace(/\=+$/, '');
}

(タペストリーが気に入らない.replaceパディングを削除するために、最後にを追加しました)=

そして、Java側では、デコードは簡単でした:(この例はjavascriptからのajaxクリックの例です-Base64エンコーディングが発生します)

@OnEvent(value = "clickAjax")
Object clickAjax(String parameter) {
    somePagePropetry = new String(java.util.Base64.getDecoder().decode(parameter));
    return this;
}
于 2017-04-15T16:00:35.727 に答える