4

特定のコントローラーアクションについて、Cookieをオフにします。クッキーマップを削除しようとしましたが、うまくいかないようです。自分以外のすべての応答ヘッダーを完全に削除する必要があります。

何か案は?

4

5 に答える 5

3

この問題をグーグルで検索したときに、この解決策を見つけました。これは、Cookieマップを削除して、試行したのと同じシンニングを実行しますが、。で注釈が付けられたメソッドで実行され@Finallyます。

クッキーマップは、注釈付きのクラスrender()の後、前に埋められると思います。@Finally

GoogleグループのAlexJarvisのクレジット、コードは参照用にコピーされています。

/** 
 * Removes cookies from all responses. 
 * 
 * This is because cookies are not required in stateless webservice and 
 * we don't want to send any unnecessary information to the client. 
 * 
 * @author Alex Jarvis 
 */ 
public class NoCookieFilter extends Controller { 

        /** An empty cookie map to replace any cookies in the response. */ 
        private static final Map<String, Http.Cookie> cookies = new HashMap<String, Http.Cookie>(0); 

        /** 
         * When the configuration property 'cookies.enabled' equals false, 
         * this Finally filter will replace the cookies in the response with an empty Map. 
         */ 

        @Finally 
        protected static void removeCookies() { 
            boolean cookiesEnabled = Boolean.parseBoolean(Play.configuration.getProperty("cookies.enabled")); 
            if (!cookiesEnabled) { 
                    response.cookies = cookies; 
            } 
        } 

} 

使用法:「Cookieなし」にしたいコントローラーについては、次のように注釈を付けます。

@With(NoCookieFilter.class)

(Play 1.2.5でテスト済み)

于 2012-08-03T14:07:30.753 に答える
1

応答を。のラッパーでラップすることができましたresponse.current.set(new CookieLessResponseWrapper(response.current()))。私にとっては大丈夫です。

興味のある方のために、Responseラッパーのコードを次に示します。

package helpers;

import play.mvc.Http.Response;

public class CookieLessResponseWrapper extends Response {
    private Response wrappedResponse;

    public CookieLessResponseWrapper(Response response) {
        this.wrappedResponse = response;
    }

    @Override
    public void accessControl(String allowOrigin, boolean allowCredentials) {
        wrappedResponse.accessControl(allowOrigin, allowCredentials);
    }

    @Override
    public void accessControl(String allowOrigin, String allowMethods,
            boolean allowCredentials) {
        wrappedResponse.accessControl(allowOrigin, allowMethods, allowCredentials);
    }

    @Override
    public void accessControl(String allowOrigin) {
        wrappedResponse.accessControl(allowOrigin);
    }

    @Override
    public void cacheFor(String etag, String duration, long lastModified) {
        wrappedResponse.cacheFor(etag, duration, lastModified);
    }

    @Override
    public void cacheFor(String duration) {
        wrappedResponse.cacheFor(duration);
    }

    @Override
    public String getHeader(String name) {
        return wrappedResponse.getHeader(name);
    }

    @Override
    public void print(Object o) {
        wrappedResponse.print(o);
    }

    @Override
    public void removeCookie(String name) {
        wrappedResponse.removeCookie(name);
    }

    @Override
    public void reset() {
        wrappedResponse.reset();
    }

    @Override
    public void setContentTypeIfNotSet(String contentType) {
        wrappedResponse.setContentTypeIfNotSet(contentType);
    }

    @Override
    public void setCookie(String name, String value, String domain,
            String path, Integer maxAge, boolean secure, boolean httpOnly) {
    }

    @Override
    public void setCookie(String name, String value, String domain,
            String path, Integer maxAge, boolean secure) {
    }

    @Override
    public void setCookie(String name, String value, String duration) {
    }

    @Override
    public void setCookie(String name, String value) {
    }

    @Override
    public void setHeader(String name, String value) {
        wrappedResponse.setHeader(name, value);
    }

}
于 2010-12-13T19:58:27.953 に答える
0

アクションで、次の方法ですべてのヘッダーをクリアできるはずです。

Http.Response.current().reset();
于 2010-12-13T14:55:13.253 に答える
0

セッションはCookieであることに注意してください。私はあなたがそれを取り除くことができるとは思わない。

于 2010-12-13T15:50:57.123 に答える
0

回避策として、リクエストごとにセッション全体を破棄するのはどうですか?

セッション全体を破棄する

Ok("Bye").withNewSession

https://www.playframework.com/documentation/2.3.x/ScalaSessionFlash#Discarding-the-whole-session

于 2015-11-05T07:18:00.460 に答える