java自学之路-----Servlet_过滤器Filter

来源:互联网 发布:基德 知乎 编辑:程序博客网 时间:2024/05/22 23:28

过滤器{

定义:Servlet的API中提供了一个Filter接口,当web开始时,某个类实现了该接口,那么该类就叫做过滤器。通过过滤器,开发人员可以在用户访问某个资源之前,对访问的请求和响应进行拦截。(当有多个过滤器,资源就会通过每一个过滤器)


步骤:

1.实现filter接口

@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//服务器启动时过滤器就被创建,执行该方法!只创建一次//filterConfig对象可以获得web.xml文件配置的参数数据}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//作用是将拦截下来的请求.响应进行放行chain.doFilter(request, response);}@Overridepublic void destroy() {//web应用被移除,或者web服务器停止时,过滤器就会被销毁,同时执行该方法!}


2.在web.xml文件进行定义

<filter><filter-name>filterDemo</filter-name><filter-class>cn.review.servlet.FilterDemo</filter-class><init-param><!--定义一些参数,可以在过滤器中获取该数据 --><param-name></param-name><param-value></param-value></init-param></filter><filter-mapping><filter-name>filterDemo</filter-name><url-pattern>/*</url-pattern><!--定义拦截的路径--><!--指定拦截器拦截哪种方式访问资源。request.forward.error.include  --><!-- 可以配置多个 --><dispatcher>REQUEST</dispatcher></filter-mapping>


作用:

1.通过检查用户的权限,来判断是否允许用户访问资源

2.通过拦截,解决浏览器和服务器之间的乱码

3.在过滤器放行之后,拿到response的内容,进行压缩处理等设置

}


实例{

解决全站的请求乱码问题

@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {//为了调用子类方法HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;//指定post提交编码request.setCharacterEncoding("UTF-8");//指定响应输出的编码//response的编码response.setCharacterEncoding("UTF-8");//通知浏览器打开方式response.setHeader("content-type", "text/html;charset=utf-8");//放行//为了解决get提交的乱码问题,采用包装设计模式,进行操作chain.doFilter(new MyRequest(request), response);}//继承request的包装类class MyRequest extends HttpServletRequestWrapper{private HttpServletRequest request= null;public MyRequest(HttpServletRequest request) {//需要给包装类传递一个被包装的对象super(request);this.request = request;}//增强方法,解决get参数乱码@Overridepublic String getParameter(String name) {if(name==null || name.trim().equals("")){return null;}String value = request.getParameter(name);if(value==null || value.trim().equals("")){return null;}try {return new String(value.getBytes("iso8859-1"),request.getCharacterEncoding());} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}}}
将数据进行压缩输出

@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;//为了获得response的数据,需要定义一个增强类,MyResponse myResponse = new MyResponse(response);chain.doFilter(request, myResponse);//拿到缓冲流的数据byte[] data = myResponse.getBos();//定义压缩类ByteArrayOutputStream bos = new ByteArrayOutputStream();GZIPOutputStream gzip = new GZIPOutputStream(bos);//把数据压缩写到了bos缓冲流gzip.write(data);gzip.close();byte[] gzipData = bos.toByteArray();//使用response对象将数据写出并告诉浏览器压缩格式response.setHeader("content-encoding", "gzip");response.setHeader("content-length", gzipData.length+"");response.getOutputStream().write(gzipData);}class MyResponse extends HttpServletResponseWrapper{//定义一个缓冲流,存储response的数据ByteArrayOutputStream bos = new ByteArrayOutputStream();//先需要获得被增强的对象,需要使用他的方法HttpServletResponse response = null;public MyResponse(HttpServletResponse response) {super(response);this.response = response;}@Overridepublic ServletOutputStream getOutputStream() throws IOException {//当获得输出流的时候,传递一个自定义的流。以便将数据全部写入缓冲流return new MyOutputStream(bos);}public byte[] getBos(){return bos.toByteArray();}}class MyOutputStream extends ServletOutputStream{private ByteArrayOutputStream bos;public MyOutputStream(ByteArrayOutputStream bos) {super();this.bos = bos;}@Overridepublic void write(int b) throws IOException {bos.write(b);}}





}




0 0
原创粉丝点击