过滤器(Filter)
过滤器Filter是依赖于Servlet容器,属于Servlet规范的一部分;
过滤器Filter的执行由Servlet容器回调完成;
过滤器Filter的生命周期由Servlet容器管理;
过滤器Filter可以拿到原始的http请求,但是拿不到请求的控制器和请求控制器中的方法的信息;
1、@Order(1):表示过滤器的顺序;
2、@WebFilter:表示这个class是过滤器。
filterName:过滤器名字;
urlPatterns:过滤器的范围;
initParams:为过滤器初始化参数;
3、过滤器里面的三个方法
init:filter对象只会创建一次,init方法也只会执行一次;
doFilter:主要的业务代码编写方法,可以多次重复调用;
destroy:在销毁Filter时自动调用(程序关闭或者主动销毁Filter);
4、启动类中增加注解,自动注册Filter
@ServletComponentScan:在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
5、过滤器
package com.example.demo.Filter;
import org.springframework.core.annotation.Order;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Order(1)
@WebFilter(filterName = "CharacterFilter",urlPatterns = "/*")
public class CharacterFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("服务启动,调用过滤器Filter初始化方法init()..........");
}
@Override
public void destroy() {
System.out.println("服务关闭,调用过滤器Filter的销毁方法destroy()..........");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String ip = request.getRemoteAddr();
String url = request.getRequestURL().toString();
String token = request.getHeader("token");
String nameParameter = request.getParameter("name");
String parameter = request.getQueryString();
System.out.println("发送请求时,调用过滤器Filter的doFilter()方法..........");
System.out.printf("%s 访问了 %s%n", ip, url);
System.out.printf("token:%s%n", token);
System.out.printf("参数:%s%n", nameParameter);
chain.doFilter(request,response);
}
}
*、启动类、main方法
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
*、controller
package com.example.demo.controller;
import com.example.demo.model.UserRequest;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Validated
@RestController
public class TestController {
@RequestMapping("test1")
public String getTest1(@NotBlank(message = "参数不能为空") String name, HttpServletRequest request) {
System.out.println("{token="+request.getHeader("token") +",name="+request.getParameter("name")+"}");
return "111111";
}
@RequestMapping("test2")
public String getTest2(@Valid UserRequest request, BindingResult bindingResult) {
boolean hasErrors = bindingResult.hasErrors();
List<ObjectError> allErrors = bindingResult.getAllErrors();
return "a=> {"+request.toString() +"};b=> {"+ request.getUserName() + "," +request.getPassword()+"}";
}
@RequestMapping("/query")
public void asyncTask() throws Exception {
System.out.println("我是控制类里面的方法,我正在思考...............");
}
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String Get() {
return "get";
}
@RequestMapping(value = "/index",method = RequestMethod.POST)
public String Create() {
return "create";
}
@RequestMapping(value = "/index",method = RequestMethod.PUT)
public String Update() {
return "update";
}
@RequestMapping(value = "/index",method = RequestMethod.DELETE)
public String Delete() {
return "delete";
}
}
*
*
*