SpringBoot实现静态资源映射,登录功能以及访问拦截验证——以黑马瑞吉外卖为例

Posted zoeil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot实现静态资源映射,登录功能以及访问拦截验证——以黑马瑞吉外卖为例相关的知识,希望对你有一定的参考价值。

目录

一、项目简介

二、设置静态资源访问路径

三、实现登录功能

四、拦截访问请求


本篇文章以黑马瑞吉外卖为例

一、项目简介

瑞吉外卖项目分为后台和前台系统,后台提供给管理人员使用,前台则是用户订餐使用

资源我们放在resources下

二、设置静态资源访问路径

我们的资源放在resources下,当我们访问localhost:8080/backend/page/login/login.html后台登录时发现无法访问,因为springboot只要静态资源放在类路径下: called /static (or /public or /resources or /META-INF/resources

才能访问,所以我们需要自定义一下资源的访问路径

我们可以通过重写 WebMvcConfigurationSupport 的 addResourceHandlers 设置静态资源访问路径, 代码如下:

@Configuration
@Slf4j
public class WebMvcConfig extends WebMvcConfigurationSupport 

    /*
     * 设置静态资源映射
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) 
        log.info("开始进行静态资源映射...");
        registry.addResourceHandler("/backend/**")
                .addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**")
                .addResourceLocations("classpath:/front/");
    

 于是就能访问了

三、实现登录功能

通过网页检查->console 可以知道登录页面会向 employee/login 发送请求,所以我们写一个controller,实现对应的方法处理请求。对于登录请求的思路大致如下:

  1. 因为数据库的密码使用md5加密,所以需要先对密码进行md5加密
  2. 将提交的用户名查询数据库是否有对应的用户,无则提示登陆失败
  3. 将查出的用户密码进行比对,不同则则提示登陆失败
  4. 将用户id放入session域中供后面使用
@RestController
@Slf4j
@RequestMapping("/employee")
public class EmployeeController 

    @Autowired
    private EmployeeService employeeService;

    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee)             
   
        //1.将页面提交的密码password进行md5加密
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        //2.根据页面提交的用户名查询数据库
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Employee::getUsername, employee.getUsername());
        Employee user = employeeService.getOne(wrapper);

        //3.找不到用户或者密码比对失败或者账户被禁用返回错误消息
        if(user == null || !user.getPassword().equals(password)) 
            return R.error("登录失败");
        

        if(user.getStatus() == 0) 
            return R.error("账户已禁用");
        

        //4.登陆成功,将用户Id放入session域
        request.getSession().setAttribute("employee", user.getId());
        return R.success(user);

    

 登录成功

 这里我们还要实现一下登出功能,在右上角点击可以登录,我们只需要写一个对应的方法即可,需要清楚session域中的用户id,返回退出成功的信息。

    /*
     * 员工退出
     */
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request) 
        // 清除session中的用户Id
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    

四、拦截访问请求

登出后我们发现直接请求员工列表也是可行的,这当然是不合理的,如果没有登陆的请求应该返回登录页面,我们可以通过一个全局过滤器实现请求的拦截,步骤如下:

对于不需要拦截的请求放行,需要的我们查看session域中是否有用户id存在,不存在则跳转回登陆页面

由于前端响应拦截器使用的是json形式,所以我们需要返回 json 形式的对应字符串

@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter 
    // 路径匹配器,支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        // 1.获取请求的URI
        String requestURI = request.getRequestURI();

        String[] urls = new String[]
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        ;
        // 2.判断访问的URI需不需要登录才可访问
        log.info("拦截到请求", requestURI);
        if(check(urls, requestURI)) 
            log.info("本次请求不需要处理", requestURI);
            filterChain.doFilter(request, response);
            return;
        

        // 3.已经登录无需处理直接放行

        if(request.getSession().getAttribute("employee") != null) 
            log.info("用户已登录,id为" + request.getSession().getAttribute("employee"));
            filterChain.doFilter(request, response);
            return;
        


        // 4. 如果未登录返回未登录结果,通过输出流的方式向客户端返回响应数据
        log.info("用户未登录");
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

    

    /*
     * 路径匹配,判断是否需要放行
     */
    public boolean check(String[] urls, String url) 
        for(String item : urls) 
            if(PATH_MATCHER.match(item, url)) 
                return true;
            
        
        return false;
    

以上是关于SpringBoot实现静态资源映射,登录功能以及访问拦截验证——以黑马瑞吉外卖为例的主要内容,如果未能解决你的问题,请参考以下文章

Springboot2之静态资源规则与定制化welcome与favicon功能Rest映射及源码解析以及改变默认的_method

springboot 2.0前端跨域 静态资源本地映射

springboot静态资源文件的映射

SpringBoot web静态资源映射

用户登录功能的实现

SpringBoot:静态资源映射定制404配置icon