SpringBoot中的Filter的作用以及使用@WebFilter注解过滤
过滤器的作用 通过这个图我们可以知道,浏览器对服务器的请求会先经过过滤器再到达服务器,服务器对浏览器的响应也会先经过过滤器,最后再响应给浏览器,基于过滤器的机制我们可以在过滤器中对请求和响应做一些处理,可以在过滤器中决定是否放行,例如:校验请求中有没有敏感字符串,校验请求中有没有Session。 Filte
过滤器的作用
通过这个图我们可以知道,浏览器对服务器的请求会先经过过滤器再到达服务器,服务器对浏览器的响应也会先经过过滤器,最后再响应给浏览器,基于过滤器的机制我们可以在过滤器中对请求和响应做一些处理,可以在过滤器中决定是否放行,例如:校验请求中有没有敏感字符串,校验请求中有没有Session。
Filter是依赖于Servlet容器,属于Servlet规范的一部分,Filter的执行由Servlet回调完成,Filter的生命周期由Servlet容器管理,Servlet中提供的技术可以过滤浏览器发出的请求,并且决定放行请求还是中断请求。
使用@WebFilter注解过滤
1.新建一个Model
2.目录结构
3.编写过滤器配置类(继承Filter)
init方法
@WebFilter注解将"/one,/two"放入到了nofilter字符串数组里,然后init方法中nofilterString将其再拿出来,判断这个字符串不为并且长度大于0,这个时候就将字符串以","分割放入到nofilter。
isNofilter方法
这个方法就是看请求的url过滤不过滤,不过滤返回true,过滤返回false
doFilter方法
如果这个url是不需要过滤的,则将请求转达给下一个filter,如果没有下一个filter就是你的请求资源;如果是需要过滤的,则就将当前Servlet数据转发到/forword这个servlet
附上源码
import org.springframework.core.annotation.Order;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Order(1)
//指定一组过滤器初始化参数
@WebFilter(initParams = {@WebInitParam(name="nofilter",value="/one,/two")})
public class FilterConfig implements Filter {
private String[] nofilter;
@Override
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
//将不过滤的资源存入数组中,先得到nofilter的初始化参数/one,/two,然后将其以","分割放入到字符数组里
String nofilterString=filterConfig.getInitParameter("nofilter");
if(nofilterString!=null&&nofilterString.length()>0) {
nofilter=nofilterString.split(",");
}
}
//doFilter方法完成过滤操作,当请求发过来的时候,过滤器将执行doFilter方法
//在HttpServletRequest 执行doFilter()之前,根据需要检查 HttpServletRequest ,
// 同时也可以修改HttpServletRequest 请求头和数据。
//在HttpServletResponse 执行doFilter()之后,根据需要检查 HttpServletResponse ,
//同时也可以修改HttpServletResponse响应头和数据。
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) servletRequest;
boolean flag=isNofilter(request);
if(flag) {
//请求到达Servlet之前,拦截下来做预处理,处理之后便执行filterChain.doFilter(request,response),
//这个方法将请求转达给过滤器链下一个filter,如果没有filter就是你请求的资源
filterChain.doFilter(servletRequest,servletResponse);
}
else {
// 属于转发,也是服务器跳转,相当于方法调用,
//将当前Servlet的数据转发到forword这个servlet里
request.getRequestDispatcher("/forword").forward(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
//判断路径是否不需要过滤
public boolean isNofilter(HttpServletRequest request) {
//先获得请求的url
String requestURL=request.getRequestURI();
System.out.println(requestURL);
//然后将请求的url打印出来
for(String s:nofilter) {
//与不过滤的资源进行比较
if(requestURL.contains(s)) {
return true;
}
}
return false;
}
}
4.编写controller类
5.接下来我来演示一个一个请求
/index是需要过滤的,所以执行了if else中的else,跳转到/forword Servlet。
/forword也是过滤的,会跳转到/forword
/one是不过滤的,直接访问这个页面
/two也是不过滤的,所以也是直接访问
更多推荐
所有评论(0)