1. 防止用户使用回退按钮时,页面不会重新加载
//1、控制浏览器禁止缓存当前文档内容
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); //不直接使用缓存,要求向服务器发起(新鲜度校验)请求(非代理服务器的缓存)
response.setHeader("Pragma", "no-cache");
HTTP 1.0. response.setHeader("Expires", "0");
2.防止盗链
def referer = request.getHeader("Referer")//获取来访者地址。只有通过链接访问当前页的时候,才能获取上一页的地址;
if (!(referer && targetUriAllowed(referer))) {
log.warn("Invalid Referer:${referer}")
throw new RuntimeException("系统繁忙!")
}
params.targetUri = secureTargetUri(params.targetUri)
if (!targetUriAllowed(params.targetUri)) {
log.warn("Invalid targetUri:${params.targetUri}")
params.targetUri = defaultPath()
}
def targetUriAllowed(targetUri) {
def host = request.getHeader("Host")
if (targetUri.startsWith("/")) {
return true
} else {
targetUri = targetUri.replaceAll("http://", "").replaceAll("https://", "")
if (!host?.contains(".")) {
//nginx forwarded request, safe
return true
}
if (targetUri.startsWith(host)) {
return true
}
}
return false
}
def secureTargetUri(def targetUri) {
def start = targetUri.indexOf("?")
if (start > 0) {
def urlString = StringEscapeUtils.escapeHtml4(targetUri.substring(0, start))
def paramString = targetUri.substring(start + 1)
def newParamsString = paramString.split("&").collect {
StringEscapeUtils.escapeHtml4(it)
}.join("&")
return urlString + "?" + newParamsString
}
return StringEscapeUtils.escapeHtml4(targetUri)
}
3.response的一些设置
(1)在对 preflight request.(预检请求)的应答中明确了客户端所要访问的资源允许使用的方法或方法列表。
Access-Control-Request-Method: POST
(2)X-Content-Type-Options: nosniff 响应首部相当于一个提示标志,被服务器用来提示客户端一定要遵循Content-Type
首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。
注意: nosniff
只应用于 "script
" 和 "style
" 两种类型。事实证明,将其应用于图片类型的文件会导致与现有的站点冲突。
项目中遇到图片content-type为stream,在IE下无法显示的问题,就是因为此属性的设置造成的。
(3)X-Frame-Options有三个值:
DENY
表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN
表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM uri
表示该页面可以在指定来源的 frame 中展示。