J2EE:Filter 过滤器
来源:互联网 发布:刘道成mysql视频教程 编辑:程序博客网 时间:2024/06/03 09:24
Filter
用户访问请求需要经过Filter,并且可以有多个过滤器。
Filter 案例1
FirstFilter
package filter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;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;/** * FirstFilter--用来打印用户访问ip地址和访问的页面 * @author lzp * */public class FirstFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 转换为HttpServletRequest方便方法调用 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 获取ip地址 String ip = request.getRemoteAddr(); // 获取url String url = request.getRequestURL().toString(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = new Date(); String date = sdf.format(d); System.out.printf("%s %s 访问了 %s %n", date,ip,url); chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { }}
web.xml filter设置
<filter> <filter-name>FirstFilter</filter-name> <filter-class>filter.FirstFilter</filter-class> </filter> <filter-mapping> <filter-name>FirstFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
其中
<url-pattern>/*</url-pattern>
表示所有的访问都会过滤。
<url-pattern>/*.jsp</url-pattern>
则表示之过滤.jsp
Tomcat显示
filter 自启动
Filter 一定会随着Tomcat的启动而启动。
与servlet需要配置自启动才会随着Tomcat的启动而执行init()方法不同。
@Override public void init(FilterConfig arg0) throws ServletException { System.out.println("First Filter init()"); }
filter启动失败问题
filter启动失败,或本身编译错误,会导致filter不能使用,且整个web应用启动失败,用户无法访问web页面。
用Filter进行中文处理
servlet中获取中文参数,采用
request.setCharacterEncoding("UTF-8");
正确获取UTF-8编码中文,需要在每个servlet中添加该代码。
过滤器Filter2号
package filter;import java.io.IOException;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;public class EncodingFilter implements Filter{ @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { }}
web.xml设置
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
【注】:响应中文问题不需要加入filter
按照MVC设计模式,视图会交给jsp复制,jsp一般会加上
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
这一句包含了下面这句的意义
response.setContentType("text/html; charset=UTF-8");
http://blog.csdn.net/lizhongping00/article/details/69941796
使用Filter进行登陆验证处理
使用servlet中增加对session判断代码来做到登陆验证。故每个servlet都需要加上该代码。
AuthFilter
// 首先判断是否是访问login、login.html
login/login.html是登陆之前的界面,不需要session登陆验证,直接通过过滤即可。
如果不是登陆界面,如果从session中不能获取到值,重新登录。session会话为30分钟(Tomcat默认)
package filter;import java.io.IOException;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;public class AuthFilter implements Filter{ @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 首先判断是否是访问login、login.html // 这两个页面在还没登录之前就需要访问 String uri = request.getRequestURI(); if(uri.endsWith("login.html") || uri.endsWith("login")){ chain.doFilter(request, response); return; } // 从session中获取userName,如果没有就表示未登陆过。 String userName = (String) request.getSession().getAttribute("userName"); if(null == userName){ response.sendRedirect("login.html"); return ; } chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { }}
web.xml 设置
<filter> <filter-name>AuthFilter</filter-name> <filter-class>filter.AuthFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在login.jsp页面中js,css和图片文件
用上面的验证,在登陆之前所有资源是不能访问的。
如果在login.jsp页面中js,css和图片文件,想要访问这些资源,需要对过滤器进行修改。
思路即是在预先判断是否是js或css资源,如果是直接通过,不需要进行验证登录。
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 获取参数uri串 String uri = request.getRequestURI(); // 如果访问的资源是以css或者js结尾的,那么就不需要判断登录 if (uri.endsWith(".css") || uri.endsWith(".js")) { chain.doFilter(request, response); return; } // 首先判断是否是访问login、login.html // 这两个页面在还没登录之前就需要访问 if (uri.endsWith("login.html") || uri.endsWith("login")) { chain.doFilter(request, response); return; } // 从session中获取userName,如果没有就表示未登陆过。 String userName = (String) request.getSession().getAttribute("userName"); if (null == userName) { response.sendRedirect("login.html"); return; } chain.doFilter(request, response); }
【注】
chain.doFilter(request, response);return; // 用于不允许后面的功能了
表示该过滤器放行,继续运行下一个过滤器,或者访问到资源了。
- J2EE中过滤器:Filter
- J2EE 过滤器Filter
- J2EE过滤器Filter基础
- J2EE:Filter 过滤器
- j2ee中的过滤器Filter使用
- J2EE进阶之过滤器Filter 二十一
- j2ee项目中文处理的Filter(过滤器)
- J2EE中使用Filter过滤器清除网页缓存
- J2EE学习笔记(五)之Servlet中的Filter过滤器
- 过滤器Filter
- 过滤器Filter
- Filter 过滤器
- 过滤器 filter
- 过滤器filter
- 过滤器,Filter
- 过滤器Filter
- filter--过滤器
- 过滤器Filter
- 用OpenSSL命令行生成证书文件
- 通过 css3 实现鼠标划过图片移动
- 史上最简单的 Spring MVC 教程(四)
- PHP学习资源
- PHP入门级别代码
- J2EE:Filter 过滤器
- Android LruCache内存缓存实现详解
- 缓存区溢出检测工具BED
- PHP语言基础注意点
- 处理 Sublime Text 3 添加插入当前时间
- PHP中foreach循环语句
- PHP中break语句的应用
- [thinkphp]多查询语句拼接(And、Or)
- PHP中continue语句的应用