过滤器[登录+编码]filter在程序中的使用

转载 2012年01月10日 21:44:49

虽然很久没有写WEB程序了,但依然怀念那些写WEB和日子。看了下以前的毕业设计,从中提取说一些小例子。写在这里。

这里讲解的是其中filter中使用。主要用于两个方面。一个是编码的设置和登录的拦截验证。

众所周知,java的乱码有时是个很头疼的问题。你不是不在每个页面定义一个编码,还得在每个servlet或action中定义编码。

通常见到这样的几行代码:

 request.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");



这对于一个庞大的系统来说,显得有点太多余。

我们要做一就是简化开发,提高效率。

<!--配置过滤器-->
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.tudou.projectmanage.filters.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <!--过滤处理访问/view/admin下所有资源的请求-->
        <url-pattern>/view/admin/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.tudou.projectmanage.filters.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

上面定义两个过滤器,一个用于拦截登录[admin文件夹下为需要过滤的主界面,此处为管理后台页面,注:login.jsp等页面不在此列,如果你连login页面都过滤了,你还指望谁来登录你的网站呢。

<!--过滤处理访问/view/admin下所有资源的请求-->
<url-pattern>/view/admin/*</url-pattern>


一个用于处理编码

  1. <url-pattern>/*</url-pattern> 
写一个过滤器,继承Filter即可。实现其中的doFilter方法。在其init方法初始化编码即可。这样一个编码的拦截器就实现了。

  1. package com.tudou.projectmanage.filters;  
  2.   
  3. /** 
  4.  * 处理乱码 
  5.  * @author tudou 
  6.  * @date  2011-06-02 
  7.  */  
  8. import java.io.IOException;  
  9.   
  10. import javax.servlet.Filter;  
  11. import javax.servlet.FilterChain;  
  12. import javax.servlet.FilterConfig;  
  13. import javax.servlet.ServletException;  
  14. import javax.servlet.ServletRequest;  
  15. import javax.servlet.ServletResponse;  
  16. import javax.servlet.http.HttpServlet;  
  17.   
  18. @SuppressWarnings("serial")  
  19. public class EncodingFilter extends HttpServlet implements Filter {  
  20.     FilterConfig config;  
  21.     private String encoding = null;  
  22.   
  23.     public EncodingFilter() {  
  24.     }  
  25.   
  26.     public void doFilter(ServletRequest request, ServletResponse response,  
  27.             FilterChain filterChain) throws IOException, ServletException {  
  28.         if (encoding != null) {  
  29.             request.setCharacterEncoding(encoding);  
  30.             response.setContentType("text/html;charset="+encoding);  
  31.         }  
  32.         filterChain.doFilter(request, response);  
  33.     }  
  34.   
  35.     public void init(FilterConfig config) throws ServletException {  
  36.         this.config = config;  
  37.         encoding = config.getInitParameter("encoding");  
  38.     }  
  39.   
  40.     @Override  
  41.     public void destroy() {  
  42.         config = null;  
  43.     }  

同理登录拦截是一样的道理,只是处理方式略有不同。

  • package com.tudou.projectmanage.filters;  
  •   
  • /** 
  •  * 此类用于拦截登录 
  •  * 配置于web.xml节点的filter 
  •  * @author tudou 
  •  * @date  2011-06-02 
  •  */  
  • import java.io.IOException;  
  •   
  • import javax.servlet.Filter;  
  • import javax.servlet.FilterChain;  
  • import javax.servlet.FilterConfig;  
  • import javax.servlet.ServletContext;  
  • import javax.servlet.ServletException;  
  • import javax.servlet.ServletRequest;  
  • import javax.servlet.ServletResponse;  
  • import javax.servlet.http.HttpServlet;  
  • import javax.servlet.http.HttpServletRequest;  
  • import javax.servlet.http.HttpServletResponse;  
  • import javax.servlet.http.HttpSession;  
  •   
  • import com.tudou.projectmanage.persist.Users;  
  •   
  •   
  • @SuppressWarnings("serial")  
  • public class LoginFilter extends HttpServlet implements Filter {  
  •   
  •     /** 
  •      *  
  •      */  
  •     FilterConfig config;  
  •   
  •     public LoginFilter() {  
  •     }  
  •   
  •     /** 
  •      * 核心过滤器 防止前台非法访问!!! 查询条件为memberTypeName是管理员并且未被禁用 3重验证 
  •      */  
  •     public void doFilter(ServletRequest request, ServletResponse response,  
  •             FilterChain filterChain) throws IOException, ServletException {  
  •         HttpServletRequest req = (HttpServletRequest) request;  
  •         HttpServletResponse res = (HttpServletResponse) response;  
  •         HttpSession session = req.getSession(true);  
  •         Users user = (Users) session.getAttribute("user");  
  •         if (user != null) {  
  •             filterChain.doFilter(req, res);//用户验证通过  
  •             return;  
  •         } else {  
  •             req.setAttribute("title""您还没有登录");  
  •             req.setAttribute("messages""请先登录!");  
  •             // 进入后台登录页面  
  •             req.setAttribute("page""login.jsp");  
  •             ServletContext ctx = config.getServletContext();  
  •             ctx.getRequestDispatcher("/view/exceptions/error.jsp").forward(req,  
  •                     res);  
  •         }  
  •     }  
  •   
  •     public void init(FilterConfig config) throws ServletException {  
  •         this.config = config;  
  •     }  
  •   
  •     @Override  
  •     public void destroy() {  
  •         config = null;  
  •     }  
  • }


    如此一个登录拦截就完成了。

    注:

    此登录只过滤了../amdin文件夹下的资源。如果有人通过.do/.action/servlet的方式直接进行后台操作是拦截不到的。

    此时,必须借助于拦截器进行URL拦截才能达到真正的完全拦截。一般用于权限控制。防止非法后台操作。


    附上

    error.jsp:

  • <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  • <%@ taglib uri="/struts-tags" prefix="s"%>  
  • <%  
  •     String path = request.getContextPath();  
  •     String basePath = request.getScheme() + "://"  
  •             + request.getServerName() + ":" + request.getServerPort()  
  •             + path + "/";  
  • %>  
  •   
  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  • <html>  
  •     <head>  
  •         <base href="<%=basePath%>">  
  •   
  •         <title>提示</title>  
  •   
  •         <meta http-equiv="pragma" content="no-cache">  
  •         <meta http-equiv="cache-control" content="no-cache">  
  •         <meta http-equiv="expires" content="0">  
  •         <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  •         <meta http-equiv="description" content="This is my page">  
  •         <link rel="stylesheet" type="text/css" href="css/common.css">  
  •         <style type="text/css">  
  • body {  
  •     text-align: center;  
  • }  
  •   
  • #content {  
  •     font-size: 15px;  
  • }  
  • </style>  
  •         <script language="javascript">  
  •     var index = 5;  
  •     var t;  
  •     function timeStart() {  
  •         document.getElementById("second").innerHTML = index;  
  •         if (index <= 1) {  
  •             var page = document.getElementById("page").value;  
  •             if (page) {  
  •                 if (page == "login.jsp") {  
  •                     window.parent.location.href = "/projectManageSystem/login";  
  •                 } else if (page == "index.jsp") {  
  •                     window.parent.location.href = "/projectManageSystem/index.jsp";  
  •                 } else {  
  •                     if (page == "left.jsp") {  
  •                         parent.frames.leftFrame.location.reload();  
  •                         window.location.href = "showmenu!showMenus.action?todo=0";  
  •                         return;  
  •                     }  
  •                     window.location.href = page;  
  •                 }  
  •             } else {  
  •                 history.go(-1);  
  •             }  
  •             clearTimeout(t);  
  •             return;  
  •         }  
  •         index--;  
  •         t = setTimeout("timeStart()", 1000);  
  •     }  
  •   
  •     function goTo() {  
  •         var page = document.getElementById("page").value;  
  •         if (page) {  
  •             if (page == "login.jsp") {  
  •                 window.parent.location.href = "/projectManageSystem/login";  
  •             } else if (page == "index.jsp") {  
  •                 window.parent.location.href = "/projectManageSystem/index.jsp";  
  •             } else {  
  •                 if (page == "left.jsp") {  
  •                     parent.frames.leftFrame.location.reload();  
  •                     window.location.href = "showmenu!showMenus.action?todo=0";  
  •                     return;  
  •                 }  
  •                 window.location.href = page;  
  •             }  
  •         } else {  
  •             history.go(-1);  
  •         }  
  •     }  
  • </script>  
  •     </head>  
  •     <body onload="timeStart()">  
  •         <script>  
  •     history.go(1);  
  • </script>  
  •         <DIV>  
  •             <TABLE height="97%" cellSpacing=0 cellPadding=0 width="99%" border=0>  
  •                 <TBODY>  
  •                     <TR  
  •                         style="BACKGROUND-IMAGE: url(images/common/bg_header.gif); BACKGROUND-REPEAT: repeat-x"  
  •                         height=47>  
  •                         <TD width=10>  
  •                             <SPAN  
  •                                 style="FLOAT: left; BACKGROUND-IMAGE: url(images/common/main_hl.gif); WIDTH: 15px; BACKGROUND-REPEAT: no-repeat; HEIGHT: 47px"></SPAN>  
  •                         </TD>  
  •                         <TD>  
  •                             <SPAN  
  •                                 style="FLOAT: left; BACKGROUND-IMAGE: url(images/common/main_hl2.gif); WIDTH: 15px; BACKGROUND-REPEAT: no-repeat; HEIGHT: 47px"></SPAN><SPAN  
  •                                 style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FLOAT: left; BACKGROUND-IMAGE: url(images/common/main_hb.gif); PADDING-BOTTOM: 10px; COLOR: white; PADDING-TOP: 10px; BACKGROUND-REPEAT: repeat-x; HEIGHT: 47px; TEXT-ALIGN: center; 0 px: ">  
  •                                 提示界面 </SPAN>  
  •                             <SPAN  
  •                                 style="FLOAT: left; BACKGROUND-IMAGE: url(images/common/main_hr.gif); WIDTH: 60px; BACKGROUND-REPEAT: no-repeat; HEIGHT: 47px"></SPAN>  
  •                         </TD>  
  •                         <TD  
  •                             style="BACKGROUND-POSITION: 50% bottom; BACKGROUND-IMAGE: url(images/common/main_rc.gif)"  
  •                             width=10></TD>  
  •                     </TR>  
  •                     <TR>  
  •                         <TD style="BACKGROUND-IMAGE: url(images/common/main_ls.gif)">  
  •                                
  •                         </TD>  
  •                         <TD style="COLOR: #566984; BACKGROUND-COLOR: white;"  
  •                             vAlign="middle" align="center">  
  •                             <div id="content">  
  •                                 <div style="text-align: center; height: 12px;">  
  •                                     ${title}  
  •                                 </div>  
  •                                 <hr color="lightblue" size="1" />  
  •                                 <div align="center" style="height: 50px;">  
  •                                     <br />  
  •                                     ${messages}  
  •                                     <span style="font-size: 15px; color: red;"><s:actionerror />  
  •                                     </span>  
  •                                     <input type="hidden" id="page" value="${page}" />  
  •                                     <br />  
  •                                     <br />  
  •                                     <span style="font-size: 12px; color: gray;"> <label  
  •                                             id="second" style="color: red;"></label> 秒后自动跳转,如果浏览器不支持跳转,请  
  •                                         <a href="javascript:void(0);" onclick="goTo();">点击这里</a> </span>  
  •                                 </div>  
  •                             </div>  
  •                         </TD>  
  •                         <TD style="BACKGROUND-IMAGE: url(images/common/main_rs.gif)"></TD>  
  •                     </TR>  
  •                     <TR  
  •                         style="BACKGROUND-IMAGE: url(images/common/main_fs.gif); BACKGROUND-REPEAT: repeat-x"  
  •                         height=10>  
  •                         <TD style="BACKGROUND-IMAGE: url(images/common/main_lf.gif)"></TD>  
  •                         <TD style="BACKGROUND-IMAGE: url(images/common/main_fs.gif)"></TD>  
  •                         <TD style="BACKGROUND-IMAGE: url(images/common/main_rf.gif)"></TD>  
  •                     </TR>  
  •                 </TBODY>  
  •             </TABLE>  
  •         </DIV>  
  •     </body>  
  • </html>






  • 相关文章推荐

    Filter过滤器周期、自动登录、编码、

    Filter生命周期 QuickFilter1 com.ithiema.web.filter.QuickFilter1 aaa ...

    使用filter过滤器解决编码问题

    编码问题在java开发中很常见,
    • qingfoo
    • qingfoo
    • 2014年04月30日 11:04
    • 676

    JavaEE Filter全局编码过滤器

    • 2016年09月25日 20:41
    • 17KB
    • 下载

    使用filter过滤器实现对用户登录的检查,如果未登录跳转至登录页面

    对于前几天写的一个简单的学生管理系统,想要实现对于用户登陆检查的功能,就上网自学了filter知识         第一步先在项目目录中创建包filter,在此包下面创建filter名为LoginF...

    Filter过滤器—编码过滤

    Filter过滤器—编码过滤我们在开发网页的时候经常会遇到编码的问题,这时候我们必须在每一次获得request和response的时候都执行一遍request.setCharacterEncoding...

    JavaWeb-过滤器Filter学习(二)设置全站编码与设置页面缓存

    以前我们设置servlet的request和response的编码需要在每个servlet都设置,如果Servlet很多,显得很麻烦,现在我们可以用过滤器很简单的实现这个功能。 还有页面缓存,如果我...

    filter(字符编码过滤器)(chain.doFilter(request,response))

    package com.javaweb; import java.io.IOException; import javax.management.modelmbean.RequiredModelM...

    tomcat8 编写字符编码Filter过滤器无效问题

    同事遇到编码问题时想做一个解决全站的字符编码过滤器,过滤器类和配置如下: 过滤器类: package com.chaoxing.newspaper.web.filter; import java.i...

    java 中如何使用filter过滤器

    • 2011年12月01日 14:35
    • 4KB
    • 下载
    内容举报
    返回顶部
    收藏助手
    不良信息举报
    您举报文章:过滤器[登录+编码]filter在程序中的使用
    举报原因:
    原因补充:

    (最多只允许输入30个字)