在本篇文章中將使用過濾器進行編碼轉換、登陸驗證、防站外提交的過程,為了演示,我把編碼轉換放在一個filter中,登陸驗證和防站外提交放在另一個filter中,兩個filter進行串聯工作。
1、為了演示,先制作這兩個filter
//這個filter是為了做編碼轉換,只要訪問.jsp網頁都要功過這個filter
/**類名:filter.Encoding
*作用:對后臺修改進行權限驗證和防止站外提交
*作者:luoshao
*日期:2008-1-9
*/
package filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Encoding implements Filter {
       /** Request.java
      * 對 HttpServletRequestWrapper 進行擴充, 不影響原來的功能并能提供所有的 HttpServletRequest
      * 接口中的功能. 它可以統一的對 Tomcat 默認設置下的中文問題進行解決而只需要用新的 Request 對象替換頁面中的
      * request 對象即可.
      */

    class Request extends HttpServletRequestWrapper
    {

        public Request(HttpServletRequest request) {
            super(request);
        }

        /**
         * 轉換由表單讀取的數據的內碼.
         * 從 ISO 字符轉到 GBK.
         */
        public String toChi(String input) {
            try {
              byte[] bytes = input.getBytes("ISO8859-1");
              return new String(bytes, "GBK");
            }
            catch (Exception ex) {
            }
            return null;
        }

        /**
         * Return the HttpServletRequest holded by this object.
         */
        private HttpServletRequest getHttpServletRequest()
        {
            return (HttpServletRequest)super.getRequest();
        }

        /**
         * 讀取參數 -- 修正了中文問題.
         */
        public String getParameter(String name)
        {
            return toChi(getHttpServletRequest().getParameter(name));
        }

        /**
         * 讀取參數列表 - 修正了中文問題.
         */
        public String[] getParameterValues(String name)
        {
              String values[] = getHttpServletRequest().getParameterValues(name);
              if (values != null) {
                for (int i = 0; i < values.length; i++) {
                  values[i] = toChi(values[i]);
                }
              }
              return values;
        }
    }
    public void destroy() {
       
    }
第二個filter做登陸驗證和防止站外提交
/**類名:filter.SecurityAndDeny
*作用:對后臺修改進行權限驗證和防止站外提交
*作者:luoshao
*日期:2008-1-9
*/
package filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SecurityAndDeny implements Filter{
    public void destroy() {
       
    }

    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response=(HttpServletResponse)resp;      
        //權限驗證
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("username") == null) {
                    //*用戶登錄以后需手動添加session                   
                    response.sendRedirect(request.getContextPath() + "/adminLogin.jsp");
                }
                //防止站外提交       
                String s1=request.getHeader("Referer");
                String s2=request.getServerName();
                s1=s1.substring(7,7+s2.length());
                System.out.println("s1=" + s1 + " s2="+ s2 + "s2.length()=" +s2.length());
                if(!s1.equals(s2)){
                    PrintWriter out=response.getWriter();
                    out.println("you are doing wrong activities...");
                    return ;
                }
        chain.doFilter(request, response);
    }
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpreq = (HttpServletRequest)request;       
        if(httpreq.getMethod().equals("POST")) {
            request.setCharacterEncoding("GBK");
        } else {
            request = new Request(httpreq);
        }

        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

}
2、為了清楚起見,看下web.xml的filter設置
  <!--filter setting-->
        <filter>
        <filter-name>encoding</filter-name>
        <filter-class>filter.Encoding</filter-class>
    </filter>
   
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>       
    <filter>
        <filter-name>securityAndDeny</filter-name>
        <filter-class>filter.SecurityAndDeny</filter-class>
    </filter>
   
    <filter-mapping>
        <filter-name>securityAndDeny</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
