目录
过滤器
一、用过滤器检查用户是否登录
LoginFilter自定义过滤器
FilterConfig配置类
FilterController控制器
SpringbootFilterApplication启动类
二、用过滤器统计资源访问量
LoginFilter
FilterController
在开发SpringBoot项目时,开发人员经常需要对HTTP请求进行拦截和处理,以实现诸如身份验证、授权、日志记录等功能。为了实现这些功能,Spring Boot提供了过滤器和拦截器这两个工具。此外,开发人员还需要使用SpringBoot中的监听器监听SpringBoot项目中的特定事件,以实现统计网站访问量、记录用户访问路径、系统启动时加载初始化信息等功能。
过滤器
- 过滤器不仅可以对用户通过URL地址发送的请求进行过滤处理,例如,过滤一些错误的请求或者请求中的敏感词等,而且可以对服务器返回的数据进行过滤处理,例如,压缩响应信息
- 过滤器在Web开发中的一些主要应用:
- 对用户请求进行统一认证
- 对用户的访问请求进行记录和审核
- 对用户发送的数据进行过滤和替换
- 转换图像格式
- 对响应内容进行压缩,减少传输量
- 对请求和响应进行加密和解密处理
- 触发资源访问事件
- 实现过滤器主要是实现了Filter接口,Filter接口有三大方法:
- init():初始化方法
- doFilter():过滤方法
- destroy():销毁方法
- 过滤器与拦截器的主要区别在于触发的时机不同
一、用过滤器检查用户是否登录
- 大多数网站都会要求用户登录之后再浏览网站内容,如果用户在未登录状态下直接访问网站资源,网站就会提示用户先登录
- SpringBoot专门提供了用于配置过滤器的FilterRegistrationBean类
新建一个SpringBoot项目
项目结构:
LoginFilter自定义过滤器
package com.study.springboot_filter.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class LoginFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest) request;Object user = req.getSession().getAttribute("user");if(user==null){//表示没有任何登录记录,强制把请求转发至登录页面req.getRequestDispatcher("/login").forward(request,response);}else{chain.doFilter(request, response);}}
}
FilterConfig配置类
package com.study.springboot_filter.config;import com.study.springboot_filter.filter.LoginFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean getFilter(){FilterRegistrationBean bean = new FilterRegistrationBean<>();bean.setFilter(new LoginFilter());bean.addUrlPatterns("/main/*");//过滤"/main"下的所有子路径bean.setName("loginfilter");return bean;}
}
FilterController控制器
package com.study.springboot_filter.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class FilterController {/*** 登录后访问的页面*/@RequestMapping("/main/index")public String index(){return "欢迎访问XXX网站";}/*** 登录页面*/@RequestMapping("/login")public String login(){return "请先登录!";}
}
SpringbootFilterApplication启动类
package com.study.springboot_filter;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringbootFilterApplication {public static void main(String[] args) {SpringApplication.run(SpringbootFilterApplication.class, args);}}
启动项目,访问网址:http://localhost:8080/main/index
session中没有用户登录的记录,所以页面强制跳转到了登录页面
二、用过滤器统计资源访问量
- 使用过滤器可以统计某个URL地址的访问次数
- 使用@WebFilter注解可以快速配置过滤器
- 代码基本同上,核心部分如下
LoginFilter
package com.study.springboot_filter.filter;import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** 使用@WebFilter注解可以快速配置过滤器,必须同时与@Component一起使用* urlPatterns为过滤器所过滤的地址,在此模拟了一个在线的视频文件*/
@Component
@WebFilter(urlPatterns = "/vedio/710.mp4")
public class LoginFilter implements Filter {//Filter接口有如下三大方法//过滤器初始化时会调用该方法,可不重写@Overridepublic void init(FilterConfig filterConfig) throws ServletException {ServletContext context = filterConfig.getServletContext();//获取上下文对象context.setAttribute("count",0);//计数器初始值为0}//过滤器的核心方法,在该方法中实现过滤业务,必须被重写@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest) request;ServletContext context = req.getServletContext();//获取上下文对象Integer count= (Integer) context.getAttribute("count");//获取计数器的值context.setAttribute("count",++count);//让计数器自增chain.doFilter(request, response);//过滤链对象,可将请求交给下一个过滤器处理}//过滤器销毁时会调用的方法,可不重写@Overridepublic void destroy() {}}
FilterController
package com.study.springboot_filter.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;@RestController
public class FilterController {@RequestMapping("/vedio/710.mp4")public String index(HttpServletRequest request){ServletContext context = request.getServletContext();Integer count= (Integer) context.getAttribute("count");return "当前访问量: "+count;//打印该地址被访问的次数}
}
启动项目,访问网址:http:localhost:8080/vedio/710.mp4
每次刷新该页面,访问量都会递增。重启浏览器,仍然可以看到累计的访问量