SpringBoot(六):拦截器+servlet+过滤器+解决乱码问题

1、拦截器

1.1创建拦截器类

拦截器类要实现HandlerInterceptor接口,这个接口有以下三个方法:

  • preHandle
  • postHandle
  • afterCompletion

我们以第一个为例,实际上用的最多的还是第一个,这是在访问之前执行的方法。示例代码如下,这个代码是判断用户是否登录过。

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

preHandle的返回值是boolean类型,如果是true则放行,否则不放行。

1.2创建配置类对象

在SpringMVC中,我们在创建完毕后就开在SpringMVC的配置文件中加入注解,但是在SpringBoot不是这样的。需要创建一个配置类,类应该实现WebMvcConfigurer接口示例代码如下:

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        //拦截user下面的所有的访问请求,必须用户后才可以访问,但是这样的拦截的路径中有一些是不需要
        //用户登录也可以访问的
        String[] addPathPatterns={
                "/user/**"  //**的意思是下面的各层目录下的都算
        };
        //要排除的路径,排出的路径不需要用户登录也可以访问
        String[] excludepathPatterns={
                "/user/out","/user/error","/user/login"
        };
        //mvc:interceptors bean class=""
        registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludepathPatterns);
    }

2.servlet(了解就行)

2.1使用注解

第一步:创建servlet类,类名不限,继承HttpServlet,在类上面加入注解@WebServlet(urlPatterns = “/名称”)
第二步:在springboot的启动入口加入注解@ServletComponentScan(basePackages = “servlet包的路径”)

2.2使用配置类

第一步:创建servlet类,继承HttpServlet类
第二步:创建配置类,示例如下:

@Configuration//该注解将此类定义为配置类(相当于xml配置文件)
public class ServletConfig {
    //是一个方法级别上的注解,主要用于配置类里面
    //相当于一个bean标签
    @Bean
    public ServletRegistrationBean myServletReqistryBean(){
        ServletRegistrationBean servletRegistrationBean=new ServletRegistrationBean(new 自己创建的servlet类,"/访问路径");
        return servletRegistrationBean;
    }
}

3.过滤器

3.1使用注解

第一步:创建过滤器类,实现Filter接口,在类的上面加入注解@WebFilter(urlPatterns = “/访问路径”)
示例代码如下:

@WebFilter(urlPatterns = "/myfilter")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("--------您以进入过滤器------");
        filterChain.doFilter(servletRequest,servletResponse);//放行
    }
}

第二步:Springboot的启动类上面加入@ServletComponentScan(basePackages = “过滤器类所在的包的路径”)

3.2使用配置类

第一步:创建过滤器类,实现Filter接口
第二步:创建配置类。配置类上面加入@Configuration,类的方法上面加入 @Bean,示例代码如下:

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean myFilterRegistrationBean(){
        //注册过滤器
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean(new 自己创建的过滤器类());
        //添加过滤路径,只能一个星星
        filterRegistrationBean.addUrlPatterns("/user/*");

        return filterRegistrationBean;
    }
}

4.配置字符编码

4.1第一种方法

第一步:创建servlet,步骤如上。
第二步:创建配置类,创建配置方法。示例代码如下:

@Bean
public FilterRegistrationBean characterFilterRegistration() {
//设置字符编码过滤器
//CharacterEncoding 是由 Spring 提供的一个字符编码过滤器,之前是配置在
web.xml 文件中
CharacterEncodingFilter characterEncodingFilter = new
CharacterEncodingFilter();
//强制使用指定字符编码
characterEncodingFilter.setForceEncoding(true);
//设置指定字符编码
characterEncodingFilter.setEncoding("UTF-8");
//创建过滤器注册 bean
FilterRegistrationBean filterRegistrationBean = new
FilterRegistrationBean();
//设置字符编码过滤器
filterRegistrationBean.setFilter(characterEncodingFilter);
//设置字符编码过滤器路径
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}

第三步:在servlet的类中的方法区加入

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

第四步:关闭 SpringBoot 的 http 字符编码支持
在SpringBoot配置文件中加入以下配置:

#关闭springboot的http字符编码的支持
#只有关闭该选项后,spring字符编码过滤器生效
server.servlet.encoding.enabled=false

7.2第二种方式

第一步:SpringBoot 核心配置文件添加字符编码设置

#设置请求响应的字符编码
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8

第二步:创建servlet类,略。
第三步:在servlet类的方法中加入
resp.setContentType(“text/html;character=utf-8”);

猜你喜欢

转载自blog.csdn.net/qq_41984117/article/details/111145126