Springboot中使用Filter实现Header认证详解

 更新时间:2023年08月12日 10:05:38   作者:牛奋lch  
这篇文章主要介绍了Springboot中使用Filter实现Header认证详解,当在 web.xml 注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,它可以决定是否将请求继续传递给 Servlet 程序,以及对请求和响应消息是否进行修改,需要的朋友可以参考下

前言

假设客户端在http请求中,已经加入了Header的认证信息,例如:

HttpPost post = new HttpPost("http://localhost:8990/sendMail");
				StringEntity entity = new StringEntity(json, "utf-8");
				entity.setContentType("application/json");
				post.setEntity(entity);
				// 设置验证头信息
				post.addHeader("token", "WEFGYHJIKLTY4RE6DF29HNBCFD13ER87");

那么服务端怎么通过Filter,来验证客户端的token是否有效了?请接着往下看。

一、实现自定义Filter

1、实现Filter接口

我们要自定义Filter,只需实现Filter接口即可

2、覆写doFilter方法

根据业务逻辑,来覆写doFilter方法

示例如下:

@Slf4j
@Component
@WebFilter(urlPatterns={"/sendMail/*"}, filterName="tokenAuthorFilter")
public class TokenAuthorFilter implements Filter {
	@Autowired
	private AuthorizationRepository repository;
	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest)request;
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		String token = req.getHeader("token");
		Response res = new Response();
		boolean isFilter = false;
		if (null == token || token.isEmpty()) {
			res.setSuccess(false);
			res.setErrorCode("403");
			res.setErrorMessage("token没有认证通过!原因为:客户端请求参数中无token信息");
		} else {
			Authorization auth = repository.findByToken(token);
			if (null == auth) {
				res.setSuccess(false);
				res.setErrorCode("403");
				res.setErrorMessage("token没有认证通过!原因为:客户端请求中认证的token信息无效,请查看申请流程中的正确token信息");
			}else if((auth.getStatus() == 0)){
				res.setSuccess(false);
				res.setErrorCode("401");
				res.setErrorMessage("该token目前已处于停用状态,请联系邮件系统管理员确认!");
			}else{
				isFilter = true;
				res.setSuccess(true);
			}
		}
		if(!res.isSuccess()){
			PrintWriter writer = null;
			OutputStreamWriter osw = null;
			try {
				osw = new OutputStreamWriter(response.getOutputStream() , "UTF-8");
				writer = new PrintWriter(osw, true);
				String jsonStr = ObjectMapperInstance.getInstance().writeValueAsString(res);
				writer.write(jsonStr);
				writer.flush();
				writer.close();
				osw.close();
			} catch (UnsupportedEncodingException e) {
				log.error("过滤器返回信息失败:" + e.getMessage(), e);
			} catch (IOException e) {
				log.error("过滤器返回信息失败:" + e.getMessage(), e);
			} finally {
				if (null != writer) {
					writer.close();
				}
				if(null != osw){
					osw.close();
				}
			}
			return;
		}
		if(isFilter){
			log.info("token filter过滤ok!");
			chain.doFilter(request, response);
		}
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
}

通过上面的几步,就实现了一个自定义的Filter。

3、注册Filter

接下来,需要注册这个过滤器,spring boot提供了以下两种注册方式。

3.1 是用注解注册

在Filter上添加如下注解即可

@Slf4j
@Component
@WebFilter(urlPatterns={"/sendMail/*"}, filterName="tokenAuthorFilter")
public class TokenAuthorFilter implements Filter {

@WebFilter注解的作用就是用来注册Filter,通过这种方式注册的Filter,需要在启动类上加上@ServletComponentScan注解才能生效,如下:

@ServletComponentScan
public class MailserviceApplication {
	public static void main(String[] args) {
		SpringApplication.run(MailserviceApplication.class, args);
	}
}

3.2 手动配置Filter

@Configuration
@Component
public class FilterConfig {
	@Autowired
	private TokenAuthorFilter filter;
	@Bean
    public FilterRegistrationBean  filterRegistrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(filter);
        List<String> urlPatterns = new ArrayList<String>();
        urlPatterns.add("/sendMail/*");// 设置匹配的url
        registrationBean.setUrlPatterns(urlPatterns);
        return registrationBean;
    }
}

上面两种方式虽然使用上有些不一样,但是本质都是一样的,都会调用FilterRegistrationBean来进行注册。

二、spring boot内置的Filter

为了方便我们的开发,spring boot内置了许多有用的Filter,我们可以根据业务的需求,选择适合业务的Filter。

三、拓展

通过前面的N篇博客,我们会发现spring boot处理Servlet,Listener,Filter的思路大致都是一样

对应的注解分别为@WebServlet 、@WebListener、@WebFilter

对应的注册Bean分别为ServletRegistrationBean,ServletListenerRegistrationBean,FilterRegistrationBean

无论哪种方式,都大大的简化了我们的开发

到此这篇关于Springboot中使用Filter实现Header认证详解的文章就介绍到这了,更多相关Filter实现Header认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过Session案例分析一次性验证码登录

    通过Session案例分析一次性验证码登录

    这篇文章主要介绍了通过Session案例分析一次性验证码登录,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Eureka源码解析服务离线状态变更

    Eureka源码解析服务离线状态变更

    这篇文章主要为大家介绍了Eureka源码解析服务离线的状态变更示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 谈谈Java中try-catch-finally中的return语句

    谈谈Java中try-catch-finally中的return语句

    我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的函数中,仅仅是一个return语句(return ;),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种情况下return语句后不能再有其它的语句了
    2016-01-01
  • Java实现的计算稀疏矩阵余弦相似度示例

    Java实现的计算稀疏矩阵余弦相似度示例

    这篇文章主要介绍了Java实现的计算稀疏矩阵余弦相似度功能,涉及java基于HashMap的数值计算相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • java打jar包与找不到依赖包的问题

    java打jar包与找不到依赖包的问题

    这篇文章主要介绍了java打jar包与找不到依赖包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 基于IDEA中格式化代码的快捷键分享

    基于IDEA中格式化代码的快捷键分享

    这篇文章主要介绍了基于IDEA中格式化代码的快捷键分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot2.x配置HTTPS访问的过程

    SpringBoot2.x配置HTTPS访问的过程

    这篇文章主要介绍了SpringBoot2.x配置HTTPS访问的过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解决

    SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解决

    这篇文章主要介绍了SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java面向对象之内部类案例讲解

    Java面向对象之内部类案例讲解

    这篇文章主要介绍了Java面向对象之内部类案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 使用Java获取Json中的数据简单示例

    使用Java获取Json中的数据简单示例

    开发过程中经常会遇到json数据的处理,而单独对json数据进行增删改并不方便,下面这篇文章主要给大家介绍了关于使用Java获取Json中的数据,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04

最新评论