RegistrationBean类方法说明
修饰符和类型 | 方法和说明 | 描述 |
---|---|---|
void | addInitParameter(String name, String value) | 添加一个init参数,将所有现有参数替换为相同的名称. |
protected void | configure(Registration.Dynamic registration) | 配置注册基础设置. |
Map<String,String> | getInitParameters() | 返回注册初始化参数的可变映射. |
protected String | getOrDeduceName(Object value) | 推导此注册的名称. |
int | getOrder() | |
boolean | isAsyncSupported() | 返回异步操作是否支持此注册. |
boolean | isEnabled() | 启用的标志(默认为true) |
void | setAsyncSupported(boolean asyncSupported) | 设置异步操作是否支持此注册. |
void | setEnabled(boolean enabled) | 指示已启用注册的标志. |
void | setInitParameters(Map<String,String> initParameters) | 设置此注册的初始化参数. |
void | setName(String name) | 设置此注册的名称. |
void | setOrder(int order) | 设置执行顺序,值越小,越先执行。| |
OncePerRequestFilter类方法说明
修饰符和类型 | 方法和说明 | 描述 |
---|---|---|
void | doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) | 此doFilter实现存储“已过滤”的请求属性,如果该属性已经存在,则继续进行而不进行过滤。 |
protected abstract void | doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) | 与相同的合同doFilter,但保证在单个请求线程中每个请求仅被调用一次。 |
protected void | doFilterNestedErrorDispatch(HttpServletRequest request, HttpServletResponse response, FilterChainfilterChain) | 通常,在REQUEST分派完成后,将发生ERROR分派,并且筛选器链重新开始。 |
protected String | getAlreadyFilteredAttributeName() | 返回标识已过滤请求的请求属性的名称。 |
protected boolean | isAsyncDispatch(HttpServletRequest request) | javax.servlet.DispatcherType.ASYNCServlet 3.0中引入的分派器类型意味着可以在单个请求的过程中在多个线程中调用过滤器。 |
protected boolean | isAsyncStarted(HttpServletRequest request) | 请求处理是否处于异步模式,这意味着在退出当前线程后将不会提交响应。 |
protected boolean | shouldNotFilter(HttpServletRequest request) | 可以在子类中重写以进行自定义过滤控制,然后返回true以避免对给定请求进行过滤。 |
protected boolean | shouldNotFilterAsyncDispatch() | javax.servlet.DispatcherType.ASYNCServlet 3.0中引入的分派器类型意味着可以在单个请求的过程中在多个线程中调用过滤器。 |
protected boolean | shouldNotFilterErrorDispatch() | 是否过滤错误调度,例如servlet容器何时处理和错误映射到web.xml。 |
GenericFilterBean类方法说明
| 修饰符和类型| 方法和说明|描述| | :—–| :—- | :—- | protected void addRequiredProperty(String property) 子类可以调用此方法以指定此属性(必须与它们公开的JavaBean属性匹配)是强制性的,并且必须作为配置参数提供。 void afterPropertiesSet() 调用initFilterBean()可能包含子类的自定义初始化的方法。 protected Environment createEnvironment() 创建并返回一个新的StandardServletEnvironment。 void destroy() 子类可以重写此方法以执行自定义过滤器关闭。 Environment getEnvironment() 返回Environment与此过滤器关联的。 FilterConfig getFilterConfig() 使此过滤器的FilterConfig可用(如果有)。 protected String getFilterName() 使此过滤器的名称可用于子类。 protected ServletContext getServletContext() 使此过滤器的ServletContext可用于子类。 void init(FilterConfig filterConfig) 初始化此过滤器的标准方法。 protected void initBeanWrapper(BeanWrapper bw) 可能使用自定义编辑器为此GenericFilterBean初始化BeanWrapper。 protected void initFilterBean() 子类可以重写此方法以执行自定义初始化。 void setBeanName(String beanName) 存储在Spring bean工厂中定义的bean名称。 void setEnvironment(Environment environment) 设置Environment此过滤器运行的位置。 void setServletContext(ServletContext servletContext) 存储运行bean工厂的ServletContext。
FilterRegistrationBean类方法说明
构造函数和描述
FilterRegistrationBean()
创建一个新的FilterRegistrationBean实例.
FilterRegistrationBean(Filter filter, ServletRegistrationBean… servletRegistrationBeans)
创建一个新的FilterRegistrationBean实例,以将其注册到指定的ServletRegistrationBean .
Methods
修饰符和类型 | 方法和说明 | 描述 |
---|---|---|
void | addServletNames(String… servletNames) | 为过滤器添加servlet名称. |
void | addServletRegistrationBeans(ServletRegistrationBean… servletRegistrationBeans) | 为过滤器添加ServletRegistrationBean . |
void | addUrlPatterns(String… urlPatterns) | 添加将向其注册过滤器的URL模式. |
protected void | configure(FilterRegistration.Dynamic registration) | 配置注册设置. |
protected Filter | getFilter() | 返回正在注册的过滤器. |
Collection |
getServletNames() | 返回一个可变的servlet名称集合,将向其注册过滤器. |
Collection |
getServletRegistrationBeans() | 返回将注册过滤器的ServletRegistrationBean的可变集合. |
Collection |
getUrlPatterns() | 返回一个可变的URL模式集合,过滤器将针对该URL模式进行注册. |
boolean | isMatchAfter() | 返回是否应在ServletContext的任何声明的Filter映射之后匹配过滤器映射. |
void | onStartup(ServletContext servletContext) | 使用初始化所需的所有Servlet,过滤器,侦听器上下文参数和属性来配置给定的ServletContext . |
void | setDispatcherTypes(DispatcherType first, DispatcherType… rest) | 使用指定元素set dispatcher types便捷方法. |
void | setDispatcherTypes(EnumSet |
设置应与注册一起使用的调度程序类型. |
void | setFilter(Filter filter) | 设置要注册的过滤器. |
void | setMatchAfter(boolean matchAfter) | 设置是否在ServletContext的任何声明的过滤器映射之后匹配过滤器映射. |
void | setServletNames(Collection |
设置将向其注册过滤器的servlet名称. |
void | setServletRegistrationBeans(Collection<? extends ServletRegistrationBean> servletRegistrationBeans) | 设置ServletRegistrationBean ,将向其注册过滤器. |
void | setUrlPatterns(Collection |
设置注册过滤器的URL格式. |
FilterRegistrationBean示例
拦截器与过滤器的区别
过滤器可以简单理解为 “取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为 “拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。
- addInitParameter 方法使示例1
/**
* 注册一个StatViewServlet
* @return
*/
@Bean
public ServletRegistrationBean DruidStatViewServle() {
// org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),
"/druid/*");
// 添加初始化参数:initParams
// 白名单:
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not
// permitted to view this page.
servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
// 登录查看信息的账号密码.
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "123456");
// 是否能够重置数据.
servletRegistrationBean.addInitParameter("resetEnable", "true");
return servletRegistrationBean;
}
- addInitParameter 方法使示例2
/**
* 注册一个:filterRegistrationBean
* @return
*/
@Bean
public FilterRegistrationBean druidStatFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
// 添加过滤规则.
filterRegistrationBean.addUrlPatterns("/*");
// 添加忽略的格式信息.
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
- addUrlPatterns 方法使示例1
registration.addUrlPatterns("/*");过滤应用程序中所有资源,当前应用程序根下的所有文件包括多级子目录下的所有文件,注意这里*前有“/”
registration.addUrlPatterns(".html");过滤指定的类型文件资源, 当前应用程序根目录下的所有html文件,注意:*.html前没有“/”,否则错误
registration.addUrlPatterns("/folder_name/*");过滤指定的目录下的所有文件,当前应用程序根目录下的folder_name子目录(可以是多级子目录)下所有文件
registration.addUrlPatterns("/index.html");过滤指定文件
Filter类方法详解
拦截器与过滤器的区别
过滤器可以简单理解为 “取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为 “拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。
方法细节
init
void init(FilterConfig filterConfig)
抛出ServletException
Web容器调用以指示过滤器已投入使用。
实例化过滤器后,servlet容器仅调用一次init方法。在要求过滤器执行任何过滤工作之前,必须成功完成init方法。
如果使用init方法,则Web容器无法将过滤器投入使用
抛出ServletException
在Web容器定义的时间段内不返回
抛出:
ServletException|
doFilter
void doFilter(ServletRequest 请求,
ServletResponse 响应,
FilterChain 链)
抛出IOException,
ServletException
doFilter每当客户端对链末端的资源提出请求时,每次通过链传递请求/响应对时,容器都会调用Filter 的方法。传入此方法的FilterChain允许Filter将请求和响应传递给链中的下一个实体。
此方法的典型实现将遵循以下模式:
检查请求
(可选)使用自定义实现包装请求对象,以过滤内容或标头以进行输入过滤
(可选)使用自定义实现包装响应对象,以过滤内容或标头以进行输出过滤
或者调用中使用FilterChain对象链中的下一个实体(chain.doFilter()),
或不将请求/响应对传递给过滤器链中的下一个实体以阻止请求处理
调用过滤器链中的下一个实体后,直接在响应上设置标头。
抛出:
IOException
ServletException
destroy
void destroy()
由Web容器调用,以指示过滤器已停止使用。
仅在过滤器的doFilter方法中的所有线程都已退出或经过超时时间后,才调用此方法。Web容器调用此方法后,将不再在该过滤器实例上再次调用doFilter方法。
此方法使筛选器有机会清理所持有的所有资源(例如,内存,文件句柄,线程),并确保任何持久状态都与筛选器在内存中的当前状态同步。
CharacterEncodingFilter类方法说明
Servlet过滤器,它允许为请求指定字符编码。这很有用,因为即使在HTML页面或表单中指定了当前的浏览器,通常也不会设置字符编码。 如果请求尚未指定编码,则此过滤器可以应用其编码,或者在任何情况下都可以强制执行此过滤器的编码(“ forceEncoding” =“ true”)。在后一种情况下,该编码也将用作默认响应编码(尽管通常会被视图中设置的完整内容类型覆盖)
修饰符和类型 | 方法和说明 | 描述 |
---|---|---|
protected void | doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) | 与相同的合同doFilter,但保证在单个请求线程中每个请求仅被调用一次。 |
String | getEncoding() | 返回为请求和/或响应配置的编码。 |
boolean | isForceRequestEncoding() | 返回是否对请求强加编码。 |
boolean | isForceResponseEncoding() | 返回是否应在响应中强制使用编码。 |
void | setEncoding(String encoding) | 设置用于请求的编码。 |
void | setForceEncoding(boolean forceEncoding) | 设置是否encoding应该配置此过滤器以覆盖现有的请求和响应编码。 |
void | setForceRequestEncoding(boolean forceRequestEncoding) | 设置encoding此过滤器的配置是否应该覆盖现有的请求编码。 |
void | setForceResponseEncoding(boolean forceResponseEncoding) | 设置encoding此过滤器的配置是否应该覆盖现有的响应编码。 |
LocalDateTime在spring boot中的格式化配置
在项目中日期格式化是最常见的问题,之前涉及的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,非线程安全,对日期的计算方式繁琐,而且容易出错,因为月份是从0开始的,从 Calendar 中获取的月份需要加一才能表示当前月份。
在 JDK8 中,一个新的重要特性就是引入了全新的时间和日期API,它被收录在 java.time 包中,借助新的时间和日期API可以以更简洁的方法处理时间和日期。
下面我们通过一些配置实现对日期类型LocalDateTime的格式化
导入依赖
新建一个spring boot项目导入web依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置方案一
定义一个配置类,在里面定义两个 Bean 即可完成全局日期格式化处理,同时还兼顾了 Date 和 LocalDateTime 并存
package com.carry.config;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
@Configuration
public class LocalDateTimeSerializerConfig {
@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
private String pattern;
// 方案一
@Bean
public LocalDateTimeSerializer localDateTimeDeserializer() {
return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
}
}
实体类
package com.carry.dto;
import java.time.LocalDateTime;
public class Order {
private LocalDateTime createTime;
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
}
控制层
package com.carry.controller;
import java.time.LocalDateTime;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.carry.dto.Order;
@RestController
@RequestMapping("/orders")
public class OrderController {
@GetMapping
public Order query() {
Order order = new Order();
order.setCreateTime(LocalDateTime.now());
return order;
}
}
测试
启动项目并在浏览器中访问 http://localhost:8080/orders
{
"createTime":"2020-02-18 14:21:34"
}
参考链接
339 post articles, 43 pages.