JavaWeb过滤器,过滤请求防止强制访问
2015-10-08 17:44
621 查看
在Web应用开发中,我们经常使用过滤器截取从客户端发来的请求,做出相应的处理。过滤器可以说是外部进入网站的第一道关卡。
我们可以利用这道关卡做很多事,例如:对数据进行编码;判断用户是否来自可信任的网络;过滤垃圾数据;记录日志;判断客户端浏览器版本;验证用户是否合法等等……
下图用UML时序图简单画了一下filter的基本原理
一、定义过滤器类,必须实现 java.servlet.Filter接口
实现三个方法:
1、init(FilterConfig filterConfig) 初始化过滤器,在Servlet容器(服务器刚启动时,一般为tomcat启动时)创建过滤器实例的时候就会调用该方法,多用于读取web.xml文件中Servlet过滤器的初始化参数
2、doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 进行过滤处理,所有过滤处理都在这个方法中实现
这个方法得到调用后,里面重要的一点是要调用chain.doFilter(request,response)方法,来完成对下一个过滤器doFilter(ServletRequest request,ServletResponse response,FilterChain chain))方法的调用,如果没有下一个过滤器,则把客户请求传给相应的web组件
3、destroy() 过滤器销毁 Servlet容器在销毁过滤器实例之前该方法得到调用,以释放占用的资源
二、在web.xml中配置过滤器
首先声明Filter,指定Filter的名字和实现类,如果有参数,需要配置参数。
1.首先写一个权限过滤filter类,实现Filter接口
1 import java.io.IOException; 2 3 import javax.servlet.Filter; 4 import javax.servlet.FilterChain; 5 importjavax.servlet.FilterConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.ServletRequest; 8 importjavax.servlet.ServletResponse; 9 import javax.servlet.http.HttpServletRequest;10 importjavax.servlet.http.HttpServletResponse;11 import javax.servlet.http.HttpSession;12 13 public class LoginFilterimplements Filter
{14 15 @Override16 public void init(FilterConfig
filterConfig) throws ServletException {17 // TODO
Auto-generated method stub18 19 }20 21 @Override22 public void doFilter(ServletRequest
request, ServletResponse response,23 FilterChain chain) throws IOException, ServletException
{24 // 获得在下面代码中要用的request,response,session对象25 HttpServletRequest
servletRequest = (HttpServletRequest) request;26 HttpServletResponse servletResponse =(HttpServletResponse)
response;27 HttpSession session = servletRequest.getSession();28 29 // 获得用户请求的URI30 String
path = servletRequest.getRequestURI();31 //System.out.println(path);32 33 // 从session里取员工工号信息34 String
empId = (String) session.getAttribute("empId");35 36 /*创建类Constants.java,里面写的是无需过滤的页面37 for
(int i = 0; i < Constants.NoFilter_Pages.length; i++) {38 39 if
(path.indexOf(Constants.NoFilter_Pages[i]) > -1) {40chain.doFilter(servletRequest, servletResponse);41 return;42 }43 }*/44 45 // 登陆页面无需过滤46if(path.indexOf("/login.jsp")
> -1) {47 chain.doFilter(servletRequest, servletResponse);48 return;49 }50 51 // 判断如果没有取到员工信息,就跳转到登陆页面52 if (empId
== null || "".equals(empId)) {53 // 跳转到登陆页面54servletResponse.sendRedirect("/JingXing_OA/login.jsp");55 } else {56 // 已经登陆,继续此次请求57 chain.doFilter(request,
response);58 }59 60 }61 62 @Override63 public void destroy()
{64 // TODO Auto-generated method stub65 66 }67 68 }
2.然后在web.xml里配置需要登陆权限验证的JSP文件:
a.如果是某个具体的JSP文件(如a.jsp)需要登陆验证
1 <!-- 配置登陆过滤器 --> 2 <filter> 3 <filter-name>login</filter-name> 4 <filter-class>com.jingxing.oa.filter.LoginFilter</filter-class> 5 </filter> 6 7 <filter-mapping> 8 <filter-name>login</filter-name> 9 <url-pattern>/*</url-pattern>10 </filter-mapping>
b.如果是某一个目录(如a/目录)整个目录下的文件都需要登陆验证:
1 <!-- 配置登陆过滤器 --> 2 <filter> 3 <filter-name>login</filter-name> 4 <filter-class>com.jingxing.oa.filter.LoginFilter</filter-class> 5 </filter> 6 7 <filter-mapping> 8 <filter-name>login</filter-name> 9 <url-pattern>/a/*</url-pattern>
10
</filter-mapping>
说明:CharsetEncodingFilter的filter-mapping中,它的url-pattern为*.jsp,这表示对所有jsp都起作用。/servlet/*表示以/servlet/的所有URL将被过滤。如果为/*表示对所有URL的请求过滤
我们可以利用这道关卡做很多事,例如:对数据进行编码;判断用户是否来自可信任的网络;过滤垃圾数据;记录日志;判断客户端浏览器版本;验证用户是否合法等等……
下图用UML时序图简单画了一下filter的基本原理
一、定义过滤器类,必须实现 java.servlet.Filter接口
实现三个方法:
1、init(FilterConfig filterConfig) 初始化过滤器,在Servlet容器(服务器刚启动时,一般为tomcat启动时)创建过滤器实例的时候就会调用该方法,多用于读取web.xml文件中Servlet过滤器的初始化参数
2、doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 进行过滤处理,所有过滤处理都在这个方法中实现
这个方法得到调用后,里面重要的一点是要调用chain.doFilter(request,response)方法,来完成对下一个过滤器doFilter(ServletRequest request,ServletResponse response,FilterChain chain))方法的调用,如果没有下一个过滤器,则把客户请求传给相应的web组件
3、destroy() 过滤器销毁 Servlet容器在销毁过滤器实例之前该方法得到调用,以释放占用的资源
二、在web.xml中配置过滤器
首先声明Filter,指定Filter的名字和实现类,如果有参数,需要配置参数。
1.首先写一个权限过滤filter类,实现Filter接口
1 import java.io.IOException; 2 3 import javax.servlet.Filter; 4 import javax.servlet.FilterChain; 5 importjavax.servlet.FilterConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.ServletRequest; 8 importjavax.servlet.ServletResponse; 9 import javax.servlet.http.HttpServletRequest;10 importjavax.servlet.http.HttpServletResponse;11 import javax.servlet.http.HttpSession;12 13 public class LoginFilterimplements Filter
{14 15 @Override16 public void init(FilterConfig
filterConfig) throws ServletException {17 // TODO
Auto-generated method stub18 19 }20 21 @Override22 public void doFilter(ServletRequest
request, ServletResponse response,23 FilterChain chain) throws IOException, ServletException
{24 // 获得在下面代码中要用的request,response,session对象25 HttpServletRequest
servletRequest = (HttpServletRequest) request;26 HttpServletResponse servletResponse =(HttpServletResponse)
response;27 HttpSession session = servletRequest.getSession();28 29 // 获得用户请求的URI30 String
path = servletRequest.getRequestURI();31 //System.out.println(path);32 33 // 从session里取员工工号信息34 String
empId = (String) session.getAttribute("empId");35 36 /*创建类Constants.java,里面写的是无需过滤的页面37 for
(int i = 0; i < Constants.NoFilter_Pages.length; i++) {38 39 if
(path.indexOf(Constants.NoFilter_Pages[i]) > -1) {40chain.doFilter(servletRequest, servletResponse);41 return;42 }43 }*/44 45 // 登陆页面无需过滤46if(path.indexOf("/login.jsp")
> -1) {47 chain.doFilter(servletRequest, servletResponse);48 return;49 }50 51 // 判断如果没有取到员工信息,就跳转到登陆页面52 if (empId
== null || "".equals(empId)) {53 // 跳转到登陆页面54servletResponse.sendRedirect("/JingXing_OA/login.jsp");55 } else {56 // 已经登陆,继续此次请求57 chain.doFilter(request,
response);58 }59 60 }61 62 @Override63 public void destroy()
{64 // TODO Auto-generated method stub65 66 }67 68 }
2.然后在web.xml里配置需要登陆权限验证的JSP文件:
a.如果是某个具体的JSP文件(如a.jsp)需要登陆验证
1 <!-- 配置登陆过滤器 --> 2 <filter> 3 <filter-name>login</filter-name> 4 <filter-class>com.jingxing.oa.filter.LoginFilter</filter-class> 5 </filter> 6 7 <filter-mapping> 8 <filter-name>login</filter-name> 9 <url-pattern>/*</url-pattern>10 </filter-mapping>
b.如果是某一个目录(如a/目录)整个目录下的文件都需要登陆验证:
1 <!-- 配置登陆过滤器 --> 2 <filter> 3 <filter-name>login</filter-name> 4 <filter-class>com.jingxing.oa.filter.LoginFilter</filter-class> 5 </filter> 6 7 <filter-mapping> 8 <filter-name>login</filter-name> 9 <url-pattern>/a/*</url-pattern>
10
</filter-mapping>
说明:CharsetEncodingFilter的filter-mapping中,它的url-pattern为*.jsp,这表示对所有jsp都起作用。/servlet/*表示以/servlet/的所有URL将被过滤。如果为/*表示对所有URL的请求过滤
相关文章推荐
- eclipse无法修改字体
- 使用Java设置字型和颜色的方法详解
- SpringAOP切入点表达式
- java中unix时间戳,date以及string之间的形式转换
- 详解Java图形化编程中的鼠标事件设计
- JAVA eclipse 字体的大小正确调整步骤
- Spring MVC 注解说明
- 解决Perhaps you are running on a JRE rather than a JDK?问题
- spring mvc 调度器
- Java阳历转农历
- 韩顺平java 第30讲 布局管理器
- struts2的bean标签和set标签
- Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
- java自动类型提升
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- Java基础知识强化之IO流笔记26:FileInputStream / FileOutputStream 复制mp4视频的案例
- Java中Map的用法
- Try...catch...finally与直接throw的区别
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例