springboot与mybatis plus开发瑞吉外卖项目实战

本文介绍了在SpringBoot项目中如何使用Servlet和Filter,以及全局异常拦截的实现。针对Long类型ID在前端显示问题,提出了使用Fastjson和自定义消息转换器的解决方案。同时,讲解了Mybatis Plus的自动填充公共字段,利用ThreadLocal处理用户ID。还涵盖了自定义异常处理、文件上传下载和并发安全的AtomicInteger应用。
摘要由CSDN通过智能技术生成

请求返回类封装

package com.liu.reggie.common;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

@Data
public class R <T>{
   
    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据

    public static <T> R<T> success(T object) {
   
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        return r;
    }

    public static <T> R<T> error(String msg) {
   
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R<T> add(String key, Object value) {
   
        this.map.put(key, value);
        return this;
    }
}

使用

/**
* 根据 id 查询员工信息
* @param id
* @return
*/
@GetMapping("/{id}")
public R<Employee> getById(@PathVariable Long id){
   
    log.info("根据id查员工信息....");
    Employee employee = employeeService.getById(id);
    if (employee!=null){
   
        return R.success(employee);
    }
    return R.error("没有查询到相对应的信息!");
}

Spring Boot 中使用 Servlet

在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

  • 使用 Filter 拦截器

    • 在启动类里加上 @ServletComponentScan

      package com.liu.reggie;
      
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.boot.web.servlet.ServletComponentScan;
      import org.springframework.transaction.annotation.EnableTransactionManagement;
      
      // 扫描 servlet 注解
      @ServletComponentScan
      // 开启事务
      @EnableTransactionManagement
      @SpringBootApplication
      public class ReggieTakeOutApplication {
             
      
          public static void main(String[] args) {
             
              SpringApplication.run(ReggieTakeOutApplication.class, args);
          }
      
      }
      
    • 启用@WebFilter进行路径拦截

      package com.liu.reggie.filter;
      
      import com.alibaba.fastjson.JSON;
      import com.liu.reggie.common.R;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.util.AntPathMatcher;
      
      import javax.servlet.*;
      import javax.servlet.annotation.WebFilter;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      @Slf4j
      @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
      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();
              log.info("拦截到请求:{}",requestURI);
      
              // 定义不需要处理的请求路径
              String[] urls=new String[]{
             
                      "/employee/login",
                      "/employee/logout",
                      "/backend/**",
                      "/front/**"
              };
              //2、判断本次请求是否需要处理
              boolean check = check(urls, requestURI);
      
      
              //3、如果不需要处理,则直接放行
              if (check){
             
                  log.info("本次请求{}不需要处理",requestURI);
                  filterChain.doFilter(request,response);
                  return;
              }
      
      
              //4-1、判断登录状态,如果已登录,则直接放行
              if (request.getSession().getAttribute("employee") !=null){
             
                  log.info("用户已经登录,用户id为:{}",request.getSession().getAttribute("employee"));
                  filterChain.doFilter(request,response);
                  return;
              }
      
              log.info("用户未登录");
              //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
              response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
      
              return;
          }
      
          /**
           * 路径匹配,检查本次请求是否需要放行
           * @param urls
           * @param requestURL
           * @return
           */
          public boolean check(String[] urls,String requestURL){
             
              for (String url : urls) {
             
                  boolean match = PATH_MATCHER.match(url, requestURL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值