特定のコントローラーアクションについて、Cookieをオフにします。クッキーマップを削除しようとしましたが、うまくいかないようです。自分以外のすべての応答ヘッダーを完全に削除する必要があります。
何か案は?
特定のコントローラーアクションについて、Cookieをオフにします。クッキーマップを削除しようとしましたが、うまくいかないようです。自分以外のすべての応答ヘッダーを完全に削除する必要があります。
何か案は?
この問題をグーグルで検索したときに、この解決策を見つけました。これは、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でテスト済み)
応答を。のラッパーでラップすることができました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);
}
}
アクションで、次の方法ですべてのヘッダーをクリアできるはずです。
Http.Response.current().reset();
セッションはCookieであることに注意してください。私はあなたがそれを取り除くことができるとは思わない。
回避策として、リクエストごとにセッション全体を破棄するのはどうですか?
セッション全体を破棄する
Ok("Bye").withNewSession
https://www.playframework.com/documentation/2.3.x/ScalaSessionFlash#Discarding-the-whole-session