目录结构
可能会用到的pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- commons fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- commons工具 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.2</version>
</dependency>
<!--fastJson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
</dependencies>
跨域过滤器
CrossDomainFilter
@Slf4j
public class CrossDomainFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException, IOException {
System.out.println("Filter过滤!!");
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 允许所有的请求域名访问我们的跨域资源,可以固定单个或者多个内容
httpResponse.setHeader("Access-Control-Allow-Origin", "*");//
// httpResponse.setHeader("Access-Control-Allow-Origin", "http://localhost:9090");// 允许所有的请求域名访问我们的跨域资源,可以固定单个或者多个内容
httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");// 允许何种请求方法访问该跨域资源服务器
httpResponse.setHeader("Access-Control-Max-Age", "3600");// 预检请求的有效期,单位为秒。有效期内,不会重复发送预检请求
httpResponse.addHeader("Access-Control-Allow-Headers",
"token,Accept,Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");// 允许所有的请求header访问,可以自定义设置任意请求头信息 后期加上 authorization
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");// 是否允许用户发送、处理cookie
//如果额外设置自己的头需要在这定义
httpResponse.setHeader("Access-Control-Expose-Headers", "token");
chain.doFilter(request, httpResponse);
}
@Override
public void destroy() {
}
}
启动类
ApplicationApp
@SpringBootApplication
@MapperScan(basePackages = "com.公司名.项目名.mapper")
public class HouseApp {
public static void main(String[] args) {
SpringApplication.run(HouseApp.class,args);
}
//搭载过滤器
@Bean
public FilterRegistrationBean<CrossDomainFilter> crossDomainFilter(){
FilterRegistrationBean<CrossDomainFilter> registrationBean =new FilterRegistrationBean<>();
//web.xml 种的Filter-class
registrationBean.setFilter(new CrossDomainFilter());
//web.xml种的url-pattern
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
application.yml 文件
部署端口,根路径,数据源,mybatis,分页插件,日志和静态资源
在resource下新建application.yml文件
#yml 与properties一样
server:
port: 8080
servlet:
context-path: /xxxx
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///xxxx?serverTimezone=UTC
username: root
password: xxxxxx
mybatis:
type-aliases-package: com.etoak.house.bean
mapper-locations: classpath:mapper/*.xml
pagehelper:
helperDialect: mysql
##合理化参数 当查询的野吗<=0时查询第一页,超过总页数时查询最后一页
reasonable: true
supportMethodsArguments: true
params: count=countSql
pic:
location: d:/upload/xxxxx
mapping: /pics/
logging:
level:
com.etoak.house.mapper: debug
拦截器
/**
*
* 拦截器
* 在MVCConfig中设置的全拦截
* 放过/user/login/**和/pics/**
*/
@Component
@Slf4j
public class Interceptor implements HandlerInterceptor {
/**
*
* @param request
* @param response
* @param handler
* @return true放行 false 打回
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1检查请求方法 如果是Options请求 则直接放行
String method =request.getMethod();
if(StringUtils.equals("OPTIONS",method.toUpperCase())){
return true;
}
/**
* 开始你的表演
* if(...){
* ...
* return true;
* }else{
* this.noAuth("error");
* return false;
* }
*/
return false;
}
private void noAuth(HttpServletResponse response, String str) throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
PrintWriter pw =response.getWriter();
pw.write(str);
}
}
MVCConfig
配置拦截器和静态资源定制
/*
配置拦截器+静态资源定制
*/
@Configuration
public class MVCconfig implements WebMvcConfigurer {
//定制静态资源
@Autowired
Rources rources;
@Autowired
Interceptor interceptor;
/**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor)
//全拦截
.addPathPatterns("/**")
//放过下面的url
.excludePathPatterns("/user/login/**")
.excludePathPatterns("/pics/**");
}
/**
* 定制静态资源访问
* <mvc:resources location="" mapping="" />
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 如果上传路径是以/结尾,那就直接使用,如果不是就加上/
String location = rources.getLocation().endsWith("/") ?
rources.getLocation() :
rources.getLocation() + "/";
// 如果访问路径是以/结尾,那就追加上**,如果不是,就追加/**
String mapping = rources.getMapping().endsWith("/") ?
rources.getMapping() + "**" :
rources.getMapping() + "/**";
registry.addResourceHandler(mapping) // mapping属性
.addResourceLocations("file:" + location); // location
}
}
Resources
用于读取yml文件
@Component
@ConfigurationProperties(prefix ="pic")//读pic开头的文件
@Data
public class Rources {
private String location;
private String mapping;
}
Result
Result
@Component
@Data@AllArgsConstructor@NoArgsConstructor
public class Result {
private int code;
private String msg;
private Object data;
}
ResultEnum
public enum ResultEnum {
SUCCESS(200,"success"),
ERROR(444,"error");
ResultEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
int code;
String msg;
}
SetResult
@Component
public class SetResult {
@Autowired
Result r;
public Result success(Object o){
r.setCode(ResultEnum.SUCCESS.code);
r.setMsg(ResultEnum.SUCCESS.msg);
r.setData(o);
return r;
}
public Result error(Object o){
r.setCode(ResultEnum.ERROR.code);
r.setMsg(ResultEnum.ERROR.msg);
r.setData(o);
return r;
}
public Result howToSetResultByCode (int code, Object o){
switch (code){
case 200: return success(o);
case 444: return error(o);
}
return null;
}
}
Page
@Data@AllArgsConstructor@NoArgsConstructor
public class page<T> {
private int pageNumber;
private int pageSize;
private int total;
private List<T> rows;
private int pageCount;
private int pre;
private int next;
private int start; //limit ?,?
private boolean first;
private boolean last;
public int getPageCount() {
return (getTotal()+getPageSize()-1)/getPageSize();
}
public int getPre() {
if(getPageNumber()==1)
return 1;
return getPageNumber()-1;
}
public int getNext() {
if(getPageNumber()==getPageCount())
return getPageCount();
return getPageNumber()+1;
}
public int getStart() {
return (getPageNumber()-1)*pageSize;
}
public boolean isFirst() {
return getPageNumber()==1;
}
public boolean isLast() {
return getPageNumber()==getPageCount();
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<T> getRows() {
return rows;
}
public void setRows(List<T> rows) {
this.rows = rows;
}
}
总结
启动
用餐愉快~