瑞吉外卖中登录拦截之过滤器和拦截器的实现

登录逻辑

当我们无论登录成功与否,都可以访问index.html界面,因此可以使用拦截器或者过滤器完善登录请求。

1过滤器实现
1.1创建拦截器类,实现Filter接口

urlPatterns表示拦截什么请求,filterName表示过滤器的名称

package com.wzt.filter;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 
    }
}
1.2创建过滤的逻辑
package com.wzt.filter;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //使用过滤链放行请求
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        log.info("拦截{}", request.getRequestURI());
        filterChain.doFilter(request, response);

    }
}
1.3将创建的过滤器注册到springboot中
@SpringBootApplication
@Slf4j
@ServletComponentScan
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
        log.info("服务启动成功");
    }
}


1.4具体业务逻辑

​ 在使用拦截器或者过滤器的时候,需要判断出要对哪些路径或者资源完成过滤或者拦截,比如说登录界面和退出界面以及静态资源就不需要被拦截。

​ 1)获取当前请求的路径

​ 2)判断当前路径是否是不需要拦截的路径

​ 3)如果不是当前拦截的路径,则放行

​ 4)如果是拦截的路径,但是当前的session存在,也放行

​ 5)如果当前的session不存在的话,需要向前端返回相应的数据,让前端完成页面的跳转。

1.5具体实现代码

//如果前端的msg为中文,则需要设置相应的编码方式。查看前端编码方式为document.charset

@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
    private AntPathMatcher pathMatcher=new AntPathMatcher();
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //使用过滤链放行请求
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String[] paths={
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };
        String uri = request.getRequestURI();
        log.info("当前路径为{}",uri);
        //如果存在,则不用拦截
         if (check(uri,paths)){
             log.info("不需要拦截");
             filterChain.doFilter(request, response);
             return;
         }
         //如果不存在,session存在,不需要拦截,放行
         if(!check(uri,paths)){
             if(request.getSession().getAttribute("employee")!=null){
                 filterChain.doFilter(request, response);
                 return;
             }
         }
         //向客户端写Json数据
        log.info("用户未登录");
         response.setCharacterEncoding("UTF-8");
        response.getWriter().write(JSON.toJSONString(R.error("未登录")));
        return;
    }
    public boolean check(String uri,String []paths){
        for (String path : paths) {
            if(pathMatcher.match(path,uri)){
                return true;
            }
        }
        return false;
    }
}
2拦截器实现
2.1编写LoginInterceptor实现HandlerInterceptor接口
package com.wzt.interceptor;

import com.alibaba.fastjson.JSON;
import com.wzt.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 使用spring mvc的拦截器实现登录功能
 */
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         Object employee = request.getSession().getAttribute("employee");
        if (employee== null) {
//            response.setContentType("application/json");
          String json=JSON.toJSONString(R.error("NOTLOGIN"));
//             response.sendRedirect("/backend/page/login/login.html");
            response.getWriter().write(json);
            return false;
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
2.2配置WebMvcConfig类

这里使用实现WebMvcConfigurer接口而非扫描静态资源使其生效继承的WebMvcConfigurationSupport类。

WebMvcConfigurer接口和WebMvcConfigurationSupport类的区别见

【https://blog.csdn.net/asddasddeedd/article/details/127517429】

实现代码

package com.wzt.config;

import com.wzt.interceptor.LoginInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author jason
 */
@Slf4j
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    LoginInterceptor loginInterceptor;
    /**
     * 设置静态资源映射
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        log.info("开始进行静态资源映射...");
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/employee/login").excludePathPatterns("/employee/logout").excludePathPatterns("/backend/**").excludePathPatterns("/front/**");

    }
}
2.3过滤器和拦截器的区别
  • 过滤器依赖于Servlet,使用回调函数实现;拦截器依赖于spring,使用反射实现。
  • 时机不同,过滤器在进入容器后,进入servlet中执行,而拦截器在servlet->controller中执行

在这里插入图片描述

  • 使用场景不同,过滤器只能用于web中,而拦截器不但可以在web中还能在Swing或者Application中。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要使用QQ邮箱来进行黑马瑞吉外卖移动端验证码登录,您需要按照以下步骤进行操作。 首先,在黑马瑞吉外卖移动应用程序选择使用验证码登录选项。 然后,系统会要求您输入您的手机号码。请输入与您的QQ邮箱绑定的手机号码。 接下来,系统将会向您的QQ邮箱发送一封包含验证码的电子邮件。请在移动应用程序等待几秒钟,确保您的QQ邮箱可以收到邮件。 打开您的QQ邮箱,并查找名为“黑马瑞吉外卖验证码”的邮件。请注意,有时候邮件可能会被归类到垃圾邮件或其他文件夹,请确保您检查所有文件夹。 在邮件,您将找到一个验证码。将该验证码复制,并返回到黑马瑞吉外卖移动应用程序。 在应用程序,粘贴您刚才复制的验证码,并点击“确认”按钮。 系统将根据您输入的验证码验证您的身份。如果验证码输入正确,您将成功登录黑马瑞吉外卖移动应用程序。 请注意,验证码一般在发送后几分钟内失效。如果您在一定时间内没有收到邮件或验证码已失效,请尝试重新请求或重新发送验证码。 这样,您就可以使用您的QQ邮箱来进行黑马瑞吉外卖移动端验证码登录了。如果您遇到任何问题,请及时联系黑马瑞吉外卖的客户支持。 ### 回答2: 黑马瑞吉外卖是一家提供外卖服务的公司,为了提高用户的账户安全性,他们在移动端推出了验证码登录功能。用户可以选择使用qq邮箱进行验证码登录。 用户在移动端打开黑马瑞吉外卖的应用后,选择登录界面,并选择验证码登录选项。接下来,用户需要点击“使用qq邮箱登录”的按钮。 在点击按钮后,应用会要求用户输入他们的qq邮箱地址。用户需要输入正确的邮箱地址,并点击确认。系统会验证该邮箱是否存在以及是否正确。 验证通过后,系统会向用户的qq邮箱发送一封邮件,邮件包含一个验证码。用户需要打开邮箱,找到这封邮件,复制验证码并返回外卖应用。 用户需要粘贴该验证码,并点击确认。系统会对验证码进行验证,如果验证码正确,用户将成功登录外卖应用,并可开始使用各种功能。 通过验证码登录的方式,账户的安全性得到了提高。因为只有用户本人能够收到并使用qq邮箱的验证码,在他人无法猜测的情况下,他人无法登录用户的账户。 同时,使用qq邮箱登录还具有方便性。许多用户已经有自己的qq邮箱,不需要再注册新的账户,可以直接使用已有的qq邮箱进行登录,省去了注册的时间和麻烦。 总之,黑马瑞吉外卖的移动端验证码登录使用qq邮箱的功能保证了用户账户的安全性,同时也提供了便利的登录方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值