servlet过滤器
Posted AnswerTheQuestion
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet过滤器相关的知识,希望对你有一定的参考价值。
1.什么是Servlet过滤器?
过滤器实质上就是Web应用服务器上的一个Web应用组件,用于拦截客户端(浏览器)与目标资源的请求,病对这些请求进行一定过滤处理在发送给目标资源。(如下图所示)
Web容器在进行过滤时,将按照过滤器的先后顺序对请求进行处理。
2.过滤器的核心对象
过滤器对象放置在javax.servlet包中,其名称为Fiter,它是一个接口,出了这个接口,与过滤器相关的对象还有FilterConfig对象、FilterChain对象,所以在实际的开发中,定义过滤器对象只需要直接或者间接的实现Filter接口即可。
A.Filter接口:(在Filter接口中定义了三个方法)
init();过滤器的初始化方法,该方法在过滤器初始化时调用
doFilter();对请求进行过滤处理
destory();销毁方法以便释放资源
B.FilterChain接口:
在这个接口中只有一个方法,doFilter(ServletRequest request , SrevletResponse response);
该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器是过滤器链中的最后一个过滤器,那么请求将传给目标资源。
如果没有写doFilter();将不再继续往下执行过滤和请求!
C.FilterConfig接口:
主要用于获取过滤器中的配置信息,主要方法有:
3.过滤器的创建与配置
一、创建一个类实现Filter接口并且实现其接口中的三个方法(如上所述)
二、在XML文件中声明其过滤器(如下图所示)
例一:判断用户是否登录(但是有一点需要清楚:我们不能所有的页面都设置用户权限的过滤器,如果这样我们永远停留在登录界面,所以我们要把没有权限的页面放到XML中配置一下,如上图所示)
package com.inba.maya.myfilter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class UserFilter implements Filter { ArrayList<String> list=new ArrayList<String>(); @Override public void init(FilterConfig fc) throws ServletException { String userName=fc.getInitParameter("userName");//获取配置文件当中的属性值 String[] u=userName.split(",");//把获取出来的值用,分割 list.addAll(Arrays.asList(u));//把数组添加到集合list中 } @Override public void doFilter(ServletRequest request, ServletResponse respons, FilterChain chain) throws IOException, ServletException { //首先将父类中的request和response转化成其子类(HttpServletRequest)中的request HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse rep=(HttpServletResponse)respons; //获得URL路径 String path1=req.getRequestURI(); String path2=req.getContextPath(); String p=path1.substring(path2.length()); //如果集合中的元素等于当前的路径那么放行!,否则我们就要判断它有没有用户权限访问该页面 //如果有那么放行!否则打回到初始页面 if(list.contains(p)){ chain.doFilter(request, respons); }else{ HttpSession session=req.getSession(); if(session.getAttribute("user") != null){ chain.doFilter(request, respons); }else{ rep.sendRedirect("index.jsp"); } } } @Override public void destroy() { // TODO 自动生成的方法存根 } }
例二:敏感词汇的转换
package com.inba.maya.myfilter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; public class CharFilter implements Filter { ArrayList<String> list=new ArrayList<String>(); //过滤器的初始化方法 @Override public void init(FilterConfig fc) throws ServletException { //获取过滤器的初始化参数值 String charName=fc.getInitParameter("charName"); String[] zchar=charName.split(","); list.addAll(Arrays.asList(zchar)); } //内部类--目的是把现有的request转化一下再往下传递 class MyFilter extends HttpServletRequestWrapper{ private HttpServletRequest request; public MyFilter(HttpServletRequest request) { super(request); this.request=request; } @Override public String getParameter(String name) { String txt=request.getParameter("txt"); for(String s:list){ txt=txt.replaceAll(s, "***"); } return txt; } } //对请求进行过滤处理 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse rep=(HttpServletResponse)response; //把req放进去获得了转换后的request MyFilter myRequest=new MyFilter(req); chain.doFilter(myRequest, response); } @Override //销毁方法,以便释放资源 public void destroy() { // TODO 自动生成的方法存根 } }
以上是关于servlet过滤器的主要内容,如果未能解决你的问题,请参考以下文章