-
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的鉴权可能是单独的一个服务,或者需要调用其他方法,把这个方法封装起来,其实也还好。
我的需求以及方法
需求和现状
- 业务几乎每个对外的而接口都需要用户的信息,比如用户ID或者用户名称
- 解析和分发token的业务不是我的模块,我获得到的token是由网关分发到后台程序的token,解析需要依赖网关的服务
- 我只需要token解析出来的用户某个信息
- 我不想每个接口都去关心token是怎么解析的,怎么获取参数的
实践
使用过滤器来控制请求参数的获取,控制请求参数的值
- 控制层代码
具体代码:
controller:
@GetMapping("top") public Response getTheShy(String token){ log.info(token); return topService.getTheShy(token); }
在控制层接口中我直接声明我需要的而用户信息,即需要从token中解析的数据
- 过滤器代码
具体代码:
@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); } }
- 继承Filter,并实现其方法,主要对 doFilter方法中的getParameterValues方法重写
- 该方法的作用就是,如果你得controller需要一个参数值时,会从这里获取,所以我们可以对此进行自定义的参数获取。
- 规定好我们要获取的参数名称,可以叫做token,然后这边对这个参数名进行拦截,当需要获取我们指定参数名称的值时,由下面代码生成
- 下面的代码就是从请求头获取token,然后鉴权和获取用户信息的具体实现
- 如果请求头的token不满足我们的需求,或者解析失败,就可以直接返回前端,而不用进入controller
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; } }
注意点
-
如果在controller的参数上加了@RequestParam注解,那么在获取这个参数值的时候不会进入到过滤器的方法中
- 在其他不需要进入自定义过滤的而参数加上注解,不加也可以,只要名称不一样就不会往下走
- 要获取的token相关参数,不要加此注解
-
自定义的过滤器可以多个参数获取只需要在入口处,多加一个参数名称判断,且在返回参数值的时候,根据名称不同返回不同的值即可
如果有问题,欢迎指正,不明白的话可以私信博主
更多相关内容 -
java 过滤器filter防sql注入的实现代码
2020-09-01 18:48:00下面小编就为大家带来一篇java 过滤器filter防sql注入的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
JAVA过滤器及原理
2018-11-25 19:42:00JAVA过滤器,原理介绍,基本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应用程序中可以配置多个过滤器,从而形成过滤器链。
在请求资源时,过滤器链中的过滤器依次对请求作出处理。在接受到响应时再按照相反的顺序对响应作出处理。
多个过滤器的执行顺序是按照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请求起作用。
-
java过滤器对所有参数去除前后空格
2018-06-20 15:39:06对项目中的所有参数去除前后空格...可以基于此过滤器实现过滤跨站脚本攻击,参数的增加,修改!敏感词汇过滤。实现原理为重写HttpServletRequestWrapper,获取参数的方法。include和 Forwarded 内部转发不在过滤之内。 -
java 过滤器模式(Filter/Criteria Pattern)详细介绍
2020-09-01 12:14:47主要介绍了java 过滤器模式(Filter/Criteria Pattern)详细介绍的相关资料,需要的朋友可以参考下 -
java过滤器,防止XSS、SQL
2019-01-08 11:04:57java过滤器,XSS : 跨站脚本攻击(Cross Site Scripting),SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令 -
java过滤器防sql注入
2014-04-04 11:23:03外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免!...外网可能会被攻击,简单的处理可以避免!... -
Java实现简单文件过滤器功能
2020-08-28 09:08:52下面小编就为大家分享一篇Java实现简单文件过滤器功能,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
java 过滤器
2012-12-15 15:00:56java 过滤器 -
深入了解Java中的Filter过滤器
2020-08-25 23:37:25Filter也称之为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。下面我们来简单学习一下吧 -
java过滤器和验证码
2018-08-27 09:24:42java过滤器和验证码 -
java过滤器怎么写
2021-02-26 12:07:081.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
-
java过滤器有什么作用
2021-03-09 22:09:38Java过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器可以对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改;也可以对响应进行过滤,拦截或修改响应。Java...Java过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器可以对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改;也可以对响应进行过滤,拦截或修改响应。
Java中过滤器也是常用的部分,用于限制某些东西,下面来让我们了解一下吧。
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。
在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:
过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。
-
浅析JAVA中过滤器、监听器、拦截器的区别
2020-09-03 08:05:10本文通过代码分析和文字说明的方式给大家浅析JAVA中过滤器、监听器、拦截器的区别,感兴趣的朋友一起看下吧 -
filter的使用 java 过滤器的几种使用方法
2012-12-21 16:22:36主要是几种过滤器的使用方法。过滤器的主要几种用途。 -
Java过滤器filter_动力节点Java学院整理
2020-08-29 21:48:15主要介绍了Java过滤器filter,通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出 -
JAVA过滤器
2018-08-16 10:27:26过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理 作用: 代码的抽取(可以对request设置编码,这样所有走过的... -
java打开源码文件-OpenXLIFF:Java过滤器的开源集合,用于创建,合并和验证XLIFF1.2和2.0文件
2021-05-19 23:20:24Java过滤器的开源集合,用于创建,合并和验证XLIFF 1.2和2.0文件。 使用OpenXLIFF过滤器,您可以创建不使用专有标记并且与大多数CAT(计算机辅助翻译)工具兼容的XLIFF文件。 XLIFFChecker (一种开源XLIFF验证工具... -
JAVA WEB 过滤器实验报告_java实验报告四
2020-06-17 10:03:22南昌大学实验报告 学生姓名 张 志 煋 学 号 7101011001 专业班级 网工121班 实验类型 验证 综合 设计 创新 实验日期 2015-4-29 实验成绩 一实验项目名称 Filter 过滤器习题项目 二实验目的 掌握过滤器的基本原理熟悉... -
Java过滤器及其特性
2017-08-12 17:27:37Java过滤器 -
JAVA过滤器标准代码
2008-11-05 08:32:33关于JAVA过滤器的编写,和一些要求!代码精简,方便使用 -
Java请求跨域处理过滤器
2021-08-14 13:56:11Java请求跨域处理过滤器 -
六个有用的java过滤器
2012-08-11 13:49:14六个有用的java过滤器,包括使浏览器不缓存页面的过滤器、检测用户是否登陆的过滤器、字符编码的过滤器、资源保护过滤器、利用Filter限制用户浏览权限、利用Filter过滤非法关键字。 -
JAVA过滤器 过滤器
2009-08-25 18:28:32JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器JAVA过滤器 过滤器 -
Java过滤器解决跨域问题
2020-05-30 10:44:27Java后端解决跨域问题 代码: import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CORSFilter implements Filter{ @Override public void ...