從設置可以看出,如果訪問了/admin/下的網頁,這個兩個filter將先后執行,形成串聯工作,即首先對request進行編碼轉換,然后才進行登陸驗證和防站外提交,都通過后才能訪問您要的網頁資源
3、制作登陸驗證servlet
該servlet代碼如下:
/**登陸驗證servlet
*作者:luoshao
*日期:2008-1-9
*/
package servlet;
import geci.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AdminLogin extends HttpServlet{
    public void doPost(HttpServletRequest request,HttpServletResponse response)
     throws ServletException,IOException{
         try{
      String username=request.getParameter("username").replace("'","''");
      String password=request.getParameter("password").replace("'","''");
      //System.out.println(username + "/" + password);
      LrcDB lrcdb=new LrcDB();//來自geci.LrcDB,該類用到了tomcat連接池[清參看我關于連接池的設置]
      HttpSession session = request.getSession(true);
      if(lrcdb.adminLogin(username,password)){
          session.setAttribute("username",username);//驗證成功設置session
          //當轉向admin/下的網頁是會啟用第二個filter
          response.sendRedirect(request.getContextPath()+"/admin/admin.jsp");
      }else{
          session.invalidate();//登陸失敗,session失效
          response.sendRedirect(request.getContextPath()+"/LoginErr.htm");
      }
    }catch(Exception e){
        e.printStackTrace();
    }
  }
     public void doGet(HttpServletRequest request,HttpServletResponse response)
     throws ServletException,IOException{
      doPost(request,response);
    }  
}
4、web.xml中的servlet設置
    <servlet>
      <servlet-name>adminLogin</servlet-name>
      <servlet-class>servlet.AdminLogin</servlet-class>
    </servlet>       
    <servlet-mapping>
        <servlet-name>adminLogin</servlet-name>
        <url-pattern>/adminLogin</url-pattern>
5、制作登陸頁面
        <form action="adminLogin" method="POST" name="form2">
          <tr>
            <td width="97" height="23" bgcolor="#EEEEEE">&nbsp;<img src="images/User_Login.gif" width="13" height="13" />管理員登陸</td>
            <td width="93">&nbsp;</td>
          </tr>
          <tr height="1">
              <td bgcolor="#808080">            </td>
              <td bgcolor="#808080">            </td>
          </tr>
          <tr>
            <td height="30" colspan="2" bgcolor="#F2F2F2">&nbsp;管理員:
              <label>
              <input name="username" type="text" id="username" size="15" />
              </label></td>
          </tr>
          <tr>
            <td height="30" colspan="2" bgcolor="#F2F2F2">&nbsp;密&nbsp;&nbsp;碼:
              <label>
              <input name="password" type="password" id="password" size="15" />
              </label></td>
          </tr>
          <tr>
            <td height="30" colspan="2" bgcolor="#F2F2F2"><div align="center">
              <label>
              <input name="Submit" type="submit" class="buttonYinse" value="登 陸" />
              </label>
            </div></td>
          </tr>
          </form>
頁面其他部分省略。。。
可以看出表單提交給步驟3的servlet
------完
演示得從后面往前說了,當我們訪問了網站中除了/admin/下的網頁時,tomcat只啟用第一個filter;當我們登陸的時候,表單提交個/adminLogin,那么就啟用了第一個filter,對request的編碼進行了轉換,然后servlet對用用戶名密碼驗證后,轉向/admin/admin.jsp時,tomcat首先啟用一次第一個filter,然后直接轉到第二個filter,第二個filter發現session已經有了(剛才servlet驗證通過并設置了session)就直接進入了/admin/admin.jsp;如果用戶在未登陸情況下直接訪問/admin/admin.jsp,那么同樣會首先啟用第一個filter進行編碼轉換,然后再到第二個filter,在第二個filter中發現session根本沒有username屬性,頁面被強制轉向到/adminLogin.jsp,在這個轉向過程同樣還有啟用第一個filter。。。。。是不是很復雜,呵呵。
唯一的擔心:因為在這些跳轉中不止一次的啟用filter,對tomcat增加負擔,后果會不會很嚴重 -_-!!,不清楚。。。。。。


 


 

原文出處:http://luoshao.blog.163.com/blog/static/111399502008091058895/



柴油發電機
發電機
柴油機
柴油發電機
13636374743(上海)
13291526067(嘉興)