day21_filter过滤器
day21_filter过滤器
1过滤器机制介绍

/**
* 1 如果请求地址相同 可以filter优先于servlet执行
* 2 过滤器可以配置请求地址相同 配置成多层过滤
* 如果请求地址相同 有默认的调用链(谁先运行 谁后运行)规则
* 先过滤器 过滤器之间 根据java虚拟机的加载顺序决定
* 注解 包名+类名顺序 一般是升序
* 某些包名降序 使用注解时 测试一下加载顺序
* 配置文件
* 配置的filter的先后顺序
* 再servlet
* 3 经常需要搭配请求配置的*使用
* 1 通过统一的前缀 进行触发
* /serv/users/* 过滤器 /serv/*
/serv/menus/*
*
* 2 全局触发
/* 所有请求都会进入
通过白名单 放行 特殊的服务功能 静态资源也都会先走过滤器 html css js 图片 ......
配置 白名单 允许列表
黑名单 阻止列表
**/
package com.javasm.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* @className: FilterDemo1
* @description:
* @author: gfs
* @date: 2025/8/21 9:37
* @version: 0.1
* @since: jdk17
*/
@WebFilter("/*")
public class FilterDemo1 implements Filter {
/*
* 1 如果请求地址相同 可以filter优先于servlet执行
* 2 过滤器可以配置请求地址相同 配置成多层过滤
* 如果请求地址相同 有默认的调用链(谁先运行 谁后运行)规则
* 先过滤器 过滤器之间 根据java虚拟机的加载顺序决定
* 注解 包名+类名顺序 一般是升序
* 某些包名降序 使用注解时 测试一下加载顺序
* 配置文件
* 配置的filter的先后顺序
* 再servlet
* 3 经常需要搭配请求配置的*使用
* 1 通过统一的前缀 进行触发
* /serv/users/* 过滤器 /serv/*
/serv/menus/*
*
* 2 全局触发
/* 所有请求都会进入
通过白名单 放行 特殊的服务功能 静态资源也都会先走过滤器 html css js 图片 ......
配置 白名单 允许列表
黑名单 阻止列表
*
* */
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1.......");
filterChain.doFilter(request,response);
}
}
注意:过滤器也是通过请求地址触发
主要用来编写servlet中的公共代码 用过滤器编写 可以与servlet中的业务场景代码分离开 方便代码后期维护更新
2过滤器使用场景
1公共参数设置
参数过滤器+跨域过滤器
package com.javasm.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @className: MyFilter1
* @description:
* @author: gfs
* @date: 2025/8/21 10:33
* @version: 0.1
* @since: jdk17
*/
@WebFilter("/*")
public class MyFilter1 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;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//请求参数配置
request.setCharacterEncoding("utf-8");
//跨域的响应头
response.setHeader("Access-Control-Allow-Origin", "http://localhost:5173");
/* 允许跨域的请求⽅法GET, POST, HEAD 等*/
response.setHeader("Access-Control-Allow-Methods", "*");
/* 重新预检验跨域的缓存时间(s) */
response.setHeader("Access-Control-Max-Age", "3600");
/* 允许跨域的请求头*/
response.setHeader("Access-Control-Allow-Headers", "*");
/* 是否携带cookie */
response.setHeader("Access-Control-Allow-Credentials", "true");
filterChain.doFilter(servletRequest,servletResponse);
}
}
2访问控制
登录访问控制
后端增加访问控制过滤器
package com.javasm.filter;
import com.alibaba.fastjson.JSON;
import com.javasm.entity.AdminUser;
import com.javasm.entity.Result;
import com.javasm.entity.ReturnCode;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @className: MyFilter2
* @description:
* @author: gfs
* @date: 2025/8/21 10:43
* @version: 0.1
* @since: jdk17
*/
@WebFilter("/*")
public class MyFilter2 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;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//请求时查票
HttpSession session = request.getSession();
AdminUser loginUser =(AdminUser) session.getAttribute("loginUser");
String requestURI = request.getRequestURI();
String servletPath = request.getServletPath();
//System.out.println(requestURI);
//System.out.println(servletPath);
//配置白名单 特权服务和文件 直接放行
if("/login".equals(servletPath)||servletPath.endsWith(".jpg")||servletPath.endsWith(".png")||servletPath.endsWith(".gif")||servletPath.endsWith(".mp4")){
filterChain.doFilter(request,response);
}else{
if(loginUser!=null){
filterChain.doFilter(request,response);
}else{
//把没有登录的响应 返回
Result result = new Result(ReturnCode.LOGIN_NOT_LOGIN.getCode(),ReturnCode.LOGIN_NOT_LOGIN.getMsg());
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print(JSON.toJSONString(result));
writer.close();
}
}
}
}
前端 配置响应拦截器 处理未登录响应
import axios from 'axios'
import router from '../router'
//固定url前缀
axios.defaults.baseURL = 'http://localhost:8080/baseProj/';
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
//请求时 允许发送cookie 有cookie 后端session才能正常使用和记录
axios.defaults.withCredentials = true
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 2xx 范围内的状态码都会触发该函数。
// 对响应数据做点什么
//如果没有登录 跳转到登录页面
if(response.data.code == 10050){
router.push("/login")
}
//如果不是 10050 让请求继续处理
return response;
}, function (error) {
// 超出 2xx 范围的状态码都会触发该函数。
// 对响应错误做点什么
return Promise.reject(error);
});
const myPost = (url,params)=>{
return axios({
method: 'post',
url: url,
data: params
});
}
const myGet = (url,params)=>{
return axios({
method: 'post',
url: url,
params: params
});
}
export {myGet,myPost}
配合登出功能
const logout = ()=>{
myGet("/logout",{})
.then(resp=>{
ElMessage.success(resp.data.msg)
router.push('/login')
})
}
模块访问控制
动态菜单 界面限制模块访问
模块访问控制过滤器
package com.javasm.filter;
import com.alibaba.fastjson.JSON;
import com.javasm.entity.Result;
import com.javasm.entity.ReturnCode;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
/**
* @className: MyFilter3
* @description:
* @author: gfs
* @date: 2025/8/21 11:43
* @version: 0.1
* @since: jdk17
*/
@WebFilter("/*")
public class MyFilter3 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;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//当次访问的模块路径
String servletPath = request.getServletPath();
HttpSession session = request.getSession();
//当前用户可访问的模块路径集合
List<String> listUrl =(List<String>) session.getAttribute("listUrl");
//系统中 默认每个用户都有的功能路径 要进白名单
if("/login".equals(servletPath)||"/logout".equals(servletPath)||servletPath.endsWith(".jpg")||servletPath.endsWith(".png")||servletPath.endsWith(".gif")||servletPath.endsWith(".mp4")){
filterChain.doFilter(request,response);
}else{
//判断路径 是否在允许路径集合中
if(listUrl.contains(servletPath)){
filterChain.doFilter(request,response);
}else{
//把没有登录的响应 返回
Result result = new Result(ReturnCode.LOGIN_NO_POMISSION.getCode(),ReturnCode.LOGIN_NO_POMISSION.getMsg());
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print(JSON.toJSONString(result));
writer.close();
}
}
}
}

浙公网安备 33010602011771号