当前位置: 首页 > news >正文

合肥建设网站哪家好东莞公司网站做优化

合肥建设网站哪家好,东莞公司网站做优化,厦门公司做网站,东莞模板建站软件四、反射 57. 什么是反射#xff1f; 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力 Java反射#xff1a; 在Java运行时环境中#xff0c;对于任意一个类#xff0c;能否知道这个类有哪些属性和方法#xff1f;对于任意一个对象#xff0c;能否调…四、反射 57. 什么是反射 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力 Java反射 在Java运行时环境中对于任意一个类能否知道这个类有哪些属性和方法对于任意一个对象能否调用它的任意一个方法 Java反射机制主要提供了以下功能 在运行时判断任意一个对象所属的类。在运行时构造任意一个类的对象。在运行时判断任意一个类所具有的成员变量和方法。在运行时调用任意一个对象的方法。  58. 什么是 java 序列化什么情况下需要序列化 简单说就是为了保存在内存中的各种对象的状态也就是实例变量不是方法并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states但是Java给你提供一种应该比你自己好的保存对象状态的机制那就是序列化。 什么情况下需要序列化 a当你想把的内存中的对象状态保存到一个文件中或者数据库中时候 b当你想用套接字在网络上传送对象的时候 c当你想通过RMI传输对象的时候 59. 动态代理是什么有哪些应用 动态代理 当想要给实现了某个接口的类中的方法加一些额外的处理。比如说加日志加事务等。可以给这个类创建一个代理故名思议就是创建一个新的类这个类不仅包含原来类方法的功能而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的是动态生成的。具有解耦意义灵活扩展性强。 动态代理的应用 Spring的AOP加事务加权限加日志 60. 怎么实现动态代理 首先必须定义一个接口还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类。利用到InvocationHandler拼接代理类源码将其编译生成代理类的二进制码利用加载器加载并将其实例化产生代理对象最后返回。 五、对象拷贝 61. 为什么要使用克隆 想对一个对象进行处理又想保留原有的数据进行接下来的操作就需要克隆了Java语言中克隆针对的是类的实例。 62. 如何实现对象克隆 有两种方式 1). 实现Cloneable接口并重写Object类中的clone()方法 2). 实现Serializable接口通过对象的序列化和反序列化实现克隆可以实现真正的深度克隆代码如下 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable;public class MyUtil {private MyUtil() {throw new AssertionError();}SuppressWarnings(unchecked)public static T extends Serializable T clone(T obj) throws Exception {ByteArrayOutputStream bout new ByteArrayOutputStream();ObjectOutputStream oos new ObjectOutputStream(bout);oos.writeObject(obj);ByteArrayInputStream bin new ByteArrayInputStream(bout.toByteArray());ObjectInputStream ois new ObjectInputStream(bin);return (T) ois.readObject();// 说明调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义// 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源这一点不同于对外部资源如文件流的释放} } 下面是测试代码 import java.io.Serializable;/*** 人类* author nnngu**/ class Person implements Serializable {private static final long serialVersionUID -9102017020286042305L;private String name; // 姓名private int age; // 年龄private Car car; // 座驾public Person(String name, int age, Car car) {this.name name;this.age age;this.car car;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}public Car getCar() {return car;}public void setCar(Car car) {this.car car;}Overridepublic String toString() {return Person [name name , age age , car car ];}} /*** 小汽车类* author nnngu**/ class Car implements Serializable {private static final long serialVersionUID -5713945027627603702L;private String brand; // 品牌private int maxSpeed; // 最高时速public Car(String brand, int maxSpeed) {this.brand brand;this.maxSpeed maxSpeed;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand brand;}public int getMaxSpeed() {return maxSpeed;}public void setMaxSpeed(int maxSpeed) {this.maxSpeed maxSpeed;}Overridepublic String toString() {return Car [brand brand , maxSpeed maxSpeed ];}} class CloneTest {public static void main(String[] args) {try {Person p1 new Person(郭靖, 33, new Car(Benz, 300));Person p2 MyUtil.clone(p1); // 深度克隆p2.getCar().setBrand(BYD);// 修改克隆的Person对象p2关联的汽车对象的品牌属性// 原来的Person对象p1关联的汽车不会受到任何影响// 因为在克隆Person对象时其关联的汽车对象也被克隆了System.out.println(p1);} catch (Exception e) {e.printStackTrace();}} } 注意基于序列化和反序列化实现的克隆不仅仅是深度克隆更重要的是通过泛型限定可以检查出要克隆的对象是否支持序列化这项检查是编译器完成的不是在运行时抛出异常这种是方案明显优于使用Object类的clone方法克隆对象。让问题在编译的时候暴露出来总是好过把问题留到运行时。 63. 深拷贝和浅拷贝区别是什么 浅拷贝只是复制了对象的引用地址两个对象指向同一个内存地址所以修改其中任意的值另一个值都会随之变化这就是浅拷贝例assign()深拷贝是将对象及值复制过来两个对象修改其中任意的值另一个值不会改变这就是深拷贝例JSON.parse()和JSON.stringify()但是此方法无法复制函数类型 六、Java Web 64. jsp 和 servlet 有什么区别 jsp经编译后就变成了Servlet.JSP的本质就是ServletJVM只能识别java的类不能识别JSP的代码Web容器将JSP的代码编译成JVM能够识别的java类jsp更擅长表现于页面显示servlet更擅长于逻辑控制。Servlet中没有内置对象Jsp中的内置对象都是必须通过HttpServletRequest对象HttpServletResponse对象以及HttpServlet对象得到。Jsp是Servlet的一种简化使用Jsp只需要完成程序员需要输出到客户端的内容Jsp中的Java脚本如何镶嵌到一个类中由Jsp容器完成。而Servlet则是个完整的Java类这个类的Service方法用于生成对客户端的响应。 65. jsp 有哪些内置对象作用分别是什么 JSP有9个内置对象 request封装客户端的请求其中包含来自GET或POST请求的参数response封装服务器对客户端的响应pageContext通过该对象可以获取其他对象session封装用户会话的对象application封装服务器运行环境的对象out输出服务器响应的输出流对象configWeb应用的配置对象pageJSP页面本身相当于Java程序中的thisexception封装页面抛出异常的对象。 66. 说一下 jsp 的 4 种作用域 JSP中的四种作用域包括page、request、session和application具体来说 page代表与一个页面相关的对象和属性。request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面涉及多个Web组件需要在页面显示的临时数据可以置于此作用域。session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。application代表与整个Web应用程序相关的对象和属性它实质上是跨越整个Web应用程序包括多个页面、请求和会话的一个全局作用域。 67. session 和 cookie 有什么区别 由于HTTP协议是无状态的协议所以服务端需要记录用户的状态时就需要用某种机制来识具体的用户这个机制就是Session.典型的场景比如购物车当你点击下单按钮时由于HTTP协议无状态所以并不知道是哪个用户操作的所以服务端要为特定的用户创建了特定的Session用用于标识这个用户并且跟踪用户这样才知道购物车里面有几本书。这个Session是保存在服务端的有一个唯一标识。在服务端保存Session的方法很多内存、数据库、文件都有。集群的时候也要考虑Session的转移在大型的网站一般会有专门的Session服务器集群用来保存用户会话这个时候 Session 信息都是放在内存的使用一些缓存服务比如Memcached之类的来放 Session。思考一下服务端如何识别特定的客户这个时候Cookie就登场了。每次HTTP请求的时候客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的第一次创建Session的时候服务端会在HTTP协议中告诉客户端需要在 Cookie 里面记录一个Session ID以后每次请求把这个会话ID发送到服务器我就知道你是谁了。有人问如果客户端的浏览器禁用了 Cookie 怎么办一般这种情况下会使用一种叫做URL重写的技术来进行会话跟踪即每次HTTP交互URL后面都会被附加上一个诸如 sidxxxxx 这样的参数服务端据此来识别用户。Cookie其实还可以用在一些方便用户的场景下设想你某次登陆过一个网站下次登录的时候不想再次输入账号了怎么办这个信息可以写到Cookie里面访问网站的时候网站页面的脚本可以读取这个信息就自动帮你把用户名给填了能够方便一下用户。这也是Cookie名称的由来给用户的一点甜头。所以总结一下Session是在服务端保存的一个数据结构用来跟踪用户的状态这个数据可以保存在集群、数据库、文件中Cookie是客户端保存用户信息的一种机制用来记录用户的一些信息也是实现Session的一种方式。 68. 说一下 session 的工作原理 其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息在我们需要用的时候可以从里面取出来。类似于一个大号的map吧里面的键存储的是用户的sessionid用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了。 69. 如果客户端禁止 cookie 能实现 session 还能用吗 Cookie与 Session一般认为是两个独立的东西Session采用的是在服务器端保持状态的方案而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢因为Session是用Session ID来确定当前对话所对应的服务器Session而Session ID是通过Cookie来传递的禁用Cookie相当于失去了Session ID也就得不到Session了。 假定用户关闭Cookie的情况下使用Session其实现途径有以下几种 设置php.ini配置文件中的“session.use_trans_sid 1”或者编译时打开打开了“--enable-trans-sid”选项让PHP自动跨页传递Session ID。手动通过URL传值、隐藏表单传递Session ID。用文件、数据库等形式保存Session ID在跨页过程中手动调用。 70. spring mvc 和 struts 的区别是什么 拦截机制的不同 Struts2是类级别的拦截每次请求就会创建一个Action和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype然后通过settergetter吧request数据注入到属性。Struts2中一个Action对应一个requestresponse上下文在接收参数时可以通过属性接收这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url而其类属性却被所有方法共享这也就无法用注解或其他方式标识其所属方法了只能设计为多例。 SpringMVC是方法级别的拦截一个方法对应一个Request上下文所以方法直接基本上是独立的独享requestresponse数据。而每个方法同时又何一个url对应参数的传递是直接注入到方法中的是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时SpringMVC的Controller Bean默认单例模式Singleton所以默认对所有的请求只会创建一个Controller有应为没有共享的属性所以是线程安全的如果要改变默认的作用域需要添加Scope注解修改。 Struts2有自己的拦截Interceptor机制SpringMVC这是用的是独立的Aop方式这样导致Struts2的配置文件量还是比SpringMVC大。 底层框架的不同 Struts2采用FilterStrutsPrepareAndExecuteFilter实现SpringMVCDispatcherServlet则采用Servlet实现。Filter在容器启动之后即初始化服务停止以后坠毁晚于Servlet。Servlet在是在调用时初始化先于Filter调用服务停止后销毁。 性能方面 Struts2是类级别的拦截每次请求对应实例一个新的Action需要加载所有的属性值注入SpringMVC实现了零配置由于SpringMVC基于方法的拦截有加载一次单例模式bean注入。所以SpringMVC开发效率和性能高于Struts2。 配置方面 spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。 71. 如何避免 sql 注入 PreparedStatement简单又有效的方法使用正则表达式过滤传入的参数字符串过滤JSP中调用该函数检查是否包函非法字符JSP页面判断代码 72. 什么是 XSS 攻击如何避免 XSS攻击又称CSS,全称Cross Site Script  跨站脚本攻击其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码当用户浏览该网站时这段 HTML 代码会自动执行从而达到攻击的目的。XSS 攻击类似于 SQL 注入攻击SQL注入攻击中以SQL语句作为用户输入从而达到查询/修改/删除数据的目的而在xss攻击中通过插入恶意脚本实现对用户游览器的控制获取用户的一些信息。 XSS是 Web 程序中常见的漏洞XSS 属于被动式且用于客户端的攻击方式。 XSS防范的总体思路是对输入(和URL参数)进行过滤对输出进行编码。 73. 什么是 CSRF 攻击如何避免 CSRFCross-site request forgery也被称为 one-click attack或者 session riding中文全称是叫跨站请求伪造。一般来说攻击者通过伪造用户的浏览器的请求向访问一个用户自己曾经认证访问过的网站发送出去使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为网站能够确认请求来源于用户的浏览器却不能验证请求是否源于用户的真实意愿下的操作行为。 如何避免 1. 验证 HTTP Referer 字段 HTTP头中的Referer字段记录了该 HTTP 请求的来源地址。在通常情况下访问一个安全受限页面的请求来自于同一个网站而如果黑客要对其实施 CSRF 攻击他一般只能在他自己的网站构造请求。因此可以通过验证Referer值来防御CSRF 攻击。 2. 使用验证码 关键操作页面加上验证码后台收到请求后通过判断验证码可以防御CSRF。但这种方法对用户不太友好。 3. 在请求地址中添加token并验证 CSRF 攻击之所以能够成功是因为黑客可以完全伪造用户的请求该请求中所有的用户验证信息都是存在于cookie中因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie 来通过安全验证。要抵御 CSRF关键在于在请求中放入黑客所不能伪造的信息并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token并在服务器端建立一个拦截器来验证这个 token如果请求中没有token或者 token 内容不正确则认为可能是 CSRF 攻击而拒绝该请求。这种方法要比检查 Referer 要安全一些token 可以在用户登陆后产生并放于session之中然后在每次请求时把token 从 session 中拿出与请求中的 token 进行比对但这种方法的难点在于如何把 token 以参数的形式加入请求。 对于 GET 请求token 将附在请求地址之后这样 URL 就变成 http://url?csrftokentokenvalue。 而对于 POST 请求来说要在 form 的最后加上 input typehidden namecsrftoken valuetokenvalue/这样就把token以参数的形式加入请求了。 4. 在HTTP 头中自定义属性并验证 这种方法也是使用 token 并进行验证和上一种方法不同的是这里并不是把 token 以参数的形式置于 HTTP 请求之中而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便同时通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏也不用担心 token 会透过 Referer 泄露到其他网站中去。 七、异常 74. throw 和 throws 的区别 throws是用来声明一个方法可能抛出的所有异常信息throws是将异常声明但是不处理而是将异常往上传谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型。 75. final、finally、finalize 有什么区别 final可以修饰类、变量、方法修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。finally一般作用在try-catch代码块中在处理异常的时候通常我们将一定要执行的代码方法finally代码块中表示不管是否出现异常该代码块都会执行一般用来存放一些关闭资源的代码。finalize是一个方法属于Object类的一个方法而Object类是所有类的父类该方法一般由垃圾回收器来调用当我们调用System的gc()方法的时候由垃圾回收器调用finalize(),回收垃圾。  76. try-catch-finally 中哪个部分可以省略 答catch 可以省略 原因 更为严格的说法其实是try只适合处理运行时异常trycatch适合处理运行时异常普通异常。也就是说如果你只用try去处理普通异常却不加以catch处理编译是通不过的因为编译器硬性规定普通异常如果选择捕获则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定所以catch可以省略你加上catch编译器也觉得无可厚非。 理论上编译器看任何代码都不顺眼都觉得可能有潜在的问题所以你即使对所有代码加上try代码在运行期时也只不过是在正常运行的基础上加一层皮。但是你一旦对一段代码加上try就等于显示地承诺编译器对这段代码可能抛出的异常进行捕获而非向上抛出处理。如果是普通异常编译器要求必须用catch捕获以便进一步处理如果运行时异常捕获然后丢弃并且finally扫尾处理或者加上catch捕获以便进一步处理。 至于加上finally则是在不管有没捕获异常都要进行的“扫尾”处理。 77. try-catch-finally 中如果 catch 中 return 了finally 还会执行吗 答会执行在 return 前执行。 代码示例1 /** java面试题--如果catch里面有return语句finally里面的代码还会执行吗*/ public class FinallyDemo2 {public static void main(String[] args) {System.out.println(getInt());}public static int getInt() {int a 10;try {System.out.println(a / 0);a 20;} catch (ArithmeticException e) {a 30;return a;/** return a 在程序执行到这一步的时候这里不是return a 而是 return 30这个返回路径就形成了* 但是呢它发现后面还有finally所以继续执行finally的内容a40* 再次回到以前的路径,继续走return 30形成返回路径之后这里的a就不是a变量了而是常量30*/} finally {a 40;}// return a;} } 执行结果30 代码示例2 package com.java_02;/** java面试题--如果catch里面有return语句finally里面的代码还会执行吗*/ public class FinallyDemo2 {public static void main(String[] args) {System.out.println(getInt());}public static int getInt() {int a 10;try {System.out.println(a / 0);a 20;} catch (ArithmeticException e) {a 30;return a;/** return a 在程序执行到这一步的时候这里不是return a 而是 return 30这个返回路径就形成了* 但是呢它发现后面还有finally所以继续执行finally的内容a40* 再次回到以前的路径,继续走return 30形成返回路径之后这里的a就不是a变量了而是常量30*/} finally {a 40;return a; //如果这样就又重新形成了一条返回路径由于只能通过1个return返回所以这里直接返回40}// return a;} } 执行结果40 78. 常见的异常类有哪些 NullPointerException当应用程序试图访问空对象时则抛出该异常。SQLException提供关于数据库访问错误或其他错误信息的异常。IndexOutOfBoundsException指示某排序索引例如对数组、字符串或向量的排序超出范围时抛出。 NumberFormatException当应用程序试图将字符串转换成一种数值类型但该字符串不能转换为适当格式时抛出该异常。FileNotFoundException当试图打开指定路径名表示的文件失败时抛出此异常。IOException当发生某种I/O异常时抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。ClassCastException当试图将对象强制转换为不是实例的子类时抛出该异常。ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数。ArithmeticException当出现异常的运算条件时抛出此异常。例如一个整数“除以零”时抛出此类的一个实例。 NegativeArraySizeException如果应用程序试图创建大小为负的数组则抛出该异常。NoSuchMethodException无法找到某一特定方法时抛出该异常。SecurityException由安全管理器抛出的异常指示存在安全侵犯。UnsupportedOperationException当不支持请求的操作时抛出该异常。RuntimeExceptionRuntimeException是那些可能在Java虚拟机正常运行期间抛出的异常的超类。 八、网络 79. http 响应码 301 和 302 代表的是什么有什么区别 答301302 都是HTTP状态的编码都代表着某个URL发生了转移。 区别  301 redirect: 301 代表永久性转移(Permanently Moved)。302 redirect: 302 代表暂时性转移(Temporarily Moved )。  80. forward 和 redirect 的区别 Forward和Redirect代表了两种请求转发方式直接转发和间接转发。 直接转发方式Forward客户端和浏览器只发出一次请求Servlet、HTML、JSP或其它信息资源由第二个信息资源响应该请求在请求对象request中保存的对象对于每个信息资源是共享的。 间接转发方式Redirect实际是两次HTTP请求服务器端在响应第一次请求的时候让浏览器再向另外一个URL发出请求从而达到转发的目的。 举个通俗的例子 直接转发就相当于“A找B借钱B说没有B去找C借借到借不到都会把消息传递给A” 间接转发就相当于A找B借钱B说没有让A去找C借。 81. 简述 tcp 和 udp的区别 TCP面向连接如打电话要先拨号建立连接;UDP是无连接的即发送数据之前不需要建立连接。TCP提供可靠的服务。也就是说通过TCP连接传送的数据无差错不丢失不重复且按序到达;UDP尽最大努力交付即不保证可靠交付。Tcp通过校验和重传控制序号标识滑动窗口、确认应答实现可靠传输。如丢包时的重发控制还可以对次序乱掉的分包进行顺序控制。UDP具有较好的实时性工作效率比TCP高适用于对高速传输和实时性有较高的通信或广播通信。每一条TCP连接只能是点到点的;UDP支持一对一一对多多对一和多对多的交互通信。TCP对系统资源要求较多UDP对系统资源要求较少。 82. tcp 为什么要三次握手两次不行吗为什么 为了实现可靠数据传输 TCP 协议的通信双方 都必须维护一个序列号 以标识发送出去的数据包中 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值 并确认对方已经收到了序列号起始值的必经步骤。 如果只是两次握手 至多只有连接发起方的起始序列号能被确认 另一方选择的序列号则得不到确认。 83. 说一下 tcp 粘包是怎么产生的 ①. 发送方产生粘包 采用TCP协议传输数据的客户端与服务器经常是保持一个长连接的状态一次连接发一次数据不存在粘包双方在连接不断开的情况下可以一直传输数据但当发送的数据包过于的小时那么TCP协议默认的会启用Nagle算法将这些较小的数据包进行合并发送缓冲区数据发送是一个堆压的过程这个合并过程就是在发送缓冲区中进行的也就是说数据发送出来它已经是粘包的状态了。 ②. 接收方产生粘包 接收方采用TCP协议接收数据时的过程是这样的数据到底接收方从网络模型的下方传递至传输层传输层的TCP协议处理是将其放置接收缓冲区然后由应用层来主动获取C语言用recv、read等函数这时会出现一个问题就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来而下一个数据又到来并有一部分放入的缓冲区末尾等我们读取数据时就是一个粘包。放数据的速度 应用层拿数据速度  84. OSI 的七层模型都有哪些 应用层网络服务与最终用户的一个接口。表示层数据的表示、安全、压缩。会话层建立、管理、终止会话。传输层定义传输数据的协议端口号以及流控和差错校验。网络层进行逻辑地址寻址实现不同网络之间的路径选择。数据链路层建立逻辑连接、进行硬件地址寻址、差错校验等功能。物理层建立、维护、断开物理连接。 85. get 和 post 请求有哪些区别 GET在浏览器回退时是无害的而POST会再次提交请求。GET产生的URL地址可以被Bookmark而POST不可以。GET请求会被浏览器主动cache而POST不会除非手动设置。GET请求只能进行url编码而POST支持多种编码方式。GET请求参数会被完整保留在浏览器历史记录里而POST中的参数不会被保留。GET请求在URL中传送的参数是有长度限制的而POST么有。对参数的数据类型GET只接受ASCII字符而POST没有限制。GET比POST更不安全因为参数直接暴露在URL上所以不能用来传递敏感信息。GET参数通过URL传递POST放在Request body中。 86. 如何实现跨域 方式一图片ping或script标签跨域 图片ping常用于跟踪用户点击页面或动态广告曝光次数。 script标签可以得到从其他来源数据这也是JSONP依赖的根据。  方式二JSONP跨域 JSONPJSON with Padding是数据格式JSON的一种“使用模式”可以让网页从别的网域要数据。根据 XmlHttpRequest 对象受到同源策略的影响而利用 script元素的这个开放策略网页可以得到从其他来源动态产生的JSON数据而这种使用模式就是所谓的 JSONP。用JSONP抓到的数据并不是JSON而是任意的JavaScript用 JavaScript解释器运行而不是用JSON解析器解析。所有通过Chrome查看所有JSONP发送的Get请求都是js类型而非XHR。  缺点 只能使用Get请求不能注册success、error等事件监听函数不能很容易的确定JSONP请求是否失败JSONP是从其他域中加载代码执行容易受到跨站请求伪造的攻击其安全性无法确保 方式三CORS Cross-Origin Resource SharingCORS跨域资源共享是一份浏览器技术的规范提供了 Web 服务从不同域传来沙盒脚本的方法以避开浏览器的同源策略确保安全的跨域数据传输。现代浏览器使用CORS在API容器如XMLHttpRequest来减少HTTP请求的风险来源。与 JSONP 不同CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求。服务器一般需要增加如下响应头的一种或几种 Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-Type Access-Control-Max-Age: 86400 跨域请求默认不会携带Cookie信息如果需要携带请配置下述参数 Access-Control-Allow-Credentials: true // Ajax设置 withCredentials: true 方式四window.nameiframe window.name通过在iframe一般动态创建i中加载跨域HTML文件来起作用。然后HTML文件将传递给请求者的字符串内容赋值给window.name。然后请求者可以检索window.name值作为响应。 iframe标签的跨域能力window.name属性值在文档刷新后依旧存在的能力且最大允许2M左右。 每个iframe都有包裹它的window而这个window是top window的子窗口。contentWindow属性返回iframe元素的Window对象。你可以使用这个Window对象来访问iframe的文档及其内部DOM。 !-- 下述用端口 10000表示domainA10001表示domainB --!-- localhost:10000 -- scriptvar iframe document.createElement(iframe);iframe.style.display none; // 隐藏var state 0; // 防止页面无限刷新iframe.onload function() {if(state 1) {console.log(JSON.parse(iframe.contentWindow.name));// 清除创建的iframeiframe.contentWindow.document.write();iframe.contentWindow.close();document.body.removeChild(iframe);} else if(state 0) {state 1;// 加载完成指向当前域防止错误(proxy.html为空白页面)// Blocked a frame with origin http://localhost:10000 from accessing a cross-origin frame.iframe.contentWindow.location http://localhost:10000/proxy.html;}};iframe.src http://localhost:10001;document.body.appendChild(iframe); /script!-- localhost:10001 -- !DOCTYPE html ... scriptwindow.name JSON.stringify({a: 1, b: 2}); /script /html 方式五window.postMessage() HTML5新特性可以用来向其他所有的 window 对象发送消息。需要注意的是我们必须要保证所有的脚本执行完才发送 MessageEvent如果在函数执行的过程中调用了它就会让后面的函数超时无法执行。 下述代码实现了跨域存储localStorage !-- 下述用端口 10000表示domainA10001表示domainB --!-- localhost:10000 -- iframe srchttp://localhost:10001/msg.html namemyPostMessage styledisplay:none; /iframescriptfunction main() {LSsetItem(test, Test: new Date());LSgetItem(test, function(value) {console.log(value: value);});LSremoveItem(test);}var callbacks {};window.addEventListener(message, function(event) {if (event.source frames[myPostMessage]) {console.log(event)var data /^#localStorage#(\d)(null)?#([\S\s]*)/.exec(event.data);if (data) {if (callbacks[data[1]]) {callbacks[data[1]](data[2] null ? null : data[3]);}delete callbacks[data[1]];}}}, false);var domain *;// 增加function LSsetItem(key, value) {var obj {setItem: key,value: value};frames[myPostMessage].postMessage(JSON.stringify(obj), domain);}// 获取function LSgetItem(key, callback) {var identifier new Date().getTime();var obj {identifier: identifier,getItem: key};callbacks[identifier] callback;frames[myPostMessage].postMessage(JSON.stringify(obj), domain);}// 删除function LSremoveItem(key) {var obj {removeItem: key};frames[myPostMessage].postMessage(JSON.stringify(obj), domain);} /script!-- localhost:10001 -- scriptwindow.addEventListener(message, function(event) {console.log(Receiver debugging, event);if (event.origin http://localhost:10000) {var data JSON.parse(event.data);if (setItem in data) {localStorage.setItem(data.setItem, data.value);} else if (getItem in data) {var gotItem localStorage.getItem(data.getItem);event.source.postMessage(#localStorage# data.identifier (gotItem null ? null# : # gotItem),event.origin);} else if (removeItem in data) {localStorage.removeItem(data.removeItem);}}}, false); /script 注意Safari一下会报错 Blocked a frame with origin “http://localhost:10001” from accessing a frame with origin “http://localhost:10000“. Protocols, domains, and ports must match. 避免该错误可以在Safari浏览器中勾选开发菜单停用跨域限制。或者只能使用服务器端转存的方式实现因为Safari浏览器默认只支持CORS跨域请求。 方式六修改document.domain跨子域 前提条件这两个域名必须属于同一个基础域名!而且所用的协议端口都要一致否则无法利用document.domain进行跨域所以只能跨子域 在根域范围内允许把domain属性的值设置为它的上一级域。例如在”aaa.xxx.com”域内可以把domain设置为 “xxx.com” 但不能设置为 “xxx.org” 或者”com”。 现在存在两个域名aaa.xxx.com和bbb.xxx.com。在aaa下嵌入bbb的页面由于其document.name不一致无法在aaa下操作bbb的js。可以在aaa和bbb下通过js将document.name  xxx.com;设置一致来达到互相访问的作用。 方式七WebSocket WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信同时允许跨域通讯是server push技术的一种很棒的实现。相关文章请查看WebSocket、WebSocket-SockJS 需要注意WebSocket对象不支持DOM 2级事件侦听器必须使用DOM 0级语法分别定义各个事件。 方式八代理 同源策略是针对浏览器端进行的限制可以通过服务器端来解决该问题 DomainA客户端浏览器 DomainA服务器 DomainB服务器 DomainA客户端浏览器 来源blog.csdn.net/ligang2585116/article/details/73072868 87.说一下 JSONP 实现原理 jsonp 即 jsonpadding动态创建script标签利用script标签的src属性可以获取任何域下的js脚本通过这个特性(也可以说漏洞)服务器端不在返货json格式而是返回一段调用某个函数的js代码在src中进行了调用这样实现了跨域。 九、设计模式 88. 说一下你熟悉的设计模式 参考常用的设计模式汇总超详细 89. 简单工厂和抽象工厂有什么区别 简单工厂模式 这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况这样工厂类才不用经常更改。 它由三种角色组成 工厂类角色这是本模式的核心含有一定的商业逻辑和判断逻辑根据逻辑不同产生具体的工厂产品。如例子中的Driver类。抽象产品角色它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。具体产品角色工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现如例子中的Benz、Bmw类。 来用类图来清晰的表示下的它们之间的关系 抽象工厂模式 先来认识下什么是产品族 位于不同产品等级结构中功能相关联的产品组成的家族。 图中的BmwCar和BenzCar就是两个产品树产品层次结构而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。 可以这么说它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为给客户端提供一个接口可以创建多个产品族中的产品对象。 而且使用抽象工厂模式还要满足一下条件 系统中有多个产品族而系统一次只可能消费其中一族产品同属于同一个产品族的产品以其使用。 来看看抽象工厂模式的各个角色和工厂方法的如出一辙 抽象工厂角色 这是工厂方法模式的核心它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。具体工厂角色它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。抽象产品角色它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。具体产品角色具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 十、Spring / Spring MVC 90. 为什么要使用 spring 1.简介 目的解决企业应用开发的复杂性功能使用基本的JavaBean代替EJB并提供了更多的企业应用功能范围任何Java应用 简单来说Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 2.轻量  从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外Spring是非侵入式的典型地Spring应用中的对象不依赖于Spring的特定类。 3.控制反转   Spring通过一种称作控制反转IoC的技术促进了松耦合。当应用了IoC一个对象依赖的其它对象会通过被动的方式传递进来而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 4.面向切面   Spring提供了面向切面编程的丰富支持允许通过分离应用的业务逻辑与系统级服务例如审计auditing和事务transaction管理进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责甚至是意识其它的系统级关注点例如日志或事务支持。 5.容器 Spring包含并管理应用对象的配置和生命周期在这个意义上它是一种容器你可以配置你的每个bean如何被创建——基于一个可配置原型prototype你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而Spring不应该被混同于传统的重量级的EJB容器它们经常是庞大与笨重的难以使用。 6.框架 Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中应用对象被声明式地组合典型地是在一个XML文件里。Spring也提供了很多基础功能事务管理、持久化框架集成等等将应用逻辑的开发留给了你。 所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。 91. 解释一下什么是 aop AOPAspect-Oriented Programming面向方面编程可以说是OOPObject-Oriented Programing面向对象编程的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候OOP则显得无能为力。也就是说OOP允许你定义从上到下的关系但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切cross-cutting代码在OOP设计中它导致了大量代码的重复而不利于各个模块的重用。 而AOP技术则恰恰相反它利用一种称为“横切”的技术剖解开封装的对象内部并将那些影响了多个类的公共行为封装到一个可重用模块并将其名为“Aspect”即方面。所谓“方面”简单地说就是将那些与业务无关却为业务模块所共同调用的逻辑或责任封装起来便于减少系统的重复代码降低模块间的耦合度并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系如果说“对象”是一个空心的圆柱体其中封装的是对象的属性和行为那么面向方面编程的方法就仿佛一把利刃将这些空心圆柱体剖开以获得其内部的消息。而剖开的切面也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原不留痕迹。 使用“横切”技术AOP把软件系统分为两个部分核心关注点和横切关注点。业务处理的主要流程是核心关注点与之关系不大的部分是横切关注点。横切关注点的一个特点是他们经常发生在核心关注点的多处而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。” 92. 解释一下什么是 ioc IOC是Inversion of Control的缩写多数书籍翻译成“控制反转”。 1996年Michael Mattson在一篇有关探讨面向对象框架的文章中首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想前面我们已经讲了很多了不再赘述简单来说就是把复杂系统分解成相互合作的对象这些对象类通过封装以后内部实现对外部是透明的从而降低了解决问题的复杂度而且可以灵活地被重用和扩展。 IOC理论提出的观点大体是这样的借助于“第三方”实现具有依赖关系的对象之间的解耦。如下图 大家看到了吧由于引进了中间位置的“第三方”也就是IOC容器使得A、B、C、D这4个对象没有了耦合关系齿轮之间的传动全部依靠“第三方”了全部对象的控制权全部上缴给“第三方”IOC容器所以IOC容器成了整个系统的关键核心它起到了一种类似“粘合剂”的作用把系统中的所有对象粘合在一起发挥作用如果没有这个“粘合剂”对象与对象之间会彼此失去联系这就是有人把IOC容器比喻成“粘合剂”的由来。 我们再来做个试验把上图中间的IOC容器拿掉然后再来看看这套系统 我们现在看到的画面就是我们要实现整个系统所需要完成的全部内容。这时候A、B、C、D这4个对象之间已经没有了耦合关系彼此毫无联系这样的话当你在实现A的时候根本无须再去考虑B、C和D了对象之间的依赖关系已经降低到了最低程度。所以如果真能实现IOC容器对于系统开发而言这将是一件多么美好的事情参与开发的每一成员只要实现自己的类就可以了跟别人没有任何关系 我们再来看看控制反转(IOC)到底为什么要起这么个名字我们来对比一下 软件系统在没有引入IOC容器之前如图1所示对象A依赖于对象B那么对象A在初始化或者运行到某一点的时候自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B控制权都在自己手上。 软件系统在引入IOC容器之后这种情形就完全改变了如图3所示由于IOC容器的加入对象A与对象B之间失去了直接联系所以当对象A运行到需要对象B的时候IOC容器会主动创建一个对象B注入到对象A需要的地方。 通过前后的对比我们不难看出来对象A获得依赖对象B的过程,由主动行为变为了被动行为控制权颠倒过来了这就是“控制反转”这个名称的由来。 93. spring 有哪些主要模块 Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP面向切面编程、工具、消息和测试模块。 更多信息howtodoinjava.com/java-spring-framework-tutorials/ 94. spring 常用的注入方式有哪些 Spring通过DI依赖注入实现IOC控制反转常用的注入方式主要有三种 构造方法注入setter注入基于注解的注入 95. spring 中的 bean 是线程安全的吗 Spring容器中的Bean是否线程安全容器本身并没有提供Bean的线程安全策略因此可以说spring容器中的Bean本身不具备线程安全的特性但是具体还是要结合具体scope的Bean去研究。 96. spring 支持几种 bean 的作用域 当通过spring容器创建一个Bean实例时不仅可以完成Bean实例的实例化还可以为Bean指定特定的作用域。Spring支持如下5种作用域 singleton单例模式在整个Spring IoC容器中使用singleton定义的Bean将只有一个实例prototype原型模式每次通过容器的getBean方法获取prototype定义的Bean时都将产生一个新的Bean实例request对于每次HTTP请求使用request定义的Bean都将产生一个新实例即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时该作用域才有效session对于每次HTTP Session使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时该作用域才有效globalsession每个全局的HTTP Session使用session定义的Bean都将产生一个新实例。典型情况下仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时该作用域才有效 其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态负责维护Bean实例的生命周期行为如果一个Bean被设置成prototype作用域程序每次请求该id的BeanSpring都会新建一个Bean实例然后返回给程序。在这种情况下Spring容器仅仅使用new 关键字创建Bean实例一旦创建成功容器不在跟踪实例也不会维护Bean实例的状态。 如果不指定Bean的作用域Spring默认使用singleton作用域。Java在创建Java实例时需要进行内存申请销毁实例时需要完成垃圾回收这些工作都会导致系统开销的增加。因此prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功可以重复使用。因此除非必要否则尽量避免将Bean被设置成prototype作用域。 97. spring 自动装配 bean 有哪些方式 Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系。作为开发人员我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。 spring中bean装配有两种方式 隐式的bean发现机制和自动装配在java代码或者XML中进行显示配置 当然这些方式也可以配合使用。 98. spring 事务实现方式有哪些 编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法这就是编程式事务管理。基于 TransactionProxyFactoryBean 的声明式事务管理基于 Transactional 的声明式事务管理基于 Aspectj AOP 配置事务 99. 说一下 spring 的事务隔离 事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度当多个事务同时访问相同数据时如果没有采取必要的隔离机制就可能发生以下问题 脏读一个事务读到另一个事务未提交的更新数据。幻读例如第一个事务对一个表中的数据进行了修改比如这种修改涉及到表中的“全部数据行”。同时第二个事务也修改这个表中的数据这种修改是向表中插入“一行新数据”。那么以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行就好象发生了幻觉一样。不可重复读比方说在同一个事务中先后执行两条一模一样的select语句期间在此次事务中没有执行过任何DDL语句但先后得到的结果不一致这就是不可重复读。 100. 说一下 spring mvc 运行流程 Spring MVC运行流程图 Spring运行流程描述 1. 用户向服务器发送请求请求被Spring 前端控制Servelt DispatcherServlet捕获 2. DispatcherServlet对请求URL进行解析得到请求资源标识符URI。然后根据该URI调用HandlerMapping获得该Handler配置的所有相关的对象包括Handler对象以及Handler对象对应的拦截器最后以HandlerExecutionChain对象的形式返回 3. DispatcherServlet 根据获得的Handler选择一个合适的HandlerAdapter附注如果成功获得HandlerAdapter后此时将开始执行拦截器的preHandler(...)方法 4.  提取Request中的模型数据填充Handler入参开始执行HandlerController)。 在填充Handler的入参过程中根据你的配置Spring将帮你做一些额外的工作 HttpMessageConveter 将请求消息如Json、xml等数据转换成一个对象将对象转换为指定的响应信息数据转换对请求消息进行数据转换。如String转换成Integer、Double等数据根式化对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等数据验证 验证数据的有效性长度、格式等验证结果存储到BindingResult或Error中 5.  Handler执行完成后向DispatcherServlet 返回一个ModelAndView对象 6.  根据返回的ModelAndView选择一个适合的ViewResolver必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet  7. ViewResolver 结合Model和View来渲染视图 8. 将渲染结果返回给客户端。 101. spring mvc 有哪些组件 Spring MVC的核心组件 DispatcherServlet中央控制器把请求给转发到具体的控制类Controller具体处理请求的控制器HandlerMapping映射处理器负责映射中央处理器转发给controller时的映射策略ModelAndView服务层返回的数据和视图层的封装类ViewResolver视图解析器解析具体的视图Interceptors 拦截器负责拦截我们定义的请求然后做处理工作 102. RequestMapping 的作用是什么 RequestMapping是一个用来处理请求地址映射的注解可用于类或方法上。用于类上表示类中的所有响应请求的方法都是以该地址作为父路径。 RequestMapping注解有六个属性下面我们把她分成三类进行说明。 value method value指定请求的实际地址指定的地址可以是URI Template 模式后面将会说明method指定请求的method类型 GET、POST、PUT、DELETE等 consumesproduces consumes指定处理请求的提交内容类型Content-Type例如application/json, text/htmlproduces指定返回的内容类型仅当request请求头中的(Accept)类型中包含该指定类型才返回 paramsheaders params 指定request中必须包含某些参数值是才让该方法处理。headers指定request中必须包含某些指定的header值才能让该方法处理请求。 103. Autowired 的作用是什么 《Autowired用法详解》
http://www.pierceye.com/news/38939/

