本文主要关于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。选择它的原因主要是因为比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时看见的,试着放进了我的项目,具体应该没有用到。
但是,在后面发现了一个问题:我的前端分页功能失效了,在数据管理的页面,所有的数据全部展示在一页了,没有了分页栏。查了好久,没找到相关的原因,但是看到这的时候,就试探性的注释掉这段代码,然后奇迹发生了,前端分页功能正常了。虽然听起来挺神奇的,但是就是这样,还是不要随意的用这部分代码。
这个配置是判断是否允许用户访问某些路由,拦截所有不允许的访问请求。
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。
对于前后端交互,前端可能需要一种固定格式的数据类型,所以,我们需要写一个方法类,实现对数据的包装。
代码如下:
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。(又是一个小细节)
由于我用到的配置就这些,所以就没有添加其它的内容。虽然内容不是很多,但是希望可以帮到有需要的童鞋。
欢迎关注我的公众号,分享更多有用的内容!