Springboot第三章 SpringBoot 和 web 组件

Posted 王六六的IT日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot第三章 SpringBoot 和 web 组件相关的知识,希望对你有一定的参考价值。

第三章 SpringBoot 和 web 组件

三个组件:拦截器、Servlet 、Filter

3.1 SpringBoot中拦截器

拦截器是SpringMVC中一种对象,能拦截器对Controller的请求。
拦截器框架中有系统的拦截器, 还可以自定义拦截器,实现对请求预先处理。

实现自定义拦截器:

1.创建类实现SpringMVC框架的HandlerInterceptor接口
HandlerInterceptor有三个默认方法,主要用第一个,来实现对请求的拦截和请求的预先处理,返回值是布尔值。返回值true代表通过拦截器的验证,请求是可以被系统处理的。

2.需在SpringMVC的配置文件声明拦截器

<mvc:interceptors>
	<mvc:interceptor>
    	<mvc:path="url" />
        <bean class="拦截器类全限定名称"/>
    </mvc:interceptor>
</mvc:interceptors>

在SpringMVC 框架中需要以上操作。


接下来是Springboot中怎么创建拦截器以及怎么放进框架中:

1.自定义拦截器:web👉LoginInterceptor

重写preHandle方法


👇

public class LoginInterceptor implements HandlerInterceptor  
    /**
     * @param request
     * @param response
     * @param handler  被拦截器的控制器对象
     * @return boolean
     *    true: 请求能被Controller处理
     *    false: 请求被截断
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception 
        System.out.println("执行了LoginInterceptor的preHandle");
        return true;
    

  1. 需要把拦截器加入容器中才能起作用,自定义一个类实现WebMvcConfigurer的接口。

    WebMvcConfigurer中有很多默认方法:

    重写addInterceptors


运行主函数:

访问user/account:

拦截器运行:

访问user/login不会拦截:

3.2 Servlet

在SpringBoot框架中使用Servlet对象。

使用步骤:

  1. 创建Servlet类。 创建类继承HttpServlet
  2. 注册Servlet ,让框架能找到Servlet:ServletRegistrationBean

例子:
1.创建自定义Servlet类

//创建Servlet类
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 
       //使用HttpServletResponse输出数据,应答结果
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out  = resp.getWriter();
        out.println("===执行的是Servlet==");
        out.flush();
        out.close();
    

2.注册Servlet

ServletRegistrationBean这个类源码:

ServletRegistrationBean的第一个参数是 Servlet对象, 第二个是url地址:

public ServletRegistrationBean(T servlet, String... urlMappings)     
@Configuration
public class WebApplictionConfig 
    //定义方法, 注册Servlet对象
    @Bean
    public ServletRegistrationBean servletRegistrationBean()
        ServletRegistrationBean bean = new ServletRegistrationBean( new MyServlet(),"/myservlet");
   
        return bean;
    

运行主函数,浏览器输入访问地址:

servletRegistrationBean的无参构造方法:

@Configuration
public class WebApplictionConfig 
    //定义方法, 注册Servlet对象
    @Bean
    public ServletRegistrationBean servletRegistrationBean()

        //两个参数
//        ServletRegistrationBean bean = new ServletRegistrationBean( new MyServlet(),"/myservlet");

        //无参构造
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet( new MyServlet());
        bean.addUrlMappings("/login","/test"); // <url-pattern>
        
        return bean;
    

运行主函数,在浏览器输入地址:

3.3 过滤器Filter

Filter是Servlet规范中的过滤器,可以处理请求, 对请求的参数、属性进行调整。 常常在过滤器中处理字符编码

在Springboot框架中使用过滤器:

  1. 创建自定义过滤器类
  2. 注册Filter过滤器对象

例子:
1. 自定义过滤器:自定义过滤器类并实现Filter接口
web 👉 MyFilter

// 自定义过滤器
public class MyFilter implements Filter 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
        System.out.println("执行了MyFilter,doFilter ");
        filterChain.doFilter(servletRequest,servletResponse);
    

2. 注册Filter: filterRegistrationBean

@Configuration
public class WebApplicationConfig 
    @Bean
    public FilterRegistrationBean filterRegistrationBean()
        //无参构造
        FilterRegistrationBean bean  = new FilterRegistrationBean();
        //对象
        bean.setFilter( new MyFilter() );
        //地址
        bean.addUrlPatterns("/user/*");
        return bean;
    

@Controller
public class CustomFilterController 

    @RequestMapping("/user/account")
    @ResponseBody
    public String userAccount()
        return "访问user/account地址";
    

    @RequestMapping("/query")
    @ResponseBody
    public String queryAccount()
        return "访问/query地址";
    


执行主函数,在浏览器输入访问地址:


将日志清空,再输入/query

日志输出:

3.4 字符集过滤器

CharacterEncodingFilter : 解决post请求中乱码的问题

SpringMVC框架中 在web.xml 注册过滤器, 配置它的属性。

第一种方式:
使用步骤:



执行主函数,在浏览器输入访问地址:


Springboot框架中使用过滤器解决乱码问题:
1.在配置类中,配置字符集过滤器,filterRegistrationBean

@Configuration
public class WebSystemConfig 
    //注册Servlet
    @Bean
    public ServletRegistrationBean servletRegistrationBean()
        MyServlet myServlet = new MyServlet();
        ServletRegistrationBean reg = new ServletRegistrationBean(myServlet,"/myservlet");
        return reg;
    
    //注册Filter
    @Bean
    public FilterRegistrationBean filterRegistrationBean()
        FilterRegistrationBean reg = new FilterRegistrationBean();

        //使用框架中的过滤器类
        CharacterEncodingFilter filter  = new CharacterEncodingFilter();
        //指定使用的编码方式
        filter.setEncoding("utf-8");
        //指定request , response都使用encoding的值
        filter.setForceEncoding(true);

        reg.setFilter(filter);
        //指定 过滤的url地址
        reg.addUrlPatterns("/*");

        return reg;
        
    

2.修改application.properties文件, 让自定义的过滤器起作用
SpringBoot中默认已经配置了CharacterEncodingFilter。编码默认ISO-8859-1。
设置enabled=false 作用是关闭系统中配置好的过滤器, 使用自定义的CharacterEncodingFilter。

server.servlet.encoding.enabled=false

第二种方式 简单的方式使用字符集过滤器
不需要在config文件中注册过滤器。只需要修改application.properties文件

server.port=9001
server.servlet.context-path=/myboot

#让系统的CharacterEncdoingFilter生效
server.servlet.encoding.enabled=true
#指定使用的编码方式
server.servlet.encoding.charset=utf-8
#强制request,response都使用charset属性的值
server.servlet.encoding.force=true

以上是关于Springboot第三章 SpringBoot 和 web 组件的主要内容,如果未能解决你的问题,请参考以下文章

springboot第三天---SpringBoot属性配置

SpringBoot 系列

Springboot引入外部第三方jar包

(转)SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql

还在使用第三方Docker插件?SpringBoot官方插件真香!

第三章 springboot + jedisCluster