首页 > 其他分享 >自定义过滤器写法示例

自定义过滤器写法示例

时间:2023-07-27 10:11:37浏览次数:54  
标签:httpServletRequest String 自定义 示例 private jwtToken ALLOWED 过滤器 response

点击查看代码
@Component
@Slf4j
@RequiredArgsConstructor
public class CustomFilter extends OncePerRequestFilter {

    private final ObjectMapper objectMapper;

    /**
     * 指定要放行的接口路径
     */
    private static final String[] ALLOWED_PATHS = {
            "/a/b",
            "/a/c"
    };

    /**
     * 需要放行的接口层
     */
    private static final String[] ALLOWED_CONTROLLER = {
            "/b",
            "/c"
    };

    @Override
    protected void doFilterInternal(@NotNull HttpServletRequest httpServletRequest, @NotNull HttpServletResponse httpServletResponse, @NotNull FilterChain filterChain) throws ServletException, IOException {
        String path = httpServletRequest.getRequestURI().substring(httpServletRequest.getContextPath().length()).replaceAll("/+$", "");
        // 属于指定的放行路径吗
        boolean a = Arrays.asList(ALLOWED_PATHS).contains(path);
        // 属于指定的接口层吗
        boolean b = Arrays.stream(ALLOWED_CONTROLLER).anyMatch(path::startsWith);
        if (!a && !b) {
            // 不属于,需要进行鉴权
            String ipAddress = TokenDomain.getCurrentIpAddress();
            try {
                TokenDomain.verifyToken();
            } catch (Exception e) {
                // 日志输出非法请求ip
                log.error(String.format("IP地址【%s】发起了非法请求", ipAddress), e);
                // 提示View
                warning(httpServletResponse);
                // 停止执行后续过滤器和控制器方法
                return;
            }
        }
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }

    /**
     * 提示访问者,请求失败的原因
     */
    private void warning(ServletResponse response) throws IOException {
        // 设置响应类型
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        // 设置字符集
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());
        // 失败响应对象
        Response<String> no = Response.fail(HttpStatus.FORBIDDEN.value(), "身份认证失败,请登录");
        // 转json
        String errorJson = objectMapper.writeValueAsString(no);
        // 写入ServletResponse
        response.getWriter().write(errorJson);
    }

}

此过滤器适用于接入其他系统登录的jwtToken校验,不同系统对于jwtToken的生成方式不同,因此校验实现也有差异,获取jwtToken和解析jwtToken的具体代码贴出来也就没有实际意义了

点击查看代码
public static void verifyToken() {
        String token = getToken();
        // 缺失令牌
        Assert.notNull(token, "缺失令牌");
        Claims claims = parse(token);
        // 令牌过期
        Assert.isTrue(claims.getExpiration().after(new Date()), "令牌过期");
}

标签:httpServletRequest,String,自定义,示例,private,jwtToken,ALLOWED,过滤器,response
From: https://www.cnblogs.com/ashet/p/17584195.html

相关文章

  • vue--day46---组件自定义事件的解绑
    查看vue版本命令npmlistvue1.App.vue<template><div><h1>{{msg}}</h1><!--通过父组件给子组件传递函数的props实现子给父传数据--><School:receiveSchoolName="receiveSchoolName"></School><!--v-on在student组件标签上所以说是在给......
  • 问题--如何自定义化新标签页?
    1.问题平时的新标签页过于单调,且不好使用,问题如题所示2.解决方式使用扩展InfinityNewTab,这是Google的一款扩展软件安装路径:https://chrome.google.com/webstore/detail/infinity-new-tab/dbfmnekepjoapopniengjbcpnbljalfg/related可以自由的设计自己的新标签页如图所示......
  • Go语言网络编程示例
    1.简单示例以下是一个使用Go语言标准库net实现的简单的客户端和服务器端示例。服务器端监听本地的8080端口,并在接收到客户端连接后,向客户端发送一条欢迎消息。客户端通过Dial方法连接服务器,并接收服务器发送的欢迎消息。服务器端代码:packagemainimport("......
  • 关于context的用法示例
    1.示例代码ser=self.get_serializer(context={'request':request},data=request.data)以上代码使用了context的方法将request传入到序列化类中 2.另一种写法ser=self.get_serializer(data=request.data)ser.aaa=request 这样也可以向序列化类传入request,如果序列化类......
  • 浅谈Excel开发:六 Excel 异步自定义函数
    上文介绍了Excel中的自定义函数(UDF),它极大地扩展了Excel插件的功能,使得我们可以将业务逻辑以Excel函数的形式表示,并可以根据这些细粒度的自定义函数,构建各种复杂的分析报表。普通的UDF自定义函数的基本执行逻辑是,Excel接受用户输入的函数表达式,然后通过UDF函数的处理逻辑进行处......
  • 浅谈Excel开发:七 Excel 自定义任务窗体
    前面花了三篇文章讲解了Excel中的UDF函数,RTD函数和异步UDF函数,这些都是Excel开发中的重中之重。本文现在开始接着第二篇文章的菜单系统开始讲解Excel中可供开发的界面元素,本文要讲解的是Excel中的自定义任务面板(CustomeTaskPanel,CTP)。自定义任务面板在Office2003中就引入了......
  • 使用JMeter连接达梦数据库的步骤和示例
    引言:本文将介绍如何使用JMeter连接达梦数据库,并提供连接达梦数据库的步骤和示例,帮助您快速开始进行数据库性能测试。步骤:1.下载并安装JMeter:首先,从JMeter官方网站下载并安装最新版本的JMeter。2.添加JDBC驱动:下载并添加达梦数据库的JDBC驱动jar文件到JMeter的lib目录下,例如`......
  • kendo的下拉框树示例
    kendo的下拉框树示例后台代码:publicstaticstringGetTreeJson_kendo(List<Category>list){List<TreeNode_kendo>list_return=newList<TreeNode_kendo>();vartop=list.Where(a=>a.P......
  • 视频直播系统源码,vue自定义模拟滚动条
    视频直播系统源码,vue自定义模拟滚动条vscroll自定义滚动条模板 <template> <divclass="vui__scrollbar"ref="ref__box"@mouseenter="handleMouseEnter"@mouseleave="handleMouseLeave"v-resize="handleResize">  <div:......
  • 01-[Linux][GPIO]GPIO编程示例代码
    基于MTK平台的AndroidLinux驱动1、DTS配置如下gpio_sample:gpio_sample{compatible="mediatek,gpio-sample";input,high-gpio=<&pio77GPIO_ACTIVE_HIGH>;input,low-gpio=<&pio70GPIO_ACTIVE_HIGH>;out......