首页 > 其他分享 >SpringSecurity过滤器之HeaderWriterFilter

SpringSecurity过滤器之HeaderWriterFilter

时间:2023-04-22 21:58:06浏览次数:42  
标签:writer request HeaderWriterFilter SpringSecurity HEADER writers addIfNotNull 过滤器

HeaderWriterFilter用于对当前的HttpServletResponse添加某些浏览器保护的响应头。HeaderWriterFilter由HeadersConfigurer配置,在执行HeadersConfigurer#configure时调用createHeaderWriterFilter创建HeaderWriterFilter,同时添加了HeaderWriter集合:

private List<HeaderWriter> getHeaderWriters() {
	List<HeaderWriter> writers = new ArrayList<>();
	addIfNotNull(writers, this.contentTypeOptions.writer);
	addIfNotNull(writers, this.xssProtection.writer);
	addIfNotNull(writers, this.cacheControl.writer);
	addIfNotNull(writers, this.hsts.writer);
	addIfNotNull(writers, this.frameOptions.writer);
	addIfNotNull(writers, this.hpkp.writer);
	addIfNotNull(writers, this.contentSecurityPolicy.writer);
	addIfNotNull(writers, this.referrerPolicy.writer);
	addIfNotNull(writers, this.featurePolicy.writer);
	addIfNotNull(writers, this.permissionsPolicy.writer);
	addIfNotNull(writers, this.crossOriginOpenerPolicy.writer);
	addIfNotNull(writers, this.crossOriginEmbedderPolicy.writer);
	addIfNotNull(writers, this.crossOriginResourcePolicy.writer);
	writers.addAll(this.headerWriters);
	return writers;
}

默认情况下添加的HeaderWriter有XContentTypeOptionsHeaderWriter,XXssProtectionHeaderWriter,CacheControlHeadersWriter,HstsHeaderWriter,XFrameOptionsHeaderWriter。

 
 

XContentTypeOptionsHeaderWriter#XContentTypeOptionsHeaderWriter()

public XContentTypeOptionsHeaderWriter() {
	super("X-Content-Type-Options", "nosniff");
}

XContentTypeOptionsHeaderWriter构造函数添加了X-Content-Type-Options用于防止内容嗅探。调用父类的writeHeaders将响应头添加到响应中。

 
 

XXssProtectionHeaderWriter#writeHeaders(HttpServletRequest request, HttpServletResponse response)

public void writeHeaders(HttpServletRequest request, HttpServletResponse response) {
	if (!response.containsHeader(XSS_PROTECTION_HEADER)) {
		response.setHeader(XSS_PROTECTION_HEADER, this.headerValue);
	}
}

XSS_PROTECTION_HEADER是X-XSS-Protection,headerValue是1; mode=block。X-XSS-Protection响应头含义参考https://blog.csdn.net/suo082407128/article/details/104940753。

 
 

CacheControlHeadersWriter

public CacheControlHeadersWriter() {
	this.delegate = new StaticHeadersWriter(createHeaders());
}

private static List<Header> createHeaders() {
	List<Header> headers = new ArrayList<>(3);
	headers.add(new Header(CACHE_CONTROL, "no-cache, no-store, max-age=0, must-revalidate"));
	headers.add(new Header(PRAGMA, "no-cache"));
	headers.add(new Header(EXPIRES, "0"));
	return headers;
}

添加响应头Cache-Control:no-cache, no-store, max-age=0, must-revalidate;Pragma:no-cache;Expires:0三个响应头阻止缓存。

 
 

HstsHeaderWriter

public void writeHeaders(HttpServletRequest request, HttpServletResponse response) {
	if (!this.requestMatcher.matches(request)) {
		if (this.logger.isTraceEnabled()) {
			this.logger.trace(LogMessage.format("Not injecting HSTS header since it did not match request to [%s]",
					this.requestMatcher));
		}
		return;
	}
	if (!response.containsHeader(HSTS_HEADER_NAME)) {
		response.setHeader(HSTS_HEADER_NAME, this.hstsHeaderValue);
	}
}

