目录
过滤器
一、用过滤器检查用户是否登录
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 {
@Override
public 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 {
@Bean
public 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接口有如下三大方法
//过滤器初始化时会调用该方法,可不重写
@Override
public void init(FilterConfig filterConfig) throws ServletException {
ServletContext context = filterConfig.getServletContext();//获取上下文对象
context.setAttribute("count",0);//计数器初始值为0
}
//过滤器的核心方法,在该方法中实现过滤业务,必须被重写
@Override
public 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);//过滤链对象,可将请求交给下一个过滤器处理
}
//过滤器销毁时会调用的方法,可不重写
@Override
public 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
每次刷新该页面,访问量都会递增。重启浏览器,仍然可以看到累计的访问量