相关文章:

  • 家用电脑如何做网站服务器建立网站流程图
  • php网站作业模版网站建设v杏信zhousi69
  • 网站备案需要年检吗网站备案名称更换
  • 网站主页设计布局图企业局域网的规划与设计
  • 培训机构网站如何建设网站开发的数据库设计实体是什么
  • wordpress建站属于前端百度品牌广告
  • 免费搭建自助网站如何做电商网站
  • 哈密市建设局网站设计公司口号
  • 手机网站欢迎页面设计做mla网站
  • django做的电子商务网站阿里云有主体新增网站
  • 山西响应式网站平台非标自动化外包平台
  • phpcms 网站模板房地产行业网站
  • wordpress 获取父页面seo相关ppt
  • 收录文案网站网站难做吗
  • 广西建设职业技术学院图书馆网站传奇做网站
  • 购物展示网站开发的背景品牌策划公司应具备的能力
  • 做印刷厂网站网站建设的用户体验
  • 培训网站建设方案模板下载wordpress文章手机平铺
  • 百度北京公司地址全部seo管理工具
  • 山东省建设监理协会官方网站不收费推广网站有哪些
  • 关键词排名优化网站建设公司信融营销型网站建设
  • 东莞网站建设音乐盒昆明cms模板建站
  • 做文化建设的网站Wordpress 点击跟踪
  • 欢迎回来请牢记网站域名物联网是什么意思
  • 宣传网站建设方案模板下载手机如何制作一个网站
  • 西安网站优化体验手机网站建设渠道
  • 网站运营与推广计划书怎么做wordpress post_type
  • 网站建设需要的设备wordpress 增加菜单
  • 长春网站建设专业公司wordpress文件夹权限设置
  • 德州做网站多少钱wordpress版本怎么升级