目录:

(1)拦截器的使用

(2)使用Servlet

 (3)过滤器的使用

字符集过滤的两种方式:

(4)字符集过滤器的应用:使用自定义过滤器

(5)在配置文件中设置编码方式


(1)拦截器的使用

springboot 特殊字符入参被转义_spring boot

springboot 特殊字符入参被转义_java_02

springboot 特殊字符入参被转义_spring boot_03

 

springboot 特殊字符入参被转义_servlet_04

创建拦截器的实现类:LoginInterceptor Ctrl+i 只实现preHandle()方法即可:

package com.bjpowernode.web;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自定义拦截器

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

用这个拦截器,需要把这个拦截器加入到容器中才能起作用,创建好了拦截器怎么把它加入到容器中呢?

需要创建一个实现类,实现WebMvcConfigurer接口,这个接口有很多跟springmvc相关的功能,都在这个接口中实现了

 原来我们要注册拦截器,需要写springmvc.xml的配文件,现在把文件中的配置移到了这个接口的方法中:

MyAppConfig:

package com.bjpowernode.config;

import com.bjpowernode.web.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyAppConfig implements WebMvcConfigurer {
    //用到拦截器需要实现这个方法,添加拦截器对象,注入到容器中
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //创建拦截器对象
        HandlerInterceptor interceptor=new LoginInterceptor();

        //指定拦截的请求url地址
        String path []={"/user/**"};
        //指定不拦截的地址
        String excludePath []={"/user/login"};

        /*
        * addInterceptor()添加拦截器
        * addPathPatterns()添加拦截的地址
        * excludePathPatterns() 排除不拦截的地址
        * */
        registry.addInterceptor(interceptor).addPathPatterns(path).excludePathPatterns(excludePath);
    }
}

创建控制器:BootController:

package com.bjpowernode.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class BootController {

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

    //拦截器之歌方法请求不拦截
    @RequestMapping("/user/login")
    @ResponseBody
    public String userLogin(){
        return "访问user/login地址";
    }
}

主启动类Application:进行启动项目:

package com.bjpowernode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

在地址栏输入: 访问user/account

springboot 特殊字符入参被转义_拦截器_05

 控制台会有输出:

springboot 特殊字符入参被转义_java_06

 

springboot 特殊字符入参被转义_拦截器_07

在地址栏访问:user/login

springboot 特殊字符入参被转义_java_08

但是控制台 没有输出:由于此请求没有被拦截,控制台没有输出

springboot 特殊字符入参被转义_拦截器_09

注意这里的user/account请求拦截了,但是preHand方法中返回true所以会正常执行,

排除:是指不经过拦截器,也就不会有输出,user/login的请求是不被拦截的

(2)使用Servlet

springboot 特殊字符入参被转义_拦截器_10

springboot 特殊字符入参被转义_java_11

 

springboot 特殊字符入参被转义_servlet_12

springboot 特殊字符入参被转义_java_13

创建Servlet:MyServlet:

package com.bjpowernode.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//创建Servler类
public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);//Get方法中调用doPost这样无论是get请求,还是Post请求都能处理
    }

    @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();
    }
}

注册Servlet: 

创建的Servlet要想能够被访问就得有对象,这个对象Servlet通过框架才能找到Servlet,所以进行Servlet进行注册,注册用到的类是ServletRegistrationBean,通过写一个配置类,定义一个方法返回值ServletRegistrationBean

创建配置类WebApplicationConfig:先使用ServletRegistrationBean有参构造两个参数的

package com.bjpowernode.config;

import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebApplicationConfig {

    //通过这个方法就可以得到Servlet对象和访问地址的信息
    //定义方法,注册Servle对象
    @Bean //注解将这个对象放到容器中,通过这个对象可以找到里面存放的Servlet
    public ServletRegistrationBean servletRegistrationBean(){

        //public ServletRegistrationBean(T servlet, String... urlMappings)
        //第一个参数是:Servlet对象 第二个参数是:url地址
        ServletRegistrationBean bean=new ServletRegistrationBean(new MyServlet(),"/myservlet");
        return bean;
    }
}

主启动类:Application,进行启动项目:

package com.bjpowernode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

在浏览器地址栏输入:

springboot 特殊字符入参被转义_spring boot_14

 使用ServletRegistrationBean没有参构造参数的

WebApplicationConfig:注释掉有参数的

package com.bjpowernode.config;

import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebApplicationConfig {

    //通过这个方法就可以得到Servlet对象和访问地址的信息
    //定义方法,注册Servle对象
    @Bean //注解将这个对象放到容器中,通过这个对象可以找到里面存放的Servlet
    public ServletRegistrationBean servletRegistrationBean(){

        //public ServletRegistrationBean(T servlet, String... urlMappings)
        //第一个参数是:Servlet对象 第二个参数是:url地址
        //ServletRegistrationBean bean=new ServletRegistrationBean(new MyServlet(),"/myservlet");

        ServletRegistrationBean bean=new ServletRegistrationBean();
        bean.setServlet(new MyServlet());
        bean.addUrlMappings("/login","/test"); //相当于<url-pattern>

        return bean;
    }
}

Servlet: 

