Springboot4.0.9,添加Filter(拦截器)

目录

1.写好自己的Filter类,实现Filter接口

2.添加@Configuration和@Bean,注册这个LoginFilter。


1.写好自己的Filter类,实现Filter接口

如,登录拦截的Filter。

java 复制代码
package xyz.jangle.springboot.demo_war.filter;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import xyz.jangle.springboot.demo_war.utils.JConstant;

/**
 * 
 * @author jangle E-mail: jangle@jangle.xyz
 * @version 2018年9月27日 下午2:40:26 类说明
 */
public class LoginFilter implements Filter {

//	private static Logger logger = Logger.getLogger(LoginFilter.class);
	private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);

	private static String loginHtml = "/login.html"; // 登录页面路径

	String[] endWithAtt; // 以此字符串结尾的,不被拦截
	String[] containsAtt; // 包含此字符串的,不被拦截
	String[] notContainsAtt; // 不包含此字符串的,不被拦截
	// 三个规则符合一个即不被拦截,若被拦截,则需要登陆

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

		String endWithStr = filterConfig.getInitParameter("endWith");
		String contains = filterConfig.getInitParameter("contains");
		String notContains = filterConfig.getInitParameter("notContains");
//		logger.info(endWithStr);
//		logger.info(contains);
//		logger.info(notContains);
		if (endWithStr != null) {
			endWithAtt = endWithStr.split(",");
		} else {
			endWithAtt = new String[] {};
		}
		if (contains != null && contains != "") {
			containsAtt = contains.split(",");
		} else {
			containsAtt = new String[] { "cjmm" };
		}
		if (notContains != null) {
			notContainsAtt = notContains.split(",");
		} else {
			notContainsAtt = new String[] {};
		}

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {
			throw new ServletException("LoginFilter just supports HTTP requests");
		}
		HttpServletRequest servletRequest = (HttpServletRequest) request;
		HttpServletResponse servletResponse = (HttpServletResponse) response;
		HttpSession session = servletRequest.getSession();
		String uri = servletRequest.getRequestURI();
		logger.debug("uri:" + uri);
		// 1、规则判断,是否拦截
		for (String endWith : endWithAtt) {
			if (uri.endsWith(endWith)) {
				chain.doFilter(servletRequest, servletResponse);
				return;
			}
		}
		for (String c : containsAtt) {
			if (uri.contains(c)) {
				// 此处添加访问记录
//				JResumeAccessQueue.add(session, uri);
				chain.doFilter(servletRequest, servletResponse);
				return;
			}
		}
		for (String nc : notContainsAtt) {
			if (!uri.contains(nc)) {
				chain.doFilter(servletRequest, servletResponse);
				return;
			}
		}
		// 以上规则都未通过,则该请求被拦截,需要登陆后才能请求
		// 2、判断是否已经登陆(2与1顺序可以互换。)
		logger.debug("jgName:" + session.getAttribute(JConstant.NAME));
		if (session.getAttribute(JConstant.NAME) != null) {
			chain.doFilter(servletRequest, servletResponse);
			return;
		}
		// 未登录则跳转到登陆页面
		servletResponse.sendRedirect(loginHtml);
	}

	@Override
	public void destroy() {

	}

}

2.添加@Configuration和@Bean,注册这个LoginFilter。

java 复制代码
package xyz.jangle.springboot.demo_war.filter;

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<LoginFilter> myFilterRegistration() {
	    FilterRegistrationBean<LoginFilter> registration = new FilterRegistrationBean<>();
	    registration.setFilter(new LoginFilter());
	    
	    // 添加单个初始化参数
	    registration.addInitParameter("endWith", "login.html,.js,.css,.jpg,.png,selectByPrimaryKey.ctrl,/bsUserCtrl/insert.ctrl,bsUserAdd.jsp");
	    registration.addInitParameter("contains", "cjmm");
	    registration.addInitParameter("notContains", ".");
	    
	    registration.addUrlPatterns("/*");
	    registration.setOrder(1);
	    return registration;
	}
	
}

注意:filter包要建在Application.java所在包的下级。

相关推荐
Java内核笔记6 小时前
同一份知识库,4 种切分 × 3 种召回,纯关键词比纯向量高 13 个点
java·人工智能·spring boot
学长毕设8 小时前
基于springboot的社会志愿者管理系统-附源码
java·spring boot·后端
计算机编程-吉哥9 小时前
计算机毕业设计 基于 SpringBoot + Vue 的剧本杀系统 Java毕业设计【任务书、开题报告、中期报告、论文、源码】
java·vue.js·spring boot·毕业设计·课程设计·计算机毕业设计选题
这里是杨杨吖9 小时前
SpringCloud+Vue民宿房屋租赁系统 附带详细运行指导视频
vue.js·spring boot·spring cloud·房屋·民宿租赁
RuoyiOffice9 小时前
SpringBoot OA推荐:面向信创选型,看看这套企业协同平台
spring boot·vue3·信创·flowable·企业协同·ruoyi office·oa选型
jianxuan9 小时前
Spring Boot + Maven 接入 Allatori:从普通打包到可选混淆发布
spring boot·python·maven
RuoyiOffice11 小时前
llama.cpp + SpringBoot3:本地部署 Qwen3.8,接入 AgentOS 企业办公智能体
spring boot·springboot3·llama.cpp·spring ai·qwen3.8·agentos
学长毕设20 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
学长毕设1 天前
基于SpringBoot的建筑材料管理系统-附源码
java·spring boot·后端