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

目录

  • 滤器实现登录拦截处理
    • 一、什么是过滤器
    • 二、工作原理及生命周期
    • 三、过滤器使用
  • filter简易实现登录功能拦截
    • LoginFliter
    • controller
    • 结果图

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

二、工作原理及生命周期
举个例子 当我们登录系统可以访问到页面,当退出登录后,要访问就必须重新登录,这就是过滤器起到的作用。当我们访问某个接口时,过滤器会拦截请求,判断当前用户是否是登录状态,若登录则放行访问,若未登录则返回指定页面(通常为登录页或一个客户友好的提示页)
java|java 使用过滤器实现登录拦截处理
文章图片
java|java 使用过滤器实现登录拦截处理
文章图片

这个过程包含了过滤器的生命周期:
1.实例化
2.初始化
3.执行过滤操作(包括访问前对request操作和返回时对response的操作处理)
4.销毁

三、过滤器使用
在springboot项目简单使用过滤器进行登录拦截处理
1.实现过滤器
public class MyFilter implements Filter { private static final String CURRENT_USER = "current_user"; //配置白名单 protected static List patterns = new ArrayList(); //静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次 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.注册过滤器
@Configurationpublic 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,会发现没有被拦截,返回正确结果
java|java 使用过滤器实现登录拦截处理
文章图片

在未登录状态,访问/update接口,会被拦截跳转至/index页
java|java 使用过滤器实现登录拦截处理
文章图片

在登录状态,访问/update接口,可以访问
java|java 使用过滤器实现登录拦截处理
文章图片

这里也可以在程序debug看下。简单的过滤器功能完成。
常用过滤器及其使用后续再来学习。

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

LoginFliter
public class LoginFliter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic 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); }}@Overridepublic 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|java 使用过滤器实现登录拦截处理
文章图片
java|java 使用过滤器实现登录拦截处理
文章图片

【java|java 使用过滤器实现登录拦截处理】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读