springboot 特殊字符入参被转义_拦截器_15

 在浏览器输入:http:localhost:8080/login

springboot 特殊字符入参被转义_spring_16

 输入另外另一个访问地址:http:localhost:8080/test

springboot 特殊字符入参被转义_servlet_17

 (3)过滤器的使用

springboot 特殊字符入参被转义_servlet_18

springboot 特殊字符入参被转义_spring boot_19

 

springboot 特殊字符入参被转义_拦截器_20

创建过滤器:MyFilter:

package com.bjlpokwernode.web;

import javax.servlet.*;
import java.io.IOException;
//自定义过滤器
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了MyFilter,doFilter");
        //要想请求能够执行下去,需要来执行,过滤器那个链filterChain,这样请求就能够往后传递,能够处理请求了
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

 注册过滤器:

创建配置类:WebApplicationConfig:

package com.bjlpokwernode.config;

import com.bjlpokwernode.web.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebApplicationConfig {
    //返回值,过滤器注册的对象
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean bean=new FilterRegistrationBean();
        //指定过滤器
        bean.setFilter(new MyFilter());
        //过滤器地址
        bean.addUrlPatterns("/user/*");
        return bean;
    }
}

 创建控制器:

CustomFilterController:

package com.bjlpokwernode.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class CustomFilterController {
    @RequestMapping("/user/account")
    @ResponseBody
    public String userAccount(){
        return "user/account";
    }

    //不会进行过滤
    @RequestMapping("/querty")
    @ResponseBody
    public String queryAccount(){
        return "query";
    }
}

主启动类Application:启动项目:

package com.bjlpokwernode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

在浏览器进行访问

springboot 特殊字符入参被转义_java_21

 控制台输出了:过滤器中的内容

springboot 特殊字符入参被转义_spring_22

 

springboot 特殊字符入参被转义_servlet_23

输入:

springboot 特殊字符入参被转义_servlet_24

控制台没有输出:

springboot 特殊字符入参被转义_拦截器_25

(4)字符集过滤器的应用:使用自定义过滤器

springboot 特殊字符入参被转义_servlet_26

CharacterEncodingFilter过滤器:不是自己写的,在springmvc框架中有这个过滤器类的 

springboot 特殊字符入参被转义_spring boot_27

创建Servlet:MyServlet:

package com.bjpowernode.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

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

配置类:WebSystenConfig:

package com.bjpowernode.config;

import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebSystemConfig {
    //注册Servlet
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        MyServlet myServlet=new MyServlet();

        ServletRegistrationBean reg=new ServletRegistrationBean(myServlet,"/myservlet");
        return reg;
    }
}

主启动类Application:启动项目:

package com.bjpowernode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

在浏览器访问:发现输出的中文乱码 

springboot 特殊字符入参被转义_spring_28

 默认编码方式IOS-8859-1

springboot 特殊字符入参被转义_拦截器_29

 设置字符集过滤器

springboot 特殊字符入参被转义_servlet_26

springboot 特殊字符入参被转义_拦截器_31

springboot 特殊字符入参被转义_拦截器_32

 使用字符集过滤器:

WebSystenConfig:注册过滤器

package com.bjpowernode.config;

import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;

@Configuration
public class WebSystemConfig {
    //注册Servlet
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        MyServlet myServlet=new MyServlet();

        ServletRegistrationBean reg=new ServletRegistrationBean(myServlet,"/myservlet");
        return reg;
    }

    //注册过滤器:
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean reg=new FilterRegistrationBean();

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

        //添加过滤器
        reg.setFilter(filter);
        //指定过滤器过滤的url地址 /*代表所有地址
        reg.addUrlPatterns("/*");

        return reg;
    }
}

在配置文件application.properties中:

#SpringBoot中默认已经配置了CharacterEncodingFilter,true,默认编码IOS-8859-1
#需要设置enabled=false,作用是关闭系统中配置好的过滤器,使用自定义的CharacterEncodingFliter
server.servlet.encoding.enabled=false

springboot 特殊字符入参被转义_servlet_33

使用过滤器之后:

springboot 特殊字符入参被转义_java_34

(5)在配置文件中设置编码方式

springboot 特殊字符入参被转义_spring boot_35

 MyServlet:

package com.bjpowernode.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

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输出中文,默认编码IOS-8859-1*********");
        out.flush();
        out.close();
    }
}

配置类:WebSystenConfig:

package com.bjpowernode.config;

import com.bjpowernode.web.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;

@Configuration
public class WebSystemConfig {
    //注册Servlet
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        MyServlet myServlet=new MyServlet();

        //第一个参数的过滤器对象,第二个是请求方式请求地址
        ServletRegistrationBean reg=new ServletRegistrationBean(myServlet,"/myservlet");
        return reg;
    }

}

配置文件application.properties:

#端口号
server.port=9001
#访问路径
server.servlet.context-path=/myboot

#让系统的CharacterEncodingFilter生效
server.servlet.encoding.enabled=true
#指定编码方式
server.servlet.encoding.charset=utf-8

#设置请求和应答对象都是用charset的值
server.servlet.encoding.force=true

主启动类:启动项目

package com.bjpowernode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

在浏览器输入地址: 

springboot 特殊字符入参被转义_拦截器_36