前言:拦截器,过滤器以及Servlet的基本使用。

1.拦截器

1.1简介

1.拦截器是Spring MVC中的一种对象,能拦截Controller的请求。

2.常见的拦截器的类型:

  • 系统拦截器
  • 自定义拦截器

3.作用:实现对请求的预处理

1.2创建拦截器

1.简单的登录拦截器

preHandle的返回值是true,直接放行。

返回值是false需要被拦截器处理。

拦截器处理时addPathPatterns()处理要拦截的url。

拦截器处理时excludePathPatterns()直接放行的url。

第一步:创建一个拦截器对象

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行了拦截器");
        return false;
    }
}

第二步:编写拦截器的配置

  • 先声明是一个配置类
  • 注入拦截器对象
@Configuration
public class InterceptptorConfig implements WebMvcConfigurer {
//  注入拦截器对象
    @Autowired
    HandlerInterceptor handlerInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /*
        *addPathPatterns()要拦截谁
        * excludePathPatterns()不拦截谁
         */
        String path="/user/**";
        String excludePath="/user/login";
        registry.addInterceptor(handlerInterceptor).excludePathPatterns(excludePath).addPathPatterns(path);

    }
}

运行截图:

被拦截的页面显示空白:

request 拦截器返回false 拦截器返回false到哪个_java

没有被拦截的页面:

request 拦截器返回false 拦截器返回false到哪个_拦截器_02

2.Servlet

2.1创建

继承HttpServlet,实现doget等方法实现Servlet

1.使用步骤:

  • 创建Servlet类
  • 注册Servlet,让框架能够找到Servlet

第一步:创建一个类继承HttpServlet。

@Component
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        out.println("执行的Servlet");
        out.close();

    }
}



第二步:注册Servlet(创建配置文件)。

  • 声明是一个配置文件
  • 将bean对象注入到容器中

第一种:有参构造的方式

  • ServletRegistrationBean有参构造
@Configuration
public class ServletConfig {

    @Autowired
    private MyServlet myServlet;
//    注册servlet对象
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
//        1.第一步:
        ServletRegistrationBean bean=new ServletRegistrationBean(myServlet,"/myservlet");
        return bean;
    }
}

第二种方式:

  • ServletRegistrationBean无参构造。
  • 其余和第一种方式一样。
ServletRegistrationBean bean=new ServletRegistrationBean();
bean.setServlet(myServlet);
bean.addUrlMappings("/myservlet");

3.过滤器

3.1简介

1.过滤器:是Servlet中的,拦截器是SpringMVC的。过滤器,常常在过滤器中处理字符编码,对请求的参数和属性进行调整。

3.2创建过滤器

Filter接口的实现。

1.创建一个基本的过滤器。

第一步:创建一个过滤器

  • 实现Filter接口。
//自定义过滤器
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("执行了过滤器!");
        chain.doFilter(request,response);
    }
}

第二步:注册Filter(编写配置文件)

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean registrationBean(){
        FilterRegistrationBean filter=new FilterRegistrationBean();
//        设置自定义的过滤器对象
        MyFilter myFilter=new MyFilter();
        filter.setFilter(myFilter);
        filter.addUrlPatterns("/user/*");
        return filter;
    }
}

第三步:编写测试的controller

@RestController
public class UserController {
    @RequestMapping("/user/account")
    public String UserAction(){
        return "过滤器";
    }
    @RequestMapping("/account")
    public String Action(){
        return "无过滤器";
    }

}

运行截图:

request 拦截器返回false 拦截器返回false到哪个_java_03

 控制台出现:

request 拦截器返回false 拦截器返回false到哪个_spring boot_04

而后者

request 拦截器返回false 拦截器返回false到哪个_java_05

控制台无反应

4.3字符集过滤器

自定义过滤器实现。

专有的字符集过滤器。

配置文件配置。

1.解决的是post请求中乱码的问题,SpringMVC中在xml中配置。

2.乱码问题

第一步:创建一个servlet

  • 输出一段中文
  • resp.setContentType("text/html");不指定编码的方式
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html");
        PrintWriter out=resp.getWriter();
        out.println("在Servlet中输出中文");
        out.flush();
        out.close();
    }
}

第二步:注册servlet

@Configuration
public class ServletConfig {

    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        ServletRegistrationBean bean=new ServletRegistrationBean(new MyServlet(),"/myservlet");

        return  bean;
    }
}

运行截图:

界面内容显示乱码。

request 拦截器返回false 拦截器返回false到哪个_java_06

查看响应头信息:编码方式ISO-8859-1

request 拦截器返回false 拦截器返回false到哪个_request 拦截器返回false_07

3.解决乱码问题方式1-自定义的Filter

只需要在创建的响应的类型加上一句:

resp.setContentType("text/html;charset=utf-8");

就可以了。

request 拦截器返回false 拦截器返回false到哪个_spring boot_08

4.解决乱码问题方式2-CharacterEncodingFilter过滤器

第一步:在JavaConfig文件中直接配置

  • 创建字符集的过滤器
  • 指定编码方式
  • 设置请求和响应都使用指定的编码
  • 设置过滤的路径
  • 配置文件中关闭默认的字符集过滤器
@Bean
    public FilterRegistrationBean registrationBean(){
        FilterRegistrationBean registrationBean=new FilterRegistrationBean();
//        使用框架中专有的过滤器类
        CharacterEncodingFilter characterEncodingFilter=new CharacterEncodingFilter();
//        指定编码方式
        characterEncodingFilter.setEncoding("utf-8");
//        指定req和reqs都使用指定的编码方式
        characterEncodingFilter.setForceEncoding(true);
//        指定url的过滤地址
        registrationBean.setFilter(characterEncodingFilter);
//        指定url的过滤地址
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }

第二步:关闭默认的字符集过滤器

#关闭系统配置好的过滤器
#server.servlet.encoding.enabled=false

5.解决乱码的方式3-配置文件设置编码方式

在配置文件中指定编码方式是最简洁的方式

#系统的字符集过滤器生效 server.servlet.encoding.enabled=true #指定使用的编码方式 server.servlet.encoding.charset=utf-8 #请求和响应都使用utf-8的响应方式 server.servlet.encoding.force=true

1.设置的方式

#系统的字符集过滤器生效
server.servlet.encoding.enabled=true
#指定使用的编码方式
server.servlet.encoding.charset=utf-8
#请求和响应都使用utf-8的响应方式
server.servlet.encoding.force=true