Home

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) 设置执行顺序,值越小,越先执行。|

Read more

OncePerRequestFilter类方法说明

参考 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。

Read more

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。

Read more

FilterRegistrationBean类方法说明

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 dispatcherTypes) 设置应与注册一起使用的调度程序类型.
void setFilter(Filter filter) 设置要注册的过滤器.
void setMatchAfter(boolean matchAfter) 设置是否在ServletContext的任何声明的过滤器映射之后匹配过滤器映射.
void setServletNames(Collection servletNames) 设置将向其注册过滤器的servlet名称.
void setServletRegistrationBeans(Collection<? extends ServletRegistrationBean> servletRegistrationBeans) 设置ServletRegistrationBean ,将向其注册过滤器.
void setUrlPatterns(Collection urlPatterns) 设置注册过滤器的URL格式.

Read more

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");过滤指定文件

Read more

Filter类方法详解

拦截器与过滤器的区别

过滤器可以简单理解为 “取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为 “拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。

方法细节

init

void initFilterConfig  filterConfig
   抛出ServletException
Web容器调用以指示过滤器已投入使用
实例化过滤器后servlet容器仅调用一次init方法在要求过滤器执行任何过滤工作之前必须成功完成init方法

如果使用init方法则Web容器无法将过滤器投入使用

抛出ServletException
在Web容器定义的时间段内不返回
抛出
ServletException|

doFilter

void doFilterServletRequest  请求
               ServletResponse  响应
               FilterChain  
       抛出IOException
               ServletException
doFilter每当客户端对链末端的资源提出请求时每次通过链传递请求/响应对时容器都会调用Filter 的方法传入此方法的FilterChain允许Filter将请求和响应传递给链中的下一个实体
此方法的典型实现将遵循以下模式

检查请求
可选使用自定义实现包装请求对象以过滤内容或标头以进行输入过滤
可选使用自定义实现包装响应对象以过滤内容或标头以进行输出过滤
或者调用中使用FilterChain对象链中的下一个实体chain.doFilter()),
或不将请求/响应对传递给过滤器链中的下一个实体以阻止请求处理
调用过滤器链中的下一个实体后直接在响应上设置标头
抛出
IOException
ServletException

destroy

void destroy()
由Web容器调用以指示过滤器已停止使用
仅在过滤器的doFilter方法中的所有线程都已退出或经过超时时间后才调用此方法Web容器调用此方法后将不再在该过滤器实例上再次调用doFilter方法

此方法使筛选器有机会清理所持有的所有资源例如内存文件句柄线程),并确保任何持久状态都与筛选器在内存中的当前状态同步

Read more

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此过滤器的配置是否应该覆盖现有的响应编码。

Read more

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"
}

参考链接

Read more