您的位置:首页 > 编程语言 > Java开发

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的请求过滤
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: