day21_filter过滤器

day21_filter过滤器

1过滤器机制介绍

image-20250821101706809

    /**
	 * 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();
            }
        }


    }
}

posted @ 2025-09-27 21:43  小胡coding  阅读(10)  评论(0)    收藏  举报