一.SpringBoot使用拦截器
这里补充一下拦截器和过滤器区别
1.本质的区别:
Filter过滤器是Servlet定义的规范,是Servlet容器支持的。而拦截器是Spring框架定义的,被Spring所支持。
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2.使用范围不同:
Filter过滤器只能用户Web程序中,而拦截器既可以在Web程序中使用也可以在Application等程序中使用。
3.功能深度不同:
Filter过滤器只能在Servlet的前后起作用,而拦截器可以深入到方法的前后进行拦截,所以拦截器的功能更加强大,并且还可以使用Spring中任何一个资源和对象。
拦截器和SpringAOP关系
1.作用层面
拦截器只对action负责,作用层面一般位于Controller层
Spring AOP主要是拦截对Spring管理的Bean的访问,一般作用与Service层
2、联系与区别
联系:
Spring AOP和拦截器一样,都是AOP的实现方式的一种,均使用代理模式实现。
区别:
1、拦截器和过滤器有点相似,是链式的处理模式,这样有一个缺点就是,每次请求,都会访问action的上下文,不够灵活
2、Spring AOP的注解有@Before、@After、@AfterReturning、@AfterThrowing、@Around,可以更灵活的配置要监听处理的Bean
1.1 回顾SpringMVC使用拦截器的步骤
1.自定义拦截类,实现HanderInterceptor接口
2.注册拦截类
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/index"/>
<bean class="com.springmvc.intercepter.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3.按照SpringMVC方式编写一个拦截类,实现HandlerInterceptor接口
package com.springmvc.intercepter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
private final static Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("进入 preHandle 方法..." + request.getRequestURL().toString() + "," + request.getRequestURI());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("进入 postHandle 方法..." + request.getRequestURL().toString() + "," + request.getRequestURI());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("进入 afterCompletion 方法..." + request.getRequestURL().toString() + "," + request.getRequestURI());
}
}
1.2 SpringBoot 使用拦截器步骤
1.创建一个springBoot框架Web项目
2.实现一个登陆拦截器
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入拦截器------------------------------");
//编写业务拦截的规则
//从session中获取用户的信息
User user = (User) request.getSession().getAttribute("user");
//判断用户是否登录
if (null == user) {
//未登录
response.sendRedirect(request.getContextPath() + "/user/error");
return false;
}
return true;
}
3.创建一个控制层
@Controller
@RequestMapping(value = "/user")
public class UserController {
//用户登录的请求,需要排除
@RequestMapping(value = "/login")
public @ResponseBody Object login(HttpServletRequest request) {
//将用户的信息存放到session中
User user = new User();
user.setId(1001);
user.setUsername("zhangsan");
request.getSession().setAttribute("user",user);
return "login SUCCESS";
}
//该请求需要用户登录之后才可访问
@RequestMapping(value = "/center")
public @ResponseBody Object center() {
return "See Center Message";
}
//该请求不登录也可访问
@RequestMapping(value = "/out")
public @ResponseBody Object out() {
return "Out see anytime";
}
//如果用户未登录访问了需要登录才可访问的请求,之后会跳转至该请求路径
//该请求路径不需要用户登录也可访问
@RequestMapping(value = "/error")
public @ResponseBody Object error() {
return "error";
}
}
- @Conffiguration定义配置类-拦截器
在 项 目 中 创 建 一 个 config 包 , 创 建 一 个 配 置 类 InterceptorConfig , 并 实 现WebMvcConfigurer 接口, 覆盖接口中的 addInterceptors 方法,并为该配置类添加@Configuration 注解,标注此类为一个配置类,让 Spring Boot 扫描到,这里的操作就相当于 SpringMVC 的注册拦截器 ,@Configuration 就相当于一个 *applicationContext-mvc.xml
@Configuration //定义此类为配置文件(即相当于之前的xml配置文件)
public class InterceptorConfig implements WebMvcConfigurer {
//mvc:interceptors
@Override
public void addInterceptors(InterceptorRegistry registry) {
//要拦截user下的所有访问请求,必须用户登录后才可访问,
// 但是这样拦截的路径中有一些是不需要用户登录也可访问的
String[] addPathPatterns = {
"/user/**"
};
//要排除的路径,排除的路径说明不需要用户登录也可访问
String[] excludePathPatterns = {
"/user/out", "/user/error","/user/login"
};
//mvc:interceptor bean class=""
registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
}
}
二 . SpringBoot配置字符编码
2.1 使用传统的Spring提供的字符编码过滤器
1.创建一个项目
2.创建一个Servlet
@WebServlet(urlPatterns = "/myservlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("世界您好,Hello World!");
//统一设置浏览器编码格式
resp.setContentType("text/html;character=utf-8");
resp.getWriter().flush();
resp.getWriter().close();
}
3.创建配置类SystemConfig
@Configuration //将此类定义为配置文件(即相当于之前的xml配置文件)
public class SystemConfig {
@Bean
public FilterRegistrationBean characterEncodingFilterRegistrationBean() {
//创建字符编码过滤器
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
//设置强制使用指定字符编码
characterEncodingFilter.setForceEncoding(true);
//设置指定字符编码
characterEncodingFilter.setEncoding("UTF-8");
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
//设置字符编码过滤器
filterRegistrationBean.setFilter(characterEncodingFilter);
//设置字符编码过滤器路径
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
4.关闭SpringBoot的http字符编码支持
#关闭springboot的http字符编码支持
#只有关闭该选项后,spring字符编码过滤器过生效
spring.http.encoding.enabled=false
2.2 在 application.properties中设置字符编码(推荐)
1.创建SpringBoot web项目
2.spingboot 核心配置文件添加字符编码设置
#设置请求响应字符编码
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.http.encoding.charset=utf-8
3.创建Servlet
@WebServlet(urlPatterns = "/myservlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("世界您好,Hello World!");
resp.setContentType("text/html;character=utf-8");
resp.getWriter().flush();
resp.getWriter().close();
}
4.创建配置类ServletConfig(servlet配置了@WebServlet时不用创建配置类)
@Configuration
public class ServletConfig{
@Bean
public ServletRegistrationBean myServletRegistration(){
ServeletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(),"/myservlet");
return servletRegisrationBean;
}
}