问题描述
二.测试Filter和servlet的生命周期(1)写一个MyServlet(实现Servlet接口),实现destroy(),init(),service()和构造方法(2)写一个MyFilter(实现Filte接口),实现destroy(),init(),doFilter()和构造方法publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{System.out.println("过滤之前");//进到过滤,开始处理,处理完成以后,让请求继续往下走,进入Servletchain.doFilter(request,response);//在Servlet完成以后,又重回过滤器响应给客户端System.out.println("过滤之后");}(3)web.xml配置<servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.accp.servlet.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/MyServlet</url-pattern></servlet-mapping><filter><!--过滤器的类--><filter-name>MyFilter</filter-name><filter-class>com.accp.filter.MyFilter</filter-class></filter><filter-mapping><filter-name>MyFilter</filter-name><!--表示只过滤MyServlet这一个servlet,其他Servlet不管--><servlet-name>MyServlet</servlet-name><!--表示所有的请求都被过滤--><url-pattern>/*</url-pattern></filter-mapping>注意:filter是服务器启动就产生了,并且进行初始化,而servlet一定是有了请求才会出生和初始化,从打印的结果可以看到请求先进入filter,回去的时候又从过滤器经过.当服务器重启或者关闭,servlet先死,filter后死二.Filter应用(1).解决中文乱码问题(request和response)publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)req;HttpServletResponseresponse=(HttpServletResponse)res;if(request.getMethod().equalsIgnoreCase("post")){request.setCharacterEncoding("gb18030");}else{Enumerationenum=request.getParameterNames();while(enum.hasMoreElements()){Stringkey=(String)enum.nextElement();String[]values=request.getParameterValues(key);for(inti=0;i<values.length;i++){values[i]=newString(values[i].getBytes("iso8859-1"),"gb18030");}}}//必须写在过滤之前,写在之后就会失效response.setContentType("text/html;charset=gb18030");chain.doFilter(request,response);}(2).解决权限问题publicvoiddoFilter(ServletRequestreq,ServletResponseresp,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)req;HttpServletResponseresponse=(HttpServletResponse)resp;//得到session的值Stringrole=(String)request.getSession().getAttribute("role");//拿到项目的路径,相当于"/项目名"System.out.println("-------------"+request.getContextPath());if(role==null||!role.equals("admin")){response.sendRedirect(request.getContextPath()+"/error.jsp");}chain.doFilter(request,response);}<filter><filter-name>AdminFilter</filter-name><filter-class>com.accp.filter.AdminFilter</filter-class></filter><filter-mapping><filter-name>AdminFilter</filter-name><!--注意路径--><url-pattern>/admin/*</url-pattern></filter-mapping>(3)过滤掉非法文字a.准备一个str.properties文件,把要过滤掉的字符,准备在里面u738bu516b=***u65e5u672c=****u6740u624b=*****注意这里要转码u738bu516b-->王八u65e5u672c-->日本u6740u624b-->杀手b.过滤器代码Propertiesps=null;publicvoiddoFilter(ServletRequestreq,ServletResponseresp,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)req;HttpServletResponseresponse=(HttpServletResponse)resp;//注意中文乱码的设置request.setCharacterEncoding("utf-8");Enumerationenum=request.getParameterNames();while(enum.hasMoreElements()){Stringkey=(String)enum.nextElement();String[]values=request.getParameterValues(key);for(inti=0;i<values.length;i++){//根据key,从properties中拿到值,如果不为空,则证明一定有非法字符//然后替换掉if(ps.get(values[i])!=null){values[i]=ps.getProperty(values[i]);}}}chain.doFilter(request,response);}//初始化中读取str.properties文件publicvoidinit(FilterConfigfilterConfig)throwsServletException{try{//读取str.properties文件InputStreamin=filterConfig.getServletContext().getResourceAsStream("/WEB-INF/str.properties");ps=newProperties();ps.load(in);//加载配置文件in.close();}catch(IOExceptione){e.printStackTrace();}}