过滤器和我们每个人的生活息息相关,即使我们不知道,其实每天都在用。
很早就知道过滤器,但一直一知半解,惭愧。
过滤器的结构
简单说就3部分。
1、preHandle() 前置处理
2、doFilter()
3、postHandle() 后置处理
过滤器可以实现拦截吗?如何实现?
可以。不只是只有拦截器可以实现拦截,过滤器也可以实现拦截。
过滤器代码
代码如下:
public class ApiFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)request; // 这里转化下,否则Servlet是无法获取到url呢
HttpServletResponse httpServletResponse = (HttpServletResponse)response; // 这里转化下,否则Servlet是无法获取到url呢
String URL = httpServletRequest.getRequestURL().toString();
if(URL.contains("api")){ // 如果包含api,说明是对外接口 那么不过滤
chain.doFilter(request,response);
}else{
if(1==1){ // 这里模拟用户登录
httpServletResponse.sendRedirect("/login"); // 重定向到登录页面
}
}
}
@Override
public void destroy() {
}
}
注册过滤器
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public FilterRegistrationBean filterRegist() {
FilterRegistrationBean frBean = new FilterRegistrationBean();
frBean.setFilter(new ApiFilter());
frBean.addUrlPatterns("/api"); // /*是过滤所有
System.out.println("filter");
return frBean;
}
}
返回rest风格的修改下即可
和拦截器不同的是这里不用return false:
if(1==1){
// 这两行编码格式的代码需要设置 否则中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = null ;
JSONObject res = new JSONObject();
res.put("code",-1);
res.put("message","未知异常");
out = response.getWriter();
out.append(res.toString());
}
经典应用场景
设置编码:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter)
throws IOException, ServletException {
HttpServletRequest request1 = (HttpServletRequest)request;
HttpServletResponse response1 = (HttpServletResponse)response;
// 设置编码
request1.setCharacterEncoding("UTF-8");
response1.setCharacterEncoding("UTF-8");
filter.doFilter(request, response);
}
本文详细介绍了Java中API过滤器的实现方式,包括过滤器代码的编写、注册过程及应用场景。通过实例展示了如何使用过滤器进行请求URL的判断,以及如何在过滤器中设置编码,重定向到登录页面或返回REST风格的错误信息。
285

被折叠的 条评论
为什么被折叠?



