简介
过滤器(Filter)是Servlet技术中最实用的技术,它依赖于Servlet容器,在实现上基于函数回调,可以对几乎所有请求进行过滤,其生命周期由Servlet管理。
其主要可用于以下方面:
1、最常见的字符集编码的过滤。
2、对web服务器管理的所有web资源(例如Jsp, Servlet, 静态图片文件或静态 html 文件等)进行拦截,从而实现一些特殊的功能。例如:实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
3、用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。
使用Filter的完整流程:
Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
使用
权限访问控制
方式1、使用自带的FilterRegistrationBean完成设置
(1)创建一个自定义过滤器MyFilter
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void destroy() { }
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
//如果路径包含/login或者/index则放行进行正常访问,否则就重定向到login页面
if(request.getRequestURI().indexOf("/login")!=-1 || request.getRequestURI().indexOf("/index")!=-1){
//在过滤器中修改request,这是过滤器的一大特色。待到达控制层之后,控制层可以取到这里新设置的值
request.setAttribute("attr","过滤器中新设置的值");
filterChain.doFilter(request,servletResponse);
}else{
responseWrapper.sendRedirect("/login");
}
}
}
(2)创建配置类MyMvcConfig
@Configuration
public class MyMVCConfig {
@Bean
public FilterRegistrationBean filterRegist(){
FilterRegistrationBean frbean = new FilterRegistrationBean();
frbean.setFilter(new MyFilter());
frbean.addUrlPatterns("/*");
return frbean;
}
}
(3)创建控制类FilterController
@RestController
public class FilterController {
@RequestMapping("/login")
public String login(){
return "登录页面";
}
@RequestMapping("/shop")
public String shop(){
return "商品页面";
}
@RequestMapping("/index")
public String index(HttpServletRequest request){
System.out.println("attr="+request.getAttribute("attr"));
return "首页";
}
}
方式2、使用@WebFilter注解完成设置
(1)创建一个自定义过滤器MyFilter
@WebFilter
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
//如果路径包含/login或者/index则放行进行正常访问,否则就重定向到login页面
if(request.getRequestURI().indexOf("/login")!=-1 || request.getRequestURI().indexOf("/index")!=-1){
//在过滤器中修改request,这是过滤器的一大特色。待到达控制层之后,控制层可以取到这里新设置的值
request.setAttribute("attr","过滤器中新设置的值");
filterChain.doFilter(request,servletResponse);
}else{
responseWrapper.sendRedirect("/login");
}
}
}
(2)在启动类上添加@ServletComponentScan注解
@ServletComponentScan
@SpringBootApplication
public class Filterdemo2Application {
public static void main(String[] args) {
SpringApplication.run(Filterdemo2Application.class, args);
}
}
(3)创建控制类FilterController(同方式1)