>
快捷搜索:

AJAX跨域完全讲授,数据库连接和数量增加和删除

- 编辑:皇家国际app -

AJAX跨域完全讲授,数据库连接和数量增加和删除

自家在收罗AJAX面试题的时候其实就已经有过AJAX跨域的题指标了,那时候知道了干吗会存在跨域,以及跨域消除的方案有何,今日趁着课程的就学,又强化了AJAX跨域的精晓,以此记录下来。

  • 对此非档次结构的数额,表示起来特别劳碌,不直观!

闭馆连接

为了安全性和项目性质,大家尽量在实施完操作之后关闭连接(就算高版本jvm会自动关闭它,不过那也急需检验浪费cpu财富)。关闭连接分为多个部分。

  • resultSet.close();
  • statement.close();
  • connection.close();

瞩如今后相继难题。

@EnableZuulProxy@RestController@SpringBootApplicationpublic class ZuulfiltertestApplication { public static void main(String[] args) { SpringApplication.run(ZuulfiltertestApplication.class, args); } @Bean public ZuulPreLogFilter zuulPreFilter() { return new ZuulPreLogFilter(); } @RequestMapping public String index(){ return "This is index!"; }}

zuul.routes.baidu.path=/baidu/**zuul.routes.baidu.url=http://www.baidu.com/
PrintWriter writer = response.getWriter();writer.write("<html><body>GET/POST response</body></html>");

动用手续

在后端扩展一个调整器,承继AbstractJsonpResponseBodyAdvice类,完整代码如下:

@ControllerAdvicepublic class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { public JsonpAdvice() { // TODO Auto-generated constructor stub super("callback2"); }}

前端ajax请求:

// 服务器返回的结果 var result; $.ajax({ url: base +"/get1", dataType: "jsonp", jsonp: "callback2", //是否需要缓存,如果这里没有配置缓存,那么请求的URL还会有一个参数 cache:true, success: function{ result = json; } });

留心的是,前端AJAX的jsonp: "callback2",要和大家的Controllersuper("callback2");是大同小异的,不然是不会使得的。

JSONP原理是动态创设script来进行呼吁的:

图片 1jTT5VAk.png

JSONP的弊端:

  • 要对服务器的代码举行转移
  • 只帮衬GET方法(原理是动态创造script来进展呼吁的)
  • 发送的不是XMLHttpRequest乞求(XMLHttpRequest央求有这些好用的风味)

参照他事他说加以考察资料:

COKugaS消除跨域难点(也正是大家服务端被调用方消除跨域的思绪)

对于COWranglerS是怎么精通的,小编就一直摘抄一下:

图片 2image

在Java中,大家写上边那个过滤器,就足以完全缓和跨域的主题材料了:

package com.imooc;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.tomcat.util.buf.StringUtils;public class CrosFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletResponse res = (HttpServletResponse) response; HttpServletRequest req = (HttpServletRequest) request; //带cookie的时候,origin必须是全匹配,不能使用* String origin = req.getHeader; if (!org.springframework.util.StringUtils.isEmpty { res.addHeader("Access-Control-Allow-Origin", origin); } res.addHeader("Access-Control-Allow-Methods", "*"); // 支持所有自定义头和预检命令(非简单请求会有预检命令) String headers = req.getHeader("Access-Control-Request-Headers"); if (!org.springframework.util.StringUtils.isEmpty { res.addHeader("Access-Control-Allow-Headers", headers); } res.addHeader("Access-Control-Max-Age", "3600"); // enable cookie res.addHeader("Access-Control-Allow-Credentials", "true"); chain.doFilter(request, response); } @Override public void destroy() { // TODO Auto-generated method stub }}

地方提到了非简单乞求,那什么样是非简单央浼呢,能够看上面包车型客车图:

图片 3image

非简单央求会发出多个预检命令的(当然了,大家地方的Filter已经缓和预检命令的主题素材了):

图片 4image

数据模型常常由三个部分构成:

张开连接

开发连接的话要求调用DriverManager类中的getConnection()方法,该措施有多个重载方法。如下所示

public static Connection getConnection(String url, java.util.Properties info) throws SQLException { return (getConnection(url, info, Reflection.getCallerClass; }public static Connection getConnection(String url, String user, String password) throws SQLException { java.util.Properties info = new java.util.Properties(); if (user != null) { info.put("user", user); } if (password != null) { info.put("password", password); } return (getConnection(url, info, Reflection.getCallerClass;} public static Connection getConnection(String url) throws SQLException { java.util.Properties info = new java.util.Properties(); return (getConnection(url, info, Reflection.getCallerClass; }

大要看下它的参数名字应该知道它必要哪些吗。在此处自个儿只解释第二个方法。Properties info 那个参数其实也是user和password的包装。其实和议程二平等。

从上述代码能够观望,能够访问的路由有两条:

HttpRequest对象足以获取哀求头,那么HttpResponse必需设置这一个参数。譬喻:

鲜明地,跨域的难题是由于浏览器限制的,是XMLHttpRequest才会时有爆发的,那么大家得以以那几个思路去找找化解思路:

数据库就缓慢解决了地点的标题,并且数据库以特殊的编写制定管理数据文件,对数据有非常高的读写速度,大大超过了操作系统对不奇怪文件的读写速度。

AJAX跨域完全讲授,数据库连接和数量增加和删除改查。数据修改/删除

干什么要把修改和删除放一块说吗,因为他们和查询调用不相同等的点子。查询我们调用executeQuery()方法,修改和删除我们须求用executeUpdate()方法。举个轻易的例证:

//更新数据String sql = "update user set name='fantj' where id=1";int rowsAffected = statement.executeUpdate; //rowsAffected是影响行数的意思//删除数据String sql = "delete from user where id=123";int rowsAffected = statement.executeUpdate;
public class ZuulPreLogFilter extends ZuulFilter { private static final Logger LOGGER = LoggerFactory.getLogger(ZuulPreLogFilter.class); @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); ZuulPreLogFilter.LOGGER.info(String.format("Send %s request to %s", request.getMethod(), request.getRequestURL().toString; return null; }}

HttpResponse对象有一成千上万措施,笔者会介绍这里最常用的方式。如若你风野趣别的方式您能够在JavaDoc中读书。

值得注意的是:跨域的标题是发生在XMLHttpRequest央浼的,也正是说,不是XMLHttpRequest伏乞是不会有跨域难题的

外模式

外情势是对数据库顾客能瞥见和选择的一些数据逻辑结构的叙说,是与某一应用有关的数码的逻辑表示

外格局是足以有多个的,外情势是顾客和DBAS的接口,是对一些逻辑结构的陈述!

当客户应用程序只供给出示客商名称和密码时:

  • 客商关系(客户名称,顾客密码)

在数据库中操作局地逻辑结构就称作为外格局

实例:
public class Main { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/user"; String user = "root"; String password = "root"; Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { // 1.加载驱动//com.mysql.jdbc.Driver Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接 connection = DriverManager.getConnection(url, user, password); // 3.获取用于向数据库发送SQL的Statement对象 statement = connection.createStatement(); // 4.执行sql,获取数据 resultSet = statement.executeQuery("SELECT * FROM user;"); // 解析数据 while (resultSet.next { int id = resultSet.getInt; String name = resultSet.getString("username"); String psd = resultSet.getString("birthday"); String email = resultSet.getString; String birthday = resultSet.getString("address"); System.out.println(" " + name + " " + psd + " " + email + " " + birthday); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //5.关闭连接,释放资源 if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } resultSet = null; } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } statement = null; } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } connection = null; } } }}

揭秘:

实质上唯有"/baidu"多少个路由经过了zuulFilter的过滤,打字与印刷了日志:Send GET request to http://localhost:9999/baidu。那是因为该路由经由zuul代理转载,而根路线只是路由映射,因此并未有经过zuul过滤器的生命周期。

你能够编写文本回浏览器实际不是HTML,

  • 当大家发送XMLHttpRequest诉求的时候,固然央求的是别的域分裂一时间,那么就能够产生跨域难点(顾客端不能得到服务端重临的数据)

但怎么把“一棵树“在Computer描述起来呢??微机只识别0和1”一棵树“是无法一向存款和储蓄到计算机上的

数据查询

多少查询供给大家将sql发送给数据库,大家须要创建五个Statement对象。

Statement statement = connection.createStatement();

因为Statement对象足以推行sql

String sql = "select * from user";ResultSet resultSet = statement.executeQuery;

当实行二个sql查询的时候,会得道一个ResultSet对象,它里面放着询问的结果。

ResultSet resultSet = statement.executeQuery("SELECT * FROM user;");

那怎么得到user表中对应列的数额吧?

 resultSet .getString ("columnName"); resultSet .getLong ("columnName"); resultSet .getInt ("columnName"); resultSet .getDouble ("columnName"); resultSet .getBigDecimal("columnName");

要么经过第几列进行询问。

 resultSet .getString ; resultSet .getLong ; resultSet .getInt ; resultSet .getDouble ; resultSet .getBigDecimal;

假诺您想知道对应列名的index值,能够这么

 int columnIndex = resultSet .findColumn("columnName");
  1. filterType:再次来到过滤器的门类。有pre、route、post、error等二种取值,分别对应上文的两种过滤器。详细能够参见com.netflix.zuul.ZuulFilter.filterType()中的注释。
  2. filterOrder:再次回到八个int值来内定过滤器的实行顺序,分歧的过滤器允许再次回到同样的数字。
  3. shouldFilter:重回二个boolean值来决断该过滤器是不是要进行,true表示实践,false表示不施行
  4. run:过滤器的现实逻辑。本例中,我们让它打印了必要的HTTP方法以及呼吁的地点。
protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
  • 举个不会细小略的例证:在编写网页的时候,<img = src = www.xxxx.xxxx/ >,U凯雷德L不是本域的要么得以平常获取该图形的

缺点:

加载JDBC驱动

只须要在首先次延续数据库时加载,java6现在大家可以直接那样加载:*本身在本连串教程中用mysql示例。

  1. 急需导入jar包:mysql-connector-java-5.0.8-bin.jar(版本和下载网址本身挑)
  2. 如果是web程序,把jar包放到WebRoot/WEB-INF/lib/下
  3. 假设是平时java项目,将jar包导入到自个儿项目标lib库中。
  4. 下一场加载驱动如下
Class.forName("com.mysql.jdbc.Driver");

自定义过滤器必要扩张ZuulFilter类,并遮掩以下七个法子。

response.setHeader("Header-Name", "Header Value");

今日在慕课英特网学习了AJAX跨域完全讲明:

数据库是二个以某种有集体的艺术存款和储蓄的多少集结。也就是:封存有组织数据的容器(五个文书或一组文件)

  • 路由1:"/"根路线,响应结果是打字与印刷如下内容:"This is index!";
  • 路由2:"/baidu",响应结果是跳转到百度查寻页面。

Content-Length告诉浏览器你的响应音信是不怎么个字节

地方的图也很明显了,因为浏览器为了安全,本人就限制了。

  • 数据结构(对象与目的时期的涉及)
  • 数码操作
  • 完整性约束(限定数量是有必然准绳的,比如:年龄无法为负数)
  • 注入ZuulPreLogFilter对象
  • 表明开启Zuul代理转载功效
  • 声明扩张路由调控器

HttpServlet 类要求多个参数HttpRequest和HttpResponse。比方doGet方法

图片 5image

  • 结构清晰,轻巧驾驭
  • 节点之间关系能够透过指针来促成,查询功用高

本人在那先介绍HttpResponse。HttpResponse对象的指标是为着响应浏览器发送给Web应用程序的HTTP乞求,表示Web应用程序发送回浏览器的HTTP响应。

本文由皇家国际app发布,转载请注明来源:AJAX跨域完全讲授,数据库连接和数量增加和删除