filter:登陆验证和权限验证

一、在MyEclipse中定义filter

  只要在新建普通类时让它实现Filter接口就可以了。然后IDE会自动导入相关必须的类(还挺多的),而且一般会生成3个方法:




[java] view plaincopy
01.public void init(FilterConfig filterConfig) throws ServletException 
02.public void doFilter(ServletRequest req, ServletResponse res, 
03.            FilterChain chain) throws IOException, ServletException 
04.public void destroy() 


  一般只需要在doFilter方法体内编写相关代码就行。



二、已登陆验证

  除了首页外,只有用户成功登陆后才能进入其他页面。为了防止用户通过在浏览器地址栏输入地址非法进入这些页面,可以定义一个filter,当进入这些页面时,检查session的相关属性是否存在。只要客户浏览器没有关闭,session对象会一直保持,只要其中的属性没有被更改,将会一直保持。

  在LoginFilter的doFilter方法体内编写如下代码:




[java:firstline[26]] view plaincopy
26.HttpServletRequest request=(HttpServletRequest)req; 
27.        HttpServletResponse response=(HttpServletResponse)res; 
28.        String currentURL=request.getRequestURI(); 
29.        String currentPage=currentURL.substring(currentURL.lastIndexOf("/"),currentURL.length()); 
30.         
31.        //判断是否进入LoginServlet 
32.        if(currentPage!=null&¤tPage.equals("/LoginServlet")){ 
33.            //如果不是从首页进入 
34.            if(request!=null&& 
35.                    (request.getParameter("action")==null 
36.                            ||(!(request.getParameter("action").equals("checkLogin")) 
37.                            &&!(request.getParameter("action").equals("updatePasswd")) 
38.                            &&!(request.getParameter("action").equals("logoff"))))){ 
39.                response.sendRedirect("/webExam/index.jsp"); 
40.                return; 
41.            }//end 如果不是从首页进入 
42.        }//end 判断是否进入LoginServlet 
43.        else{//进入其他页面 
44.            HttpSession s=request.getSession(); 
45.            String identity=(String)s.getAttribute("identity"); 
46.            //如果是非登陆进入的 
47.            if(identity==null||identity.equals("")){ 
48.                response.sendRedirect("/webExam/index.jsp"); 
49.                return; 
50.            }//end 如果是非登陆进入的 
51.        } 
52.         
53.        //把请求发送给下一个过滤器 
54.        chain.doFilter(req,res); 


26、27行将请求与响应对象强制转换为Http...类型。

29行获取网址中最后一个"/"之后的内容,也就是实际进入的页面文件名。

32行出现的LoginServlet是用来验证登陆、注销以及密码修改这三个操作的。要执行哪一个操作可以使用request的action属性来判断。因此,只要都不是这些操作,就可以确认是非法进入,强制跳转到首页中——有漏洞,应该还要判定该用户是否已经成功登陆。



43行的分支是对其他页面的验证,这些页面是只有登陆成功的用户才能进入的。



三、在web.xml中配置

  因为进行身份验证的Filter的实现逻辑类似,故不再阐述。

配置格式如下:



[xhtml] view plaincopy
01.<filter> 
02.  <description>限制未登录的用户访问页面资源</description> 
03.  <filter-name>LoginFilter</filter-name> 
04.  <filter-class>filters.LoginFilter</filter-class> 
05. </filter> 
06. <filter> 
07.  <description>身份验证</description> 
08.  <filter-name>IdentityFilter</filter-name> 
09.  <filter-class>filters.IdentityFilter</filter-class> 
10. </filter> 


这里定义了两个Filter,定义顺序应该决定执行顺序吧。



然后还要配置该Filter对哪些页面起作用




[xhtml] view plaincopy
01.<filter-mapping> 
02.  <filter-name>LoginFilter</filter-name> 
03.  <url-pattern>/student/*</url-pattern> 
04. </filter-mapping> 
05. <filter-mapping> 
06.  <filter-name>LoginFilter</filter-name> 
07.  <url-pattern>/teacher/*</url-pattern> 
08. </filter-mapping> 
09. <filter-mapping> 
10.  <filter-name>LoginFilter</filter-name> 
11.  <url-pattern>/servlet/*</url-pattern> 
12. </filter-mapping> 


这三个filter-mapping的不同之处仅在于url-pattern这里,貌似没有方法一次过写上三个路径,所以这里只要分三个来写了。

你可能感兴趣的:(filter)