SpringBoot(四)配置拦截器、filter、跨域

145 阅读3分钟

上文中我们在项目中配置了java日志。接下来我们要在项目中配置拦截器,filter和跨域操作。

 

我这里只是大概的记录一下如何配置在项目中配置,具体的使用后边用到的时候会详细的介绍。

 

一:配置filter

我这里直接在代码中演示:

编写一个Filter类

在项目根目录下的src\main\java\com\springbootblog目录下创建filter目录下创建TestFilter.java,代码如下:

package com.springbootblog.filter;
 
 import javax.servlet.*;
 import java.io.IOException;
 
 public class TestFilter implements Filter
 {
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
 
     }
 
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
         System.out.println("TestFilter.doFilter111111111111111111111111111111111111111111111111111111111111111111");
         filterChain.doFilter(servletRequest,servletResponse);
     }
 
     @Override
     public void destroy() {
 
     }
 }

通过JavaConfig将Filter配置进去

在src\main\java\com\springbootblog目录下创建config目录下创建FilterConfig.java,代码如下:

package com.springbootblog.config;
 
 import com.springbootblog.filter.TestFilter;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
 public class FilterConfig {
     @Bean
     public FilterRegistrationBean<TestFilter> registrationBean(){
         FilterRegistrationBean<TestFilter> filterRegistrationBean = new FilterRegistrationBean<>();
         filterRegistrationBean.setFilter(new TestFilter());
         filterRegistrationBean.addUrlPatterns("/*");  //setUrlPatterns() 一次性将映射关系配置进去
         filterRegistrationBean.setOrder(1);
         filterRegistrationBean.setName("filter");
         return filterRegistrationBean;
     }
 }

重启服务器,在浏览器中访问:http://localhost:1021/test

控制台输出:

TestFilter.doFilter111111111111111111111111111111111111111111111111111111111111111111

 

说明filter在SpringBoot中启用完成。

 

最后放一下filter需要的文件的目录结构:

1.jpg

 

二:配置拦截器

Filter 过滤器是可以拦截所有东西,但是 SpringBoot 拦截器只能拦截 Controller

 

我们需要自定义编写一个拦截器。

 

拦截器需要实现接口HandlerInterceptor,在项目根目录下的src\main\java\com\springbootblog目录下创建interceptor目录下创建TestInterceptor.java,代码如下:

package com.springbootblog.interceptor;
 
 import org.springframework.web.servlet.HandlerInterceptor;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 public class TestInterceptor implements HandlerInterceptor
 {
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
     {
         // 执行拦截操作
         System.out.println("TestInterceptor.preHandle");
         // 代码往下进行
         return true;
     }
 }

拦截器到这里就编写完成了,我们需要在javaconfig中将其配置进去。

在项目根目录下的src\main\java\com\springbootblog目录下创建config目录下创建InterceptorConfig.java,代码如下:

package com.springbootblog.config;
 
 import com.springbootblog.interceptor.TestInterceptor;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 @Configuration
 public class InterceptorConfig implements WebMvcConfigurer {
     @Override
     public void addInterceptors(InterceptorRegistry registry)
     {
         // 注册拦截器 并配置拦截所有方法  除了count方法
         registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**").excludePathPatterns("/count");
     }
 }

接下来我们在AdminController.java中测试,代码如下:

package com.springbootblog.controller;
 
 import com.springbootblog.dao.AdminDao;
 import com.springbootblog.pojo.Admin;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.List;
 
 @Controller
 public class AdminController
 {
     /**
      * 定义一个静态常量日志对象
      */
     private static final Logger logger = LoggerFactory.getLogger(AdminController.class);
 
     // 自动装载(dao接口注入)
     @Autowired
     private AdminDao adminDao;
 
     @RequestMapping("test")
     @ResponseBody
     public List<Admin> selectByExample()
     {
         System.out.println(121);
         // 输出日志信息
         logger.info("selectByExample,info:");
         logger.trace("selectByExample,trace:");
         logger.debug("selectByExample,debug:");
         logger.warn("selectByExample,warn:");
         logger.error("selectByExample,error:");
         List<Admin> list = adminDao.selectByExample(null);
         return list;
     }
 
     @RequestMapping("count")
     @ResponseBody
     public int count()
     {
         System.out.println(3533);
         int num = (int)adminDao.countByExample(null);
         return num;
     }
 
 }

重启服务器,我们在浏览器中输入:http://localhost:1021/test

浏览器中输出了一段json(数据库返回的数据)

控制台输出:

TestFilter.doFilter111111111111111111111111111111111111111111111111111111111111111111
3533

 

这部分是没有问题的,我们将count方法排除了,不需要拦截

 

我们再在浏览器中输入:http://localhost:1021/test

浏览器中输出了一数字:15

控制台输出:

TestFilter.doFilter111111111111111111111111111111111111111111111111111111111111111111
TestInterceptor.preHandle
121

 

通过上方输入,我们发现拦截器起作用了。

 

三:配置跨域

这部分就比较简单了。

在项目根目录下的src\main\java\com\springbootblog目录下创建config目录下创建CrosConfig.java,代码如下:

package com.springbootblog.config;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
 
 /**
  * 跨域配置
  */
 @Configuration
 public class CrosConfig extends WebMvcConfigurationSupport
 {
     @Override
     protected void addCorsMappings(CorsRegistry registry)
     {
         registry.addMapping("/**")
                 .allowedOrigins("*")
                 .allowedMethods("GET""HEAD""POST","PUT""DELETE""OPTIONS")
                 .allowedHeaders("*")
                 .exposedHeaders("access-control-allow-headers",
                         "access-control-allow-methods",
                         "access-control-allow-origin",
                         "access-control-max-age",
                         "X-Frame-Options")
                 .allowCredentials(false).maxAge(3600);// 超时时间
         super.addCorsMappings(registry);
     }
 }

跨域这就配置完成了。

 

以上大概就是springboot项目拦截器、filter、跨域的基本配置。

 

有好的建议,请在下方输入你的评论。