對於特定的控制器操作,我想關閉cookie。我試圖刪除Cookie Map,但這似乎不起作用。我需要徹底刪除除我自己以外的所有響應標題。Playframework:如何禁用特定操作的會話/ Cookie?
任何想法?
對於特定的控制器操作,我想關閉cookie。我試圖刪除Cookie Map,但這似乎不起作用。我需要徹底刪除除我自己以外的所有響應標題。Playframework:如何禁用特定操作的會話/ Cookie?
任何想法?
我設法用包裝與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。我不相信你可以刪除它。
我找到了this解決方法,當谷歌搜索這個問題。它的功能與您嘗試使用的一樣簡單,刪除了Cookie映射,但是它使用@Finally
註釋的方法完成。
我相信餅乾地圖是在render()
之後填寫的,但在任何@Finally
註解類之前。
積分亞歷克斯·賈維斯在谷歌網上論壇,代碼被複制以供參考:
/**
* 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 2010-12-13 16:09:48