当前位置: 首页 > 工具软件 > Spring Config > 使用案例 >

springboot的config配置

杨甫
2023-12-01

本文主要关于springboot的config配置,介绍的配置为我项目中的部分配置。

登录配置

主要功能为判断用户是否登录,如果未登录,则重定向为登录页。

具体代码如下:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        Object user = request.getSession().getAttribute("user");
        // 此处获取浏览器内存储的cookie,并判断是否存在user属性
        if (null == user) {
            response.sendRedirect("/login");
            // 如果没有登陆过,就重定向到login路由下 
        }
        return true;
    }
}

MybatisPlus配置

因为涉及到数据库操作,同时部分操作较为复杂,故采用了MybatisPlus。选择它的原因主要是因为比Mybatis具有更多自带的模板,不用自己写很多冗余的sql语句和方法。

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;


@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
    // 分页设置


    // 会导致前端分页出错,这部分建议删除
    @Bean
    public SqlSessionFactory dbSqlSessionFactory(DataSource dataSource) throws Exception{
        MybatisSqlSessionFactoryBean b1 = new MybatisSqlSessionFactoryBean();
        b1.setDataSource(dataSource);
        b1.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return b1.getObject();
    }
}

第一部分是对于分页的设置,因为涉及到分页,所以需要进行分页插件的配置。

第二部分是采用MybatisSqlSessionFactory替代SqlSessionFactory。这部分是在网上搜索另一个bug时看见的,试着放进了我的项目,具体应该没有用到。

但是,在后面发现了一个问题:我的前端分页功能失效了,在数据管理的页面,所有的数据全部展示在一页了,没有了分页栏。查了好久,没找到相关的原因,但是看到这的时候,就试探性的注释掉这段代码,然后奇迹发生了,前端分页功能正常了。虽然听起来挺神奇的,但是就是这样,还是不要随意的用这部分代码。

web配置

这个配置是判断是否允许用户访问某些路由,拦截所有不允许的访问请求。

import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;


@Configuration
@ConfigurationProperties(prefix = "security.web")
public class WebConfigurer implements WebMvcConfigurer {

    @Setter
    private List<String> excludes;
    // 这个是允许放行的路由路径,具体变量存放在application.properties中


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns(excludes);
        //  除了excludes中的路由外,全部拦截
    }
}

application.properties中关于exludes的部分如下:

security.web.excludes[0] = /login
security.web.excludes[1] = /logout
security.web.excludes[2] = /images/**
security.web.excludes[3] = /jquery/**
security.web.excludes[4] = /layui/**
security.web.excludes[5] = /user/**
security.web.excludes[6] = /page/**

当然,上面的路由是我想要放行的路由,不想要放行的路由就不写。在我的项目中,由于路由较多,所以,后面这部分配置是注释掉了,即不做任何拦截。

错误处理页面

主要是判断发生的错误的类型,然后返回对应的错误页面。

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;


@Controller
public class WebExceptionAdvice implements ErrorController {


    public String getErrorPath(){
        return "error";
    }

    /**
     * @param request
     * @param model
     * @return
     */
    @RequestMapping(value = "error")
    public String handleError(HttpServletRequest request, Model model) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
        model.addAttribute("message", throwable != null ? throwable.getMessage() : null);
        switch (statusCode) {
            case 400:
                return "error/400";
            case 403:
                return "error/403";
            case 404:
                return "error/404";
            default:
                return "error/500";
        }
    }
}

在templates文件夹中创建error文件夹,里面放入4个错误页面,400.html,403.html,404.html,500.html。

Response配置

对于前后端交互,前端可能需要一种固定格式的数据类型,所以,我们需要写一个方法类,实现对数据的包装。

代码如下:

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Response<T> {

    /**
     * 响应码
     */
    private int code;

    /**
     * 响应消息体
     */
    private String msg;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 失败响应
     *
     * @param msg 响应消息体
     * @return
     */
    public static <T> Response<T> error(String msg) {
        return new Response<T>(500, msg, null);
    }

    /**
     * 成功响应
     *
     * @param data 响应数据
     * @return
     */
    public static <T> Response<T> success(T data) {
        return new Response<T>(200, null, data);
    }

    /**
     * 成功响应
     *
     * @param msg 响应消息体
     * @return
     */
    public static <T> Response<T> success(String msg) {
        return new Response<T>(200, msg, null);
    }

    /**
     * 成功响应
     *
     * @param msg  响应消息体
     * @param data 响应数据
     * @return
     */
    public static <T> Response<T> success(String msg, T data) {
        return new Response<T>(200, msg, data);
    }

}

在使用上面的方式时,有一个注意点,如果返回的数据类型是String,那么建议在返回时加上msg,防止返回数据被当成msg。(又是一个小细节)

结语

由于我用到的配置就这些,所以就没有添加其它的内容。虽然内容不是很多,但是希望可以帮到有需要的童鞋。

欢迎关注我的公众号,分享更多有用的内容!

 类似资料: