1.实现一个filter步骤
>编写一个java类实现Lister接口
@WebFilter("/*") //这样就不需要在web.xml文件中再配置了
public class EncodingFilter implements Filter {
}
>在web.xml文件中配置 可以用注解 @WebFilter("/*")替代xml文件配置
<filter> <filter-name>encodingFilter</filter-name> <filter-class>cn.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Web三大组件(filter listen servlet) 其实filter listen 都与servlet 一样在服务器启动时创建
注解形式
@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
xml形式
<filter> <filter-name>encodingFilter</filter-name> <filter-class>cn.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher> REQUEST</dispatcher> <!--这个配置可以限制通过何种请求才会调用到这个过滤器--> <dispatcher> FORWARD</dispatcher> <!--这个配置可以限制通过何种请求才会调用到这个过滤器--> </filter-mapping>
验证登录小demo
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; String requestURI = request.getRequestURI(); HttpSession session = request.getSession();
//先放行登录的资源
if(requestURI.contains("/login.jsp") || requestURI.contains("/css/") || requestURI.contains("/loginServlet")|| requestURI.contains("/js/")|| requestURI.contains("/checkCodeServlet") ){ filterChain.doFilter(request,response); }else {
//如果不是登录的资源则判断用户是否登录 如果登录则放行,如果没有登录则跳转
Object user = session.getAttribute("user"); if(user != null){ filterChain.doFilter(request,response); }else{ //没有登录 需要跳转 request.setAttribute("login_msg","请先登录"); request.getRequestDispatcher("/login.jsp").forward(request,response); } } }