精华内容
下载资源
问答
  • java过滤器全局解析token
    千次阅读
    2020-05-23 16:53:34

    java过滤器全局解析token

    使用过滤器定义一个全局的token解析器

    在进行后端接口的开发过程中,一般涉及到人员用户,权限或者安全方面的考虑接口都会使用token来传递用户或者一些安全系数高的鉴权参数等。

    一般接口定义

    全局AOP解析

    使用AOP,对需要获取token信息的接口,进行方法增强,在进入controller之前,动态的为接口方法鉴权,或者为接口方法添加一个token相关的参数。
    根据需求不同需要的参数也不一样,这个可以根据业务来,这方面代码也很多,原理就是在方法执行前,进行token鉴权,或者参数添加或提取。如果业务比较复杂,可以自己展开想象,自己动手搞。

    接口使用注解@RequestHeader

    另一种方法是,每个接口自己去处理token的鉴权或者参数提取,在请求参数中声明一个从header里面获取的值,然后方法内部去解析

    
    @GetMapping("legend")
    public Response getTheShy(@RequestHeader String token, @RequestParam() String top){
        //解析token鉴权。。
        //业务
    	return null;
    }
    
    

    如果你不怕麻烦,或者只有很少的接口需要token这个方法可以考虑,对于微服务来说,token的鉴权可能是单独的一个服务,或者需要调用其他方法,把这个方法封装起来,其实也还好。

    我的需求以及方法

    需求和现状

    1. 业务几乎每个对外的而接口都需要用户的信息,比如用户ID或者用户名称
    2. 解析和分发token的业务不是我的模块,我获得到的token是由网关分发到后台程序的token,解析需要依赖网关的服务
    3. 我只需要token解析出来的用户某个信息
    4. 我不想每个接口都去关心token是怎么解析的,怎么获取参数的

    实践

    使用过滤器来控制请求参数的获取,控制请求参数的值

    1. 控制层代码
      具体代码:
      controller:
        @GetMapping("top")
        public Response  getTheShy(String token){
       
          log.info(token);    
          return topService.getTheShy(token);
        }
    

    在控制层接口中我直接声明我需要的而用户信息,即需要从token中解析的数据

    1. 过滤器代码

    具体代码:

    @Component
    @WebFilter(filterName="token",urlPatterns= {"/*"})
    public class FilterConfigController implements Filter {
    
    
        private static Logger log = LoggerFactory.getLogger(FilterConfigController.class);
    
        @Override
        public void init(FilterConfig filterConfig) {
            log.info("过滤器初始化");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) servletRequest){
    
                @Override
                public Map<String, String[]> getParameterMap() {
                    return super.getParameterMap();
                }
    
                @Override
                public String getParameter(String name) {
                    return super.getParameter(name);
                }
    
                @Override
                public String[] getParameterValues(String name) {
                    if("token".equals(name) || "userId".equals(name)){
                        String token = this.getHeader("Token");
                        //鉴权或者获取token
                        if (StringUtils.isEmpty(token)){
                            log.error("缺少token");
                            throw new MyRuntimeException(ErrorCode.ERROR_AUTH_NULL_TOKEN);
                        }
                        if ("token".equals(name)){
                            //具体的解析token逻辑
                        }else if ("userId".equals(name)){
                            //具体的解析token逻辑
                        }
                        
                        return new String[]{token};
                    }
                    return super.getParameterValues(name);
                }
    
                @Override
                public String getQueryString() {
                    return super.getQueryString();
                }
            };
            filterChain.doFilter(requestWrapper,servletResponse);
    
        }
    
    
    }
    
    1. 继承Filter,并实现其方法,主要对 doFilter方法中的getParameterValues方法重写
    2. 该方法的作用就是,如果你得controller需要一个参数值时,会从这里获取,所以我们可以对此进行自定义的参数获取。
    3. 规定好我们要获取的参数名称,可以叫做token,然后这边对这个参数名进行拦截,当需要获取我们指定参数名称的值时,由下面代码生成
    4. 下面的代码就是从请求头获取token,然后鉴权和获取用户信息的具体实现
    5. 如果请求头的token不满足我们的需求,或者解析失败,就可以直接返回前端,而不用进入controller
      6.我采用的直接返回前端的方法是,直接在过滤器中抛出一个自定义的运行时异常(此方法不允许有异常,只能抛运行时异常)
    6. 由全局的异常处理,来处理抛出的自定义运行时异常,并返回给前端
    
    /**
         * 处理运行时异常
         * @param e
         * @return
         */
        @ExceptionHandler
        public Response runtimeExceptionMatchHandle(RuntimeException e, HttpServletResponse response){
    
            if (e instanceof MyRuntimeException){
                e.printStackTrace();
                return Response.failure(((MyRuntimeException) e).getCode());
            }
            return Response.failure(ErrorCode.ERROR);
        }
    

    自定义异常,抛出的时候也把要返回的信息返回

    
    /**
     * 自定义运行时异常
     */
    public class MyRuntimeException extends RuntimeException{
    
        private ErrorCode code;
        public MyRuntimeException(ErrorCode code){
            super(code.getMsg());
            this.code = code;
        }
    
        public ErrorCode getCode() {
            return code;
        }
    }
    

    注意点

    1. 如果在controller的参数上加了@RequestParam注解,那么在获取这个参数值的时候不会进入到过滤器的方法中

      1. 在其他不需要进入自定义过滤的而参数加上注解,不加也可以,只要名称不一样就不会往下走
      2. 要获取的token相关参数,不要加此注解
    2. 自定义的过滤器可以多个参数获取只需要在入口处,多加一个参数名称判断,且在返回参数值的时候,根据名称不同返回不同的值即可

    如果有问题,欢迎指正,不明白的话可以私信博主

    更多相关内容
  • 下面小编就为大家带来一篇java 过滤器filter防sql注入的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • JAVA过滤器及原理

    2018-11-25 19:42:00
    JAVA过滤器,原理介绍,基本Demo,里面有图文教程,有源码分析,有代码Demo,欢迎大家下载学习,讨论
  • sql注入Java过滤器

    2017-11-10 13:21:37
    配置在web.xml中,可以防止SQL注入,可以自己定义一些需要过滤的特殊字符
  • java过滤器

    千次阅读 2021-03-05 19:13:38
    过滤器就是在源数据和目的数据之间起过滤作用的中间件。Web应用中,在处理请求时,经常有一些公共的工作,比如...开发一个过滤器必须实现Java定义好的javax.servlet.Filter接口:这一接口含有三个过滤器必须执行的...

    过滤器就是在源数据和目的数据之间起过滤作用的中间件。

    Web应用中,在处理请求时,经常有一些公共的工作,比如设置字符集。这样的工作需要写在每个页面,这样的写法费力且不好修改。使用过滤器就像在这些流程前加了一道拦,将需要进行的操作放到拦里执行,而所有经过这道拦的流程都会“被”执行该操作。

    开发一个过滤器必须实现Java定义好的javax.servlet.Filter接口:

    这一接口含有三个过滤器必须执行的方法:

    doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。这同样是上游过滤器调用的方法。引入的FilterChain对象提供了后续过滤器所要调用的信息。如果该过滤器是过滤器链中的最后一个过滤器,则将请求交给被请求资源。也可以直接给客户端返回响应信息。

    init(FilterConfig):由Web容器来调用完成过滤器的初始化工作。它保证了在第一次doFilter()调用前由容器调用。您能获取在 web.xml 文件中指定的初始化参数。

    destroy():由Web容器来调用来释放资源,doFilter()中的所有活动都被该实例终止后,调用该方法。

    public class TestFilter implements Filter {

    public void init(FilterConfig arg0) throws ServletException {

    }

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response,

    FilterChain chain) throws IOException, ServletException {

    }

    }

    过滤器开发完成后还需要在web.xml中进行配置。

    代码演示:web.xml 中加入Filter配置

    TestFilter

    com.wh.filter. TestFilter

    characterEncoding

    UTF-8

    TestFilter

    /*

    解析:

    节点描述该Filter对应的类是哪一个。写明具体路径

    中的必须和节点中的值相同,

    是Filter的参数。获取该参数的方式为:

    public void init(FilterConfig filterConfig) throws ServletException {

    characterEncoding = filterConfig.getInitParameter("characterEncoding");

    }

    指定改过滤器关联的URL样式。

    url-pattern主要有四种匹配方式

    (a)精确匹配,就是填写jap或Servlet等需要过滤的请求的具体地址,例如:/Filter/TestFilter

    (b)扩展匹配,由“*”号和扩展名组成,例如*.jsp

    (c)路径前缀匹配,包含一个目录和一个/*   例如:/Servlet/*指的是对Servlet目录下的所有资源进行过滤

    (d)全部匹配,使用/*,指的是对所以资源都过滤

    Filter流程总述:

    请求发起时,Web容器先判断是否存在过滤器和这个请求的资源相关,如果有存在关联就把请求交给过滤器去处理,在过滤器中可以对请求的内容做出改变,然后再将请求转交给被请求的资源。当被请求的资源做出响应时,Web容器同样会将响应先转发给过滤器,在过滤器中可以对响应做出处理然后再将响应发送给客户端。在这整个过程中客户端和目标资源是不知道过滤器的存在的。

    过滤器对请求做了两次(对request和response)过滤,其实Filter是对请求中的Request和Response进行了拦截。拦截到了进行处理,处理完后再返回到其原来的调用流程上去。这点体现了责任链模式。

    在一个Web应用程序中可以配置多个过滤器,从而形成过滤器链。

    在请求资源时,过滤器链中的过滤器依次对请求作出处理。在接受到响应时再按照相反的顺序对响应作出处理。

    0_1331029576R420.gif

    多个过滤器的执行顺序是按照web.xml中filter的配置的上下顺序来决定的。

    使用Filter的好处:

    在Filter执行的整个过程中客户端和目标资源是不知道过滤器的存在的。Filter提供的是一种声明式的服务,即在不用在原程序上做任何修改,只需要编写Filter,原程序想用Filter,只需要在XML文件中声明一下即可。他具有可插拔的能力,用的时候配上web.XML,不用的时候只需要修改web.xml,对整个系统没有影响,这种声明式的服务非常方便,也非常强大。

    其次,使用Filter进行控制业务也非常方便,比如验证用户是否登录,是否有操作权限,判断Session,字符集等,放到Filter里,可以省去大量重复的代码和繁琐的控制。

    在WEB开发中常见的应用过滤器的地方:

    1、      对用户请求进行统一认证,权限管理

    2、      对用户的访问请求进行记录和审核

    3、      对用户发送的数据进行过滤和替换

    4、      转换图像格式

    5、      对响应的内容进行压缩,减少传输量

    6、      对请求和相应进行加密处理

    最后需要注意的是Filter技术只对Post请求起作用。

    展开全文
  • 对项目中的所有参数去除前后空格...可以基于此过滤器实现过滤跨站脚本攻击,参数的增加,修改!敏感词汇过滤。实现原理为重写HttpServletRequestWrapper,获取参数的方法。include和 Forwarded 内部转发不在过滤之内。
  • 主要介绍了java 过滤器模式(Filter/Criteria Pattern)详细介绍的相关资料,需要的朋友可以参考下
  • java过滤器,XSS : 跨站脚本攻击(Cross Site Scripting),SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
  • java过滤器防sql注入

    2014-04-04 11:23:03
    外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免!...外网可能会被攻击,简单的处理可以避免!...
  • 下面小编就为大家分享一篇Java实现简单文件过滤器功能,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • java 过滤器

    2012-12-15 15:00:56
    java 过滤器
  • Filter也称之为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。下面我们来简单学习一下吧
  • java过滤器和验证码

    2018-08-27 09:24:42
    java过滤器和验证码
  • java过滤器怎么写

    2021-02-26 12:07:08
    1.java过滤器中实现Filter的类怎么写web.xml配置文件SessionFiltercom.qhit.system.tools.SessionFilterSessionFilter/*java类public class ConnFilter extends HttpServlet implements Filter {public void ...

    1.java过滤器中实现Filter的类怎么写

    web.xml配置文件

    SessionFilter

    com.qhit.system.tools.SessionFilter

    SessionFilter

    /*

    java类

    public class ConnFilter extends HttpServlet implements Filter {

    public void doFilter(ServletRequest request,ServletResponse response,

    FilterChain filterchain) throws IOException,ServletException

    {

    try

    {

    filterchain.doFilter(request,response);此处为过滤链 理解为请求通过该过滤继续前行 可在此处加上判断 如果TRUE执行该语句 有过FALSE 则直接跳转其他页面 常用于判断是否有权限进入某页面

    }

    finally

    {

    DBUtils.close();

    }

    }

    2.java如何创建过滤器

    弄过滤器,要实现filter接口,下面我写一个小例子

    主要是用过滤器处理中文编码,至于你要用来做什么,你再自己写。。。比如权限控制,登录验证,之类

    //下面这是一个类。

    import java.io.IOException;

    import javax.servlet.Filter;

    import javax.servlet.FilterChain;

    import javax.servlet.FilterConfig;

    import javax.servlet.ServletException;

    import javax.servlet.ServletRequest;

    import javax.servlet.ServletResponse;

    import javax.servlet..temp.filter.EncodingFilter

    encoding

    *.jsp这个是以jsp为后缀的文件都拦截下来

    可以写多个的

    恩,有点唠叨,希望可以帮助到你

    3.java如何创建过滤器

    弄过滤器,要实现filter接口

    主要是用过滤器处理中文编码,至于要用来做什么,再自己写比如权限控制,登录验证,之类

    //下面这是一个类。

    import java.io.IOException;

    import javax.servlet.Filter;

    import javax.servlet.FilterChain;

    import javax.servlet.FilterConfig;

    import javax.servlet.ServletException;

    import javax.servlet.ServletRequest;

    import javax.servlet.ServletResponse;

    import javax.servlet..temp.filter.EncodingFilter

    encoding*.jsp这个是以jsp为后缀的文件都拦截下来

    可以写多个的来配置你所要拦截的东西

    4.java过滤器中实现Filter的类怎么写

    web.xml配置文件SessionFiltercom.qhit.system.tools./*java类 public class ConnFilter extends HttpServlet implements Filter {public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterchain) throws IOException,ServletException{try{filterchain.doFilter(request,response);此处为过滤链 理解为请求通过该过滤继续前行 可在此处加上判断 如果TRUE执行该语句 有过FALSE 则直接跳转其他页面 常用于判断是否有权限进入某页面 }finally{DBUtils.close();}}。

    5.java过滤器怎么写 用的是SSH框架 主要目的是防止有些比如登录不填

    在web.xml中配置过滤器

    encoding

    encoding

    utf-8

    encoding

    6b7f7c87176cf107

    展开全文
  • java过滤器有什么作用

    千次阅读 2021-03-09 22:09:38
    Java过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器可以对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改;也可以对响应进行过滤,拦截或修改响应。Java...

    Java过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器可以对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改;也可以对响应进行过滤,拦截或修改响应。

    7542244033628e335c2640d9b98bb0d1.png

    Java中过滤器也是常用的部分,用于限制某些东西,下面来让我们了解一下吧。

    过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

    7336797d113c725eba9ca8b2c402bc22.png如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

    在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:

    0d0be1074803609b95bd864e56fcfbf0.png

    过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。

    展开全文
  • 本文通过代码分析和文字说明的方式给大家浅析JAVA过滤器、监听器、拦截器的区别,感兴趣的朋友一起看下吧
  • 主要是几种过滤器的使用方法。过滤器的主要几种用途。
  • 主要介绍了Java过滤器filter,通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出
  • JAVA过滤器

    千次阅读 2018-08-16 10:27:26
    过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理 作用: 代码的抽取(可以对request设置编码,这样所有走过的...
  • Java过滤器的开源集合,用于创建,合并和验证XLIFF 1.2和2.0文件。 使用OpenXLIFF过滤器,您可以创建不使用专有标记并且与大多数CAT(计算机辅助翻译)工具兼容的XLIFF文件。 XLIFFChecker (一种开源XLIFF验证工具...
  • 南昌大学实验报告 学生姓名 张 志 煋 学 号 7101011001 专业班级 网工121班 实验类型 验证 综合 设计 创新 实验日期 2015-4-29 实验成绩 一实验项目名称 Filter 过滤器习题项目 二实验目的 掌握过滤器的基本原理熟悉...
  • Java过滤器及其特性

    2017-08-12 17:27:37
    Java过滤器
  • JAVA过滤器标准代码

    2008-11-05 08:32:33
    关于JAVA过滤器的编写,和一些要求!代码精简,方便使用
  • Java请求跨域处理过滤器
  • 六个有用的java过滤器

    2012-08-11 13:49:14
    六个有用的java过滤器,包括使浏览器不缓存页面的过滤器、检测用户是否登陆的过滤器、字符编码的过滤器、资源保护过滤器、利用Filter限制用户浏览权限、利用Filter过滤非法关键字。
  • JAVA过滤器 过滤器

    2009-08-25 18:28:32
    JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器
  • Java过滤器解决跨域问题

    千次阅读 2020-05-30 10:44:27
    Java后端解决跨域问题 代码: import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CORSFilter implements Filter{ @Override public void ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 390,267
精华内容 156,106
关键字:

java过滤器

java 订阅
友情链接: templatldustrqctor.rar