SpringBoot注册三大Web组件

一、SpringBoot提供的方式

​ 使用@Bean注解将组件添加到Web容器

@Component
public class WebComponentRegister {
    
    /**
     * 注册servlet
     */
    @Bean
    public ServletRegistrationBean myServlet() {
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(), "/myServlet");
        return registrationBean;
    }
    
     /**
     * 注册filter
     */
    @Bean
    public FilterRegistrationBean myFilter() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
        return registrationBean;
    }

    /**
     * 注册listener
     */  
    @Bean
    public ServletListenerRegistrationBean myListener() {
	ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
	return registrationBean;
	}
}

二、Servlet3.0提供的注解

主启动类上需要添加注解@ServletComponentScan扫描Servlet3.0注解

①注册Servlet

@WebServlet(name = "userServlet",urlPatterns = "/test/customs")
public class UserServlet extends HttpServlet{

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("custom sevlet");
        resp.getWriter().flush();
        resp.getWriter().close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

②注册filter

@WebFilter(urlPatterns = "/*",filterName = "TestFilter")
public class TestFilter implements Filter {
    /**
     * 容器初始化时调用
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("-------------init--------------");
    }

    /**
     * 拦截请求
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        boolean flag = true;
        if (flag){
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            //进行页面调用什么
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            response.sendRedirect("/index.html");
        }
    }

    /**
     * 容器销毁时执行
     */
    @Override
    public void destroy() {
        System.out.println("-------------destory--------------");
    }
}

③注册listener

常用的监听器:servletContextListenerhttpSessionListenerservletRequestListener

@WebListener
public class RequestListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // TODO Auto-generated method stub
        System.out.println("======requestDestroyed========");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("======requestInitialized========");

    }

三、拦截器interceptor的使用

实现HandlerInterceptor或者继承HandlerInterceptorAdapter

@Component
public class AuthInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    UserService userService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {		
        //这个handler可以被拦截请求的信息
        return true;
    }
}lan

注册拦截器的方法见下

四、使用拦截器解决跨域问题

创建并注册拦截器

@Component
public class AllowOriginIntercepter extends HandlerInterceptorAdapter {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		response.addHeader("Access-Control-Allow-Origin", "*");
		response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
		return true;
	}
}
@Configuration
	public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
		@Autowired
		AllowOriginIntercepter allowOriginIntercepter;
		
		@Override
		public void addInterceptors(InterceptorRegistry registry) {
			registry.addInterceptor(allowOriginIntercepter).addPathPatterns("/**");
			super.addInterceptors(registry);
		}
}
发布了81 篇原创文章 · 获赞 124 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/qq_38697437/article/details/104360558