过滤器代码
代码如下:
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);
}