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
- java自学之路-----Servlet_过滤器Filter
- java自学之路-----Servlet_基础
- java自学之路-----Servlet_监听器
- Java之Filter过滤器
- Java-Servlet之过滤器Filter
- Java Web--Seervlet之过滤器(Filter)
- Java servlet 之过滤器Filter详解
- Java servlet 之过滤器Filter详解
- Java Web 之过滤器Filter详解
- Java Web 之过滤器Filter详解
- Java servlet 之过滤器Filter详解
- Java Web 的servlet 之过滤器 filter
- Java Web 之过滤器Filter详解
- java 设计模式之过滤器模式(Filter)
- Java servlet 之过滤器Filter详解
- Java Web 之过滤器Filter详解
- Java Web 之过滤器Filter详解
- Java Web 之过滤器Filter详解
- zzu oj1223(切割木条)
- EJB初级篇--EJB组件之会话Bean
- ProGuard工具使用
- leetcode做题总结,题目Valid Sudoku 2012/03/03
- 《ORANGE’S:一个操作系统的实现》第一个例子的实现
- java自学之路-----Servlet_过滤器Filter
- EOF是什么?
- NYOJ 733 万圣节派对【简单题】
- 修改目录下 文件 删除字段
- 使用Visual C++进行串口通信编程
- STM32的存储器映射详解
- Princeton Algorithms: Part 2 [week 3: Maxflow and Mincut]
- Jquery Mobile文字和UI 组件如何同时居中(前端UI)?
- DataGrid使用总结