添加Strict-Transport-Security响应头用于HTTP Strict Transport Security (HSTS)。

 
 

XFrameOptionsHeaderWriter

public void writeHeaders(HttpServletRequest request, HttpServletResponse response) {
	if (XFrameOptionsMode.ALLOW_FROM.equals(this.frameOptionsMode)) {
		String allowFromValue = this.allowFromStrategy.getAllowFromValue(request);
		if (XFrameOptionsMode.DENY.getMode().equals(allowFromValue)) {
			if (!response.containsHeader(XFRAME_OPTIONS_HEADER)) {
				response.setHeader(XFRAME_OPTIONS_HEADER, XFrameOptionsMode.DENY.getMode());
			}
		}
		else if (allowFromValue != null) {
			if (!response.containsHeader(XFRAME_OPTIONS_HEADER)) {
				response.setHeader(XFRAME_OPTIONS_HEADER,
						XFrameOptionsMode.ALLOW_FROM.getMode() + " " + allowFromValue);
			}
		}
	}
	else {
		response.setHeader(XFRAME_OPTIONS_HEADER, this.frameOptionsMode.getMode());
	}
}

用于设置X-Frame-Options响应头。具体含义参考https://blog.csdn.net/u014704612/article/details/115633050。

标签:writer,request,HeaderWriterFilter,SpringSecurity,HEADER,writers,addIfNotNull,过滤器
From: https://www.cnblogs.com/shigongp/p/17344009.html

相关文章

  • 认证流程 SpringSecurity完整流程
    登录校验流程 SpringSecurity完整流程​SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 ​图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示。UsernamePasswordAuthenticationFilter:负责......
  • SpringSecurity准备工作
    ​我们先要搭建一个简单的SpringBoot工程导入依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version></parent><......
  • SpringSecurity过滤器之ExceptionTranslationFilter
    ExceptionTranslationFilter是处理AuthenticationException(身份认证异常)和AccessDeniedException(权限异常)。ExceptionTranslationFilter用法和源码分析参考一文搞定SpringSecurity异常处理机制!。 AuthenticationEntryPoint是处理AuthenticationException,默认实现是LoginUrl......
  • SpringSecurity完整流程、如何查看具体的过滤器
    SpringSecurity完整流程SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示。UsernamePasswordAuthenticationFilter:负责处理我们再登录页面填写了......
  • SpringSecurity入门案例准备工作、入门案例引入SpringSecurity
    SpringSecurity入门案例准备工作1.快速入门1.1准备工作我们先要搭建一个简单的SpringBoot工程1、设置父工程添加依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3......
  • SpringSecurity课程介绍、SpringSecurity课程简介
    课程介绍课程简介 SpringSecurity是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro......
  • Redis布隆过滤器的原理和应用场景,解决缓存穿透
    大家好,我是哪吒。一、布隆过滤器BloomFilter是什么布隆过滤器BloomFilter是一种专门用来解决去重问题的高级数据结果。实质就是一个大型位数组和几个不同的无偏hash函数,无偏表示分布均匀。由一个初值为零的bit数组和多个哈希函数组成,用来判断某个数据是否存在,它和HyperLogLog一样,不......
  • SpringSecurity
     https://www.cnblogs.com/SjhCode/p/SpringSecurity.htmlpermitAll() :无条件允许任何形式访问,不管你登录还是没有登录。anonymous() :允许匿名访问,也就是没有登录才可以访问。denyAll() :无条件决绝任何形式的访问。authenticated():只允许已认证的用户访问。fullyAuthe......
  • Spring MVC过滤器-ShallowEtagHeaderFilter
    评:ShallowEtagHeaderFilter是spring提供的支持ETag的一个过滤器,所谓ETag是指被请求变量的实体值,是一个可以与Web资源关联的记号,而Web资源可以是一个Web页,也可以是JSON或XML文档,服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:[......
  • Django框架模版渲染与过滤器使用
    前端模版使用过滤器,如时间格式化等'''都是在前端页面中使用'''#default 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。{{value|default:"nothing"}}#给value这个值设置一个默认值,如果value没有传值或者值为空的话就显示nothing#length 返回值的......