过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
应用场景
自动登录
统一设置编码格式
访问权限控制
敏感字符过滤等
例如你想在所有方法执行前执行某件事--可以在doFilter中进行处理
第一步:
web.xml写过滤器
<!--过滤器-->
<filter>
<filter-name>MeFilter</filter-name>
<filter-class>com.lhl.controller.filter.MeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第二部:编写过滤的类:在doFilter中写逻辑,可以请求转发到某路径
/**
* @author lhl
* @version 1.0
* @date 2019/12/3 21:09
* @description
*/
public class MeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("-----filter初始化------");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("每次请求都会访问-------");
chain.doFilter(request, response);//交给下一个过滤器或servlet处理
}
@Override
public void destroy() {
System.out.println("生命周期销毁的时候访问------------");
}
}
特别注意:如果你要再filter中注入sql的操作,是做不到的,sqlDao=null.因为过滤在spring的实例化之前。
需要自己在init中获取:如:
/**
* init时候获取xml,获取dao
* @param arg0
* @throws ServletException
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("filter init");
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring-mybatis.xml");
sysSetDao = (SysSetDao) context.getBean("sysSetDao");
}
整个代码:
package com.hsnn.medstgmini.base.controller;
import com.hsnn.medstgmini.base.trade.dao.SysSetDao;
import com.hsnn.medstgmini.base.trade.model.SysSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
/**
* @author lhl
* @version 1.0
* @date 2019/12/3 11:01
* @description TODO
*/
@Component
public class SysSetController implements Filter {
//直接注入是获取不到的,filter过滤在spring初始化之前
private SysSetDao sysSetDao;
/**
* init时候获取xml,获取dao
* @param arg0
* @throws ServletException
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("filter init");
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring-mybatis.xml");
sysSetDao = (SysSetDao) context.getBean("sysSetDao");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("filter start");
HttpServletRequest servletRequest = (HttpServletRequest) request;
String requestURI = servletRequest.getRequestURI();
SysSet sysSet = sysSetDao.getOneEnable();
if (requestURI.contains("/settlement/trade")) {
FilterRedirect(request,response,sysSet);
}
if (requestURI.contains("/settlement/reciveAndPayManagement")){
FilterRedirect(request,response,sysSet);
}
chain.doFilter(request, response);
}
/**
* 请求转发
* @param request
* @param response
* @param sysSet
* @throws ServletException
* @throws IOException
*/
public void FilterRedirect(ServletRequest request, ServletResponse response,SysSet sysSet) throws ServletException, IOException {
System.out.println("------这里将触发一些事件");
if (sysSet != null) {
long nowTime = new Date().getTime();
if (nowTime > sysSet.getStartDttm().getTime() && nowTime < sysSet.getEndDttm().getTime()) {
request.getRequestDispatcher("/toAlertTab").forward(request, response);
}
}
}
@Override
public void destroy() {
System.out.println("filter destroy");
}
}
有啥不懂得小伙伴们加qq群交流啦:852665736;本群致力于一同进步的小伙伴们,大家一起交流探讨,在陌生的城市感受温暖