SpringBoot-2

前言:拦截器,过滤器以及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);
​
    }
}

运行截图:

被拦截的页面显示空白:

没有被拦截的页面:

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 "无过滤器";
    }
​
}

运行截图:

 控制台出现:

而后者

控制台无反应

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;
    }
}

运行截图:

界面内容显示乱码。

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

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

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

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

就可以了。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简单点了

谢谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值