SpringBoot过滤器、监听、配置、异常处理、跨域等(三)

1、过滤器:创建CharacterEncodingFilte.java,用来做字符格式转化

package com.zzstxx.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.stereotype.Component;

/**
 * 过滤器
 * @author zxf
 */
@Component
@ServletComponentScan
@WebFilter(urlPatterns = "/hello1/*",filterName = "CharacterEncodingFilte")
public class CharacterEncodingFilte implements Filter {

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}
	
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) arg0;
		System.out.println("this is MyFilter,url :" + request.getRequestURI());
		arg2.doFilter(arg0, arg1);

	}
	
	public void destroy() {
		// TODO Auto-generated method stub

	}
}

 2、监听器

   (1)、创建SpringBoot配置类,并注册监听器

package com.zzstxx;

import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zzstxx.listener.ListenerTest;

/**
 * 配置管理类
 * @author zxf
 *
 */
@Configuration
public class WebConfig {
	
	public WebConfig() {
		System.out.println("加载SpringBoot配置WebConfig .........");
		// TODO Auto-generated constructor stub
	}

	/**
	 * 注册监听器
	 * @return
	 */
	@Bean
	public ServletListenerRegistrationBean<ListenerTest> servletListenerRegistrationBean() {
	    return new ServletListenerRegistrationBean<ListenerTest>(new ListenerTest());
	}
}

 (2)、创建监听器类

package com.zzstxx.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ListenerTest implements ServletContextListener {
	
	public void contextInitialized(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("监听器初始化...");
	}

	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("监听器销毁...");
		
	}
}

 3、错误页面处理

  当系统报错时,返回到页面的内容通常是一些杂乱的代码段,这种显示对用户来说不友好,因此我们需要自定义一个友好的提示系统异常的页面。在 src/main/resources 下创建 /public/error(路径是固定的,Spring Boot 会在系统报错时将返回视图指向该目录下的文件),在该目录下再创建一个名为 5xx.html 文件,该页面的内容就是当系统报错(错误代码以5开头的)时返回给用户浏览的内容:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>系统错误</title>
    <link href="/css/index.css" rel="stylesheet"/>
</head>
<body>
    <div class="container">
        <h2>系统内部错误</h2>
    </div>
</body>
</html>

上边处理的 5xx 状态码的问题,接下来解决 404 状态码的问题。

当出现 404 的情况时,用户浏览的页面也不够友好,因此我们也需要自定义一个友好的页面给用户展示。

在 /public/error 目录下再创建一个名为 404.html 的文件:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>访问异常</title>
    <link href="/css/index.css" rel="stylesheet"/>
</head>
<body>
    <div class="container">
        <h2>找不到页面</h2>
    </div>
</body>
</html>

 4、全局异常捕获

package com.zzstxx.exception;

import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局异常捕获
 * @author zxf
 * 
 */
@ControllerAdvice
public class GlobalDefaultExceptionHandler {

	/**
	 * 处理 Exception 类型的异常
	 * 
	 * @param e
	 * @return
	 */
	@ExceptionHandler(Exception.class)
	@ResponseBody
	public Map<String, Object> defaultExceptionHandler(Exception e) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("code", 500);
		map.put("msg", e.getMessage());
		return map;
	}
}

 5、解决跨域的问题:

  测试请求链接:http://localhost:8080/fastjson/test2

(1)、方式一

@Configuration
public class WebConfig {
    
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
          @Override
          public void addCorsMappings(CorsRegistry registry) {
              //fastjson为请求路径的一部分
              registry.addMapping("/fastjson/**")
                      .allowedOrigins("http://localhost:8088");// 允许 8088 端口访问
          }
        };
    }
}
 (2)、方式二
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/fastjson/**")
              .allowedOrigins("http://localhost:8088");// 允许 8088 端口访问
    }
}
 (3)、 细粒度控制

   在 FastJsonController 类中的方法上添加 @CrossOrigin(origins="xx") 注解:

@RequestMapping("/test")
@CrossOrigin(origins="http://localhost:8088")
public User test() {
    User user = new User();
    user.setId(1);
    user.setUsername("jack");
    user.setPassword("jack123");
    user.setBirthday(new Date());
    return user;
}
  在使用该注解时,需要注意 @RequestMapping 使用的请求方式类型,即 GET 或 POST。

猜你喜欢

转载自zxf-noimp.iteye.com/blog/2422169