java 使用过滤器实现登录拦截处理

 更新时间:2021年09月27日 16:28:10   作者:ChengNengNeng  
这篇文章主要介绍了java 使用过滤器实现登录拦截处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

滤器实现登录拦截处理

一、什么是过滤器

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

二、工作原理及生命周期

举个例子 当我们登录系统可以访问到页面,当退出登录后,要访问就必须重新登录,这就是过滤器起到的作用。当我们访问某个接口时,过滤器会拦截请求,判断当前用户是否是登录状态,若登录则放行访问,若未登录则返回指定页面(通常为登录页或一个客户友好的提示页)

在这里插入图片描述 在这里插入图片描述

这个过程包含了过滤器的生命周期:

1.实例化

2.初始化

3.执行过滤操作(包括访问前对request操作和返回时对response的操作处理)

4.销毁

三、过滤器使用

在springboot项目简单使用过滤器进行登录拦截处理

1.实现过滤器

public class MyFilter implements Filter {
	private static final String CURRENT_USER = "current_user";
   //配置白名单
	protected static List<Pattern> patterns = new ArrayList<Pattern>();
	//静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次
	static {
		patterns.add(Pattern.compile("/index"));
		patterns.add(Pattern.compile("/login"));
		patterns.add(Pattern.compile("/register"));
	}
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
		HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
		HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(httpResponse);
		String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());
		if (isInclude(url)) {
			//在白名单中的url,放行访问
			filterChain.doFilter(httpRequest, httpResponse);
			return;
		}
		if (SessionUtils.getSessionAttribute(CURRENT_USER) != null) {
			//若为登录状态 放行访问
			filterChain.doFilter(httpRequest, httpResponse);
			return;
		} else {
			//否则默认访问index接口
			wrapper.sendRedirect("/index");
		}
	}
	@Override
	public void destroy() {
	}
//判断当前请求是否在白名单
	private boolean isInclude(String url) {
		for (Pattern pattern : patterns) {
			Matcher matcher = pattern.matcher(url);
			if (matcher.matches()) {
				return true;
			}
		}
		return false;
	}
}

2.注册过滤器

@Configuration
public class WebConfig {
	/**
	 * 配置过滤器
	 * @return
	 */
	@Bean
	public FilterRegistrationBean someFilterRegistration() {
		FilterRegistrationBean registration = new FilterRegistrationBean();
		registration.setFilter(myFilter());
		//拦截/*的访问 多级匹配(springboot 过滤器/*以及匹配 /**多级匹配)
		registration.addUrlPatterns("/*");
		registration.setName("myFilter");
		return registration;
	}
	/**
	 * 创建一个bean
	 * @return
	 */
	@Bean(name = "myFilter")
	public Filter myFilter() {
		return new MyFilter();
	}
}

3.运行项目

访问/index,会发现没有被拦截,返回正确结果

在这里插入图片描述

在未登录状态,访问/update接口,会被拦截跳转至/index页

在这里插入图片描述

在登录状态,访问/update接口,可以访问

在这里插入图片描述

这里也可以在程序debug看下。简单的过滤器功能完成。

常用过滤器及其使用后续再来学习。

filter简易实现登录功能拦截

暑期项目实习第八课, filter简易实现登录功能拦截

LoginFliter

public class LoginFliter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @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();
        User user = (User)session.getAttribute("user");
        String uri = request.getRequestURI();
        System.out.println(uri.indexOf("findAll.do"));
        System.out.println(uri.indexOf("login.do"));
        if(user==null && uri.indexOf("login.do")==-1){
            response.sendRedirect(request.getContextPath()+"/");
        }else {
            filterChain.doFilter(request,response);
        }
    }
    @Override
    public void destroy() {
    }
}

controller

   @RequestMapping("/login.do")
    public ModelAndView login(User user, HttpSession session){
        boolean flag = userService.login(user.getName(),user.getPassword());
        ModelAndView modelAndView = new ModelAndView();
        if(flag){
            session.setAttribute("user",user);
            modelAndView.setViewName("../ok");
        }else {
            modelAndView.setViewName("../failure");
        }
        return modelAndView;
    }

结果图

在这里插入图片描述 在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于java中Map的九大问题分析

    关于java中Map的九大问题分析

    这篇文章主要为大家详细分析了关于java中Map的九大问题,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • SpringMVC @NotNull校验不生效的解决方案

    SpringMVC @NotNull校验不生效的解决方案

    这篇文章主要介绍了SpringMVC @NotNull校验不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Springboot集成minio实现文件存储的实现代码

    Springboot集成minio实现文件存储的实现代码

    MinIO 是一款基于Go语言的高性能对象存储服务,本文主要介绍了Springboot集成minio实现文件存储的实现代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 搞懂JAVAObject中的hashCode()

    搞懂JAVAObject中的hashCode()

    今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • Java开发之spring security实现基于MongoDB的认证功能

    Java开发之spring security实现基于MongoDB的认证功能

    这篇文章主要介绍了Java开发之spring security实现基于MongoDB的认证功能,结合实例形式分析了spring security在非JDBC环境下的自定义认证服务实现技巧,需要的朋友可以参考下
    2017-11-11
  • Java程序中使用JavaMail发送带图片和附件的邮件

    Java程序中使用JavaMail发送带图片和附件的邮件

    这篇文章主要介绍了Java程序中使用JavaMail发送带图片和附件的邮件,JavaMail是专门用来处理邮件的Java API,需要的朋友可以参考下
    2015-11-11
  • spring应用中多次读取http post方法中的流遇到的问题

    spring应用中多次读取http post方法中的流遇到的问题

    这篇文章主要介绍了spring应用中多次读取http post方法中的流,文中给大家列举处理问题描述及解决方法,需要的朋友可以参考下
    2018-11-11
  • java IO流之转换流的具体使用

    java IO流之转换流的具体使用

    转换流可以将一个字节流包装成字符流,或者将一个字符流包装成字节流,本文主要介绍了java IO流之转换流的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • JavaWeb踩坑记录之项目访问不到html文件

    JavaWeb踩坑记录之项目访问不到html文件

    这篇文章主要给大家介绍了关于JavaWeb踩坑记录之项目访问不到html文件的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用JavaWeb具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • Java获取汉字拼音的全拼和首拼实现代码分享

    Java获取汉字拼音的全拼和首拼实现代码分享

    这篇文章主要介绍了Java获取汉字拼音的全拼和首拼实现代码分享,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06

最新评论