DWR之入门学习笔记

相信很多朋友也和我一样,在开始学习dwr的时候,遇到一些不可思议的问题,同样很郁闷、头疼,都在网上找过很多资料。

而最常遇到的问题是:

 

    1、A request has been denied as a potential CSRF attack

    2、没有了以上的错误,但还是不能达到想要的效果。js校验失败。

   为了解决第一个问题,在web.xml文件中配置crossDomainSessionSecurity参数,其值为false(默认为true)

    而第二个问题,将

    
  
  

修改为:


  
  即可解决。

虽然为了解决问题,花了我一天的时间,但我相信终有一天,我会因为今天的付出而有所收获。现在我就将今天所遇到的问题详细记录,希望能给跟我遇到同一问题朋友的做个参考。

我所做的实例名称为:DwrDemo(简单的表单注册校验功能)

在看下面的内容之前,请您先把dwr.jar包导入到该项目的/WEB-INF/lib下,再把dwr用到的两个重要的js文件也copy到项目的WebRoot下的比如放在js文件夹中(这里两个js到底用不用到,我还没有仔细查找资料。为什么这么说呢?先往下看看吧。)。

首先是创建数据库。这个数据库有

    id(主键)、username、password三个字段。怎么创建就不需要我废话了。下面顺便贴上我的代码(为了整个实例的整洁)

 

  1. create table `test`.`dwrfirst`(
  2.         `id` int default '' not null,
  3.        `username` varchar(30default '' not null,
  4.        `password` varchar(20default '' not null,
  5.         primary key (`id`)
  6.     );

其二创建一个po类User;

  1. private int id;
  2.     
  3.     private String username;
  4.     
  5.     private String password;
  6.     
  7.     //这里省略各属性的set、get方法了...

其三创建一个封装(获取)数据库连接的类DBConnection类,代码如下: 

  1. public class DBConnection {
  2.     private static String driverClass = "org.gjt.mm.mysql.Driver";
  3.     private static String url = "jdbc:mysql://localhost:3306/test";
  4.     private static String name = "root";
  5.     private static String pwd = "ldhhjldph";
  6.     public static Connection getConnection() throws SQLException {
  7.         try {
  8.             Class.forName(driverClass);
  9.             Connection conn = DriverManager.getConnection(url, name, pwd);
  10.             return conn;
  11.         } catch (ClassNotFoundException e) {
  12.             System.err.println("加载驱动错误!!!");
  13.             return null;
  14.         }
  15.     }
  16. }

 

其四创建一个操作数据库(这里只提供一个方法:根据用户输入的用户名从数据库中查找,从而判断该用户名是否可用)

        UserDAO;

  1. public class UserDAO {
  2.     public boolean isExistUser(String name) {
  3.         // 如果为true,则存在该用户
  4.         boolean flag = true;
  5.         String sql = "select count(*) from dwrfirst where username = ?";
  6.         try {
  7.             java.sql.Connection conn = DBConnection.getConnection();
  8.             PreparedStatement pstmt = conn.prepareStatement(sql);
  9.             pstmt.setString(1, name);
  10.             ResultSet rs = pstmt.executeQuery();
  11.             rs.next();
  12.             if (0 == rs.getInt(1)) {
  13.                 flag = false;
  14.             }
  15.         } catch (SQLException e) {
  16.             System.err.println("执行语句错误" + e.getMessage() + sql);
  17.         }
  18.         return flag;
  19.     }
  20. }

其五再创建一个供jsp页面中js调用的类UserDAODwr;

  1. public boolean isExistUser(String name)
  2.     {
  3.         UserDAO dao = new UserDAO();
  4.         return dao.isExistUser(name);
  5.     }

到了这里,服务器端的代码基本上写完了。

接下来,我们看看配置文件web.xml

要使项目支持dwr,出来dwr.jar这个包,还需要在web.xml文件中配置有关servlet;将该文件修改如下:

  1. "1.0" encoding="UTF-8"?>
  2. "2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  5.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  6.     
  7.         login.jsp
  8.     
  9.     
  10.         dwr
  11.         class>
  12.             org.directwebremoting.servlet.DwrServlet
  13.         class>
  14.         
  15.             debug
  16.             true
  17.         
  18.      
  19.     
  20.         dwr
  21.         /dwr/*
  22.     

接下来还需要新建一个xml文件:dwr.xml,将你在jsp/html页面要调用的java类定义在这个文件中。

完整代码如下:

  1. "1.0" encoding="UTF-8"?>
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.org/dwr/dwr20.dtd">
  4.     
  5.         "new" javascript="user">
  6.             "class" value="org.qpyong.dwr.UserDAODwr" />
  7.         
  8.     

下面我们来看看最后几步了。主要是一些页面:

login.jsp页面:

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. "-//W3C//DTD HTML 4.01 Transitional//EN">
  3.     
  4.         登录页面
  5.         "text/javascript" src="js//util.js">
  6.         "text/javascript" src="js/engine.js">
  7.         "text/javascript" src="dwr/interface/user.js">
  8.         "text/javascript">
  9.         function callBack(flag)
  10.         {
  11.             if(flag)
  12.             {
  13.                 document.getElementById("error_td").innerHTML = "对不起,该用户名已存在!";
  14.             }
  15.             else
  16.             {
  17.                 document.getElementById("error_td").innerHTML = "恭喜,该用户名可用!";
  18.             }
  19.         }
  20.         function isUsed()
  21.         {
  22.             var name = document.all.username.value;
  23.             user.isExistUser(name,callBack);
  24.         }
  25.     
  26.     
  27.     
  28.         
  29.             "index.jsp" method="post">
  30.                 
  31.                     "center">
  32.                         "2">
  33.                             "3">用户注册
  34.                         
  35.                     
  36.                     "center">
  37.                         "2" style="color: red; height: 20;" id="error_td">
  38.                     
  39.                     
  40.                         
  41.                         
  42.                     
  43.                     
  44.                         
  45.                         
  46.                     
  47.                     
  48.                         "2" align="center">
  49.                             "submit" value="注册" />
  50.                         
  51.                     
  52.                 
  53. 用户名: "text" name="username" οnchange="isUsed()" />
    密  码: "password" name="password" />
  54.             
  55.         
  56.     

index.jsp页面:

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. "-//W3C//DTD HTML 4.01 Transitional//EN">
  3.   
  4.     登录成功页面
  5.   
  6.   
  7.     
  8.         "red">
  9.         注册成功!!!
  10.         
  11.     
  12.   

到这里,这个项目总算完成了。

打开浏览器,输入:http://localhost:8080/DwrDemo/

打开login.jsp页面。在“用户名”右边的文本框中输入一些字符串。但不管你输的是什么字符串。在MyEclipse后台中你都会看到下面的错误:

严重: A request has been denied as a potential CSRF attack.

错误原因(引用别人的话):请求被拒绝因为可能存在csrf(cross-site request forgeries,跨站请求伪造)攻击.
也就是说页面URL可能被跨站了的服务所调用.
例如:自己页面的一个图片.可能被其他站直接通过[img]....[/img]来引用.

我也采取了别人的意见,在web.xml文件中配置corssDomainSessionSecurity

修改web.xml文件,代码如下:

  1.         dwr
  2.         class>
  3.             org.directwebremoting.servlet.DwrServlet
  4.         class>
  5.         
  6.             debug
  7.             true
  8.         
  9.         
  10.             crossDomainSessionSecurity
  11.             false
  12.         
  13.     
  14.     
  15.         dwr
  16.         /dwr/*
  17.     

粗体部分是添加的代码。再次运行jsp页面,却发现出现如下图的错误:

DWR之入门学习笔记_第1张图片

在浏览器的状态栏上提示“网页上有错误”,而MyEclipse的后台上也没有刚才的那一错误信息了。

我就更觉得奇怪了。因为我是按照dwr参考资料上的代码写的,我感觉我没有“抄”错(代码)。

于是又在网上找资料。终于皇天不负苦心人。让我参考了一份很好的资料。

建议如下:

  1. "text/javascript" src="js/util.js">
  2. script type="text/javascript" src="js/engine.js">
  3. "text/javascript" src="dwr/interface/user.js">

改为如下:

  1. "text/javascript" src="dwr/util.js">
  2. "text/javascript" src="dwr/engine.js">
  3. "text/javascript" src="dwr/interface/user.js">

再次运行login.jsp页面

效果图如下:

DWR之入门学习笔记_第2张图片

到此,这个小案例终于告一段落。

不过,我到现在也不明白,在jsp/html页面为什么不直接引用js文件夹的js文件。明天再上网查查资料。

说明:

    对于DWR,我也是初学者。有很地方也许说得不对、不好,请各位见谅。也请高手给给意见。

你可能感兴趣的:(DWR)