一、定义
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等。
工作原理:只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作,。过滤器在链中的顺序与它在web.xml中配置的顺序有关;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁
Filter作用:
-
在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
-
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
-
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
-
根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
二、使用方式
1.过滤器使用方法,实现Filter类
@Slf4j
public class CsrfFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 允许跨域请求访问
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET"); //跨域请求为post、get类型
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
log.info("配置跨域访问:请求参数->{}", JsonUtil.toJsonString(servletRequest.getParameterMap()));
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
2.配置过滤器
1)SpringBoot中FilterRegistrationBean配置filter
通过在springboot的configuration中配置不同的FilterRegistrationBean实例,来注册自定义过滤器
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean corsFilterConfig() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setName("cors-filter"); //过滤器名称
registrationBean.addUrlPatterns("*"); //过滤的路径
registrationBean.setFilter(new CorsAllFilter()); //过滤器实例
registrationBean.setOrder(0); //优先级,数字越低越先访问
return registrationBean;
}
}
可添加多个过滤器,只需要写多个类实现Filter即可,并再FilterRegistrationBean的setFilter中进行实例化,然后通过@Bean注册它
2)spring中通过web.xml配置
调用顺序是通过在web.xml中的注册顺序来加载的
<!-- OA 登录 Filter -->
<!-- 定义Filter标签 -->
<filter>
<!-- Filter的名字 -->
<filter-name>request-filter</filter-name>
<!-- Filter的实现类 -->
<filter-class>com.***.finance.admin.filter.RequestFilter</filter-class>
<!-- servlet初始化参数,可在init()方法中获取到 -->
<init-param>
<param-name>notLoginPath</param-name>
<param-value>
favicon.ico,login,logout,forbidden,welcome,check.do,x,([^\s]+(\.(?i)(jpg|png|gif|bmp|js|css|woff|woff2|ttf|eot|lang))$)
</param-value>
</init-param>
</filter>
<!-- 定义Filter拦截的URL地址 -->
<filter-mapping>
<filter-name>request-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>