本人是一名物聯網工程專業的學生,即將進入大三,寫博客即是爲了記錄自己的學習歷程,又希望能夠幫助到很多和自己一樣處於起步階段的萌新。
臨淵羨魚,不如退而結網。一起加油!
博客主頁:https://blog.csdn.net/qq_44895397
SpringBoot使用攔截器
1、定義一個攔截器,實現HandlerInterceptor接口
public class StudentHandler implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
Object user = request.getSession().getAttribute("user");
if (null == user||"".equals(user)){
response.sendRedirect("/student/error");
return false;//已經登陸過
}else {
return true;//沒有登陸
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
2、創建一個配置類
相當於在springmvc配置文件中使用mvc:interceptor標籤
- 創 建 一 個 配 置 類 InterceptorConfig , 並 實 現
WebMvcConfigurer
接口, 覆蓋接口中的addInterceptors
方法,併爲該配置類添加@Configuration
註解,標註此類爲一個配置類,讓 Spring Boot 掃描到, - 這裏的操作就相當於 SpringMVC 的註冊攔截器 ,@Configuration 就相當於一個 applicationContext-mvc.xml
@Configuration//配置類
public class StudetnConfig implements WebMvcConfigurer {
/**
* addInterceptor()增加攔截器對象(相當於之前的mvc:interceptor裏面的聲明攔截器對象)
* addPathPatterns():增加攔截請求路徑(攔截)
* excludePathPatterns():排除攔截請求路徑(對這裏面的請求路徑不攔截)
* @param registry:攔截器註冊類對象
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
String [] addPathPatterns = {"/student/*"};//增加攔截路徑
String [] excludePathPatterns = {"/student/login","/student/anytime","/student/error"};//額外路徑,不進行攔截
registry.addInterceptor(new StudentHandler()).
addPathPatterns(addPathPatterns).
excludePathPatterns(excludePathPatterns);
}
}
SpringBoot使用Servlet
1、第一種方式:使用註解
-
a、定義一個類繼承
HttpServlet
,重寫doPost、doGet方法 -
b、在該類上添加註解
@WebServlet
,定義請求路徑 -
c、在啓動類上添加掃描servlet註解的註解:
@ServletComponentScan
定義一個類繼承HttpServlet
,重寫doPost、doGet方法
@WebServlet(urlPatterns = "/userservlet")//urlPatterns請求路徑
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("servlet");
resp.getWriter().flush();
resp.getWriter().close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
c、在啓動類上添加掃描servlet註解的註解:@ServletComponentScan
@ServletComponentScan(basePackages = "com.yky.springboot.servlet")
第二種方式:使用配置類
- servlet類
- 配置類:
聲明servlet對象,請求路徑
/**
* 配置類
*/
@Configuration
public class servletConfiger {
/**
* @Bean 相當於<bean>
* ServletRegistrationBean(聲明servlet,請求路徑)
*/
@Bean
public ServletRegistrationBean userServletRegistrationBean() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new UserServlet(), "/userServlet");
return servletRegistrationBean;
}
}
SpringBoot使用過濾器Filter
方式一:使用註解
1)創建過濾器類,實現Filter接口,在類上添加@WebFilter(urlPatterns = “/userservlet”)
@WebFilter(urlPatterns = "/user/*")
public class UserFilter implements Filter{
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("++++==你好==++++");
filterChain.doFilter(servletRequest,servletResponse);
}
}
2)在啓動類上添加@ServletComponentScan,並且指定包
通過 Spring Boot 的配置類實現
1)創建一個普通的 Filter
2)編寫一個 Spring Boot 的配置類,在該類中註冊 Filter
@Configuration //定義爲配置類
public class FilterConfig {
@Bean
public FilterRegistrationBean myFilterRegistration() {
//註冊過濾器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
//添加過濾路徑
filterRegistrationBean.addUrlPatterns("/springboot/*","/user/*");
return filterRegistrationBean;
}
}
Spring Boot 項目配置字符編碼
方式一 使用傳統的 Spring 提供的字符編碼過濾器
- 創建一個 Servlet
- 創建配置類 userfilterConfig,配置過濾字符編碼的信息
- 在覈心配置文件關閉springboot默認的字符編碼
1、創建一個 Servlet
@WebServlet(urlPatterns = "/user/servlet")
public class StudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("愛敲代碼的小遊子,加油!");
//設置瀏覽器編碼格式
resp.setContentType("text/html;character=utf-8");
resp.getWriter().flush();
resp.getWriter().close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2、創建配置類 userfilterConfig
@Configuration
public class userfilter {
@Bean
public FilterRegistrationBean characterFilterRegistration() {
//設置字符編碼過濾器
//CharacterEncoding 是由 Spring 提供的一個字符編碼過濾器,之前是配置在
//web.xml 文件中
CharacterEncodingFilter characterEncodingFilter = new
CharacterEncodingFilter();
//強制使用指定字符編碼
characterEncodingFilter.setForceEncoding(true);
//設置指定字符編碼
characterEncodingFilter.setEncoding("UTF-8");
//創建過濾器註冊 bean
FilterRegistrationBean filterRegistrationBean = new
FilterRegistrationBean();
//設置字符編碼過濾器
filterRegistrationBean.setFilter(characterEncodingFilter);
//設置字符編碼過濾器路徑
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
3、在覈心配置文件關閉springboot默認的字符編碼
#關閉spring boot的http字符編碼設置
server.servlet.encoding.enabled=false
第二種方式:在覈心配置文件配置字符編碼信息
1、servlet內設置瀏覽器字符編碼
//設置瀏覽器編碼
resp.setContentType("text/htlm;character=utf-8");
2、核心配置文件設置請求響應字符編碼
server.servlet.encoding.charset=utf-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
SpringBoot打包部署
Spring Boot 程序 war 包部署
1、程序入口類需擴展繼承SpringBootServletInitializer類並覆蓋 configure 方法
@SpringBootApplication
@ServletComponentScan(basePackages = "com.yky.springboot.servlet")
public class Springbootdemo09Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Springbootdemo09Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//參數爲當前spring boot啓動類
return builder.sources(Springbootdemo09Application.class);
}
}
2、在 pom.xml 中添加(修改)打包方式爲 war
<packaging>war</packaging>
3、在 pom.xml 中配置 springboot 打包的插件(默認自動加)
<!--SpringBoot 打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
4、在 pom.xml 中配置將配置文件編譯到類路徑
<resource>
<!--源文件夾-->
<directory>src/main/webapp</directory>
<!--目標文件夾-->
<targetPath>META-INF/resources</targetPath>
<!--包含的文件-->
<includes>
<include>**/*.*</include>
</includes>
</resource>
<!--mybatis 的 mapper.xml-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--src/main/resources 下的所有配置文件編譯到 classes 下面去-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
5、在 pom.xml 的 build 標籤下通過 finalName 指定打 war包的名字
<!--指定打 war 包的名字-->
<finalName>springboot</finalName>
6、通過 Maven package 命令打 war 包到 target 目錄下
7、將 target 目錄下生成的 war 包拷貝到 tomcat 的 webapps目錄,並啓動 tomcat
Spring Boot 程序打 Jar 包與運行
通過 java 命令執行 jar 包,相當於啓動內嵌 tomcat
在覈心配置文件中配置的tomcat信息依然有效
SpringBoot集成logback日誌
- Spring Boot 官方推薦優先使用帶有 -spring 的文件名作爲你的日誌配置(如使用logback-spring.xml ,而不是logback.xml),命名爲 logback-spring.xml 的日誌配置文件。
- 默認的命名規則,並且放在 src/main/resources 下如果你即想完全掌控日誌配置,但又不想用 logback.xml 作爲 Logback 配置的名字application.yml 可以通過 logging.config 屬性指定自定義的名字:
logging.config=classpath:logging-config.xml
針對 DAO 的包進行 DEBUG 日誌設置:
<logger name="com.abc.springboot.mapper" level="DEBUG" />
代碼裏打印日誌
1、在 pom.xml 中添加依賴
<!--@Slf4j 自動化日誌對象-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
2、 logback-spring.xml
日誌級別從低到高分爲 TRACE < DEBUG < INFO < WARN < ERROR < FATAL
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日誌級別從低到高分爲 TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置爲 WARN,則低於 WARN 的信息都不會輸出 -->
<!-- scan:當此屬性設置爲 true 時,配置文件如果發生改變,將會被重新加載,默認值爲
true -->
<!-- scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認
單位是毫秒。當 scan 爲 true 時,此屬性生效。默認的時間間隔爲 1 分鐘。 -->
<!-- debug:當此屬性設置爲 true 時,將打印出 logback 內部日誌信息,實時查看 logback
運行狀態。默認值爲 false。通常不打印 -->
<configuration scan="true" scanPeriod="10 seconds">
<!--輸出到控制檯-->
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!--此日誌 appender 是爲開發使用,只配置最底級別,控制檯輸出的日誌級別是大
於或等於此級別的日誌信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>%date [%-5p] [%thread] %logger{60} [%file : %line] %msg%n</Pattern>
<!-- 設置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--<File>/home/log/stdout.log</File>-->
<File>D:/log/stdout.log</File>
<encoder>
<pattern>%date [%-5p] %thread %logger{60} [%file : %line] %msg%n</pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 添加.gz 歷史日誌會啓用壓縮 大大縮小日誌文件所佔空間 -->
<!--<fileNamePattern>/home/log/stdout.log.%d{yyyy-MM-dd}.log</fileNam
ePattern>-->
<fileNamePattern>D:/log/stdout.log.%d{yyyy-MM-dd}.log</fileNamePatter
n>
<maxHistory>30</maxHistory><!-- 保留 30 天日誌 -->
</rollingPolicy>
</appender>
<logger name="com.abc.springboot.mapper" level="DEBUG" />
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>