特定のコントローラーアクションについては、Cookieを無効にしたいと思います。 Cookieマップを削除しようとしましたが、動作していないようです。自分以外のすべての応答ヘッダーを完全に削除する必要があります。Playframework:特定のアクションでセッション/ Cookieを無効にするにはどうすればよいですか?
アイデア?
特定のコントローラーアクションについては、Cookieを無効にしたいと思います。 Cookieマップを削除しようとしましたが、動作していないようです。自分以外のすべての応答ヘッダーを完全に削除する必要があります。Playframework:特定のアクションでセッション/ Cookieを無効にするにはどうすればよいですか?
アイデア?
response.current.set(new CookieLessResponseWrapper(response.current()))
というラッパーで応答をラップすることができました。私のために働きます。
ここには、誰かが興味を持っている場合のレスポンスラッパーのコードがあります。
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();
セッションはクッキーであると考えています。私はあなたがそれを取り除くことができるとは思わない。
私はこの問題をGoogleで検出したときに解決策を見つけました:thisクッキーマップを削除するのと同じように試みますが、@Finally
という注釈が付けられた方法で行われます。
の後、@Finally
注釈付きクラスの前にクッキーマップが埋め込まれていると思います。 Googleグループのアレックス・ジャービスへ
クレジットは、コードは参考のためにコピーされます。
/**
* 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ファイル)
(プレイ1.2.5でテスト済み)
回避策として、リクエストごとにセッション全体を破棄するのはどうでしょうか?
Ok("Bye").withNewSession
https://www.playframework.com/documentation/2.3.x/ScalaSessionFlash#Discarding-the-whole-session
セッション全体を破棄することに動作するようには思えません。 reset()は本体をクリアするためのものです(out.clear())。 – magbyr