在本篇文章中将使用过滤器进行编码转换、登陆验证、防站外提交的过程,为了演示,我把编码转换放在一个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(嘉兴)