一、过滤器
首先在启动类加注解
@SpringBootApplication
@ServletComponentScan //用于进行servlet组件扫描
public class Springboot03Application {
public static void main(String[] args) {
SpringApplication.run(Springboot03Application.class, args);
}
}
/**
* 基于servlet3.x版本的过滤器,所以需要使用注解
*/
@WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化操作-----------");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//获取用户名
String name = request.getParameter("name");
//如果获取的用户名与给定的用户名相同,则放行
if("jack".equals(name)){
filterChain.doFilter(servletRequest,servletResponse);//如果当前名字是Jack,则放行
}else{
response.sendRedirect("/login.html");
}
}
@Override
public void destroy() {
System.out.println("销毁操作-------");
}
}
二、自定义拦截器
- 1、自定义拦截器类,实现
HandlerInterceptor
接口
preHandle :调用Controller某个方法之前
postHandle :Controller之后调用,视图渲染之前,若控制器Controller出现异常,则不执行此方法
afterCompletion :不管有没有异常,这个afterCompletion都会被调用,用于资源清理
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true; //false代表拦截 true代表放行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
- 2、自定义类加注解
@Configuration
并实现 WebMvcConfigurer 接口类,重写addInterceptors(){}
/**
* 自定义拦截器
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("addInterceptors");
registry.addInterceptor(loginInterceptor).addPathPatterns("/api/*/**");
}
}
- 3、将1中的自定义拦截器加入到步骤2中的addInterceptors(){}方法中。
附:拦截器失效原因:
1)检查是否有注解@Configuration
2)拦截路径是否有 ** 和 *
3)拦截器最后路径一定要是 “/**”, 如果是目录的话则是 /*/
三、模板引擎 thymeleaf 与 freemark
- Freemarker Template Lanaguage (FTL) 文件后缀是.ftl
特点:严格依赖MVC模式,不依赖Servlet容器。不消耗性
基础配置:
#freemarker基础配置
# 是否开启thymeleaf缓存,本地为false,生产建议为true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.allow-request-override=false
spring.freemarker.check-template-location=true
#类型
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
#文件后缀
spring.freemarker.suffix=.ftl
#路径
spring.freemarker.template-loader-path=classpath:/templates/
引入freemarker模板引擎的依赖
<!-- 引入freemarker模板引擎的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- Thymeleaf(springboot 主推)
特点:轻量级模板引擎,页面有复杂业务,不推荐使用。比如页面有很多个判断(会导致解析DOM或者XML占用过多内存)。
基础配置:
#thymeleaf基础配置
#开发时关闭缓存,不然没法看到实时页面
spring.thymeleaf.cache=false
spring.thymeleaf.mode=HTML5
#前缀
spring.thymeleaf.prefix=classpath:/templates/
#编码
spring.thymeleaf.encoding=UTF-8
#类型
spring.thymeleaf.servlet.content-type=text/html
#名称的后缀
spring.thymeleaf.suffix=.html
引入thymeleaf相关maven依赖
<!--thymeleaf相关maven依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>