经典面试题

1、简述一下JSP的运行原理

答案:JSP的运行原理

(1)WEB容器JSP页面的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。

(2)每个JSP页面在第一次被访问时,JSP引擎先将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

(3)Tomcat 5把为JSP页面创建的Servlet源文件和class类文件放置在“apache-tomcat-5.5.26\work\Catalina\localhost\<应用程序名>\”目录中,Tomcat将JSP页面翻译成的Servlet的包名为org.apache.jsp(即:apache-tomcat-5.5.26\work\Catalina\localhost\org\apache\jsp\文件下)

2、描述一下JSP的执行过程

答案:

JSP的执行过程主要可以分为以下几点:

1)客户端发出请求。

2)Web容器将JSP转译成Servlet源代码。

3)Web容器将产生的源代码进行编译。

4)Web容器加载编译后的代码并执行。

5)把执行结果响应至客户端。

执行JSP网页文件时,需要经过两个时期:转译时期(TranslationTime)和请求时期(RequestTime)。

   转译时期:JSP转译成Servlet类(.class文件)。

   请求时期:Servlet类(.class文件)执行后,响应结果至客户端。

  转译期间主要做了两件事情:

   (1)将JSP网页转译为Servlet源代码(.java),此段称为转译时期(Translation time);

   (2)将Servlet源代码(.java)编译成Servlet类(.class),此阶段称为编译时期(Compilation time)。

其实,JSP就是一个Servlet。

 

3、JSP执行效率比Servlet低吗?

答案:当客户端向一个JSP页面发出请求时,Web Container将JSP转化成Servlet的源代码(只在第一次请求时),然后编译转化后的Servlet并加载到内存中执行,执行的结果Response到客户端。  JSP只在第一次执行的时候会转化为Servlet,以后每次执行Web容器都是直接执行编译后的Servlet,所以JSP和Servlet只是在第一次执行的时候不一样,JSP慢一点,以后的执行都是相同的。

 

4、jsp和servlet有哪些相同点和不同点?

答案:jsp是servlet技术的扩展。本质上是servlet,jsp编译后是servlet。

不同点在于:servlet的应用逻辑是java文件中;

而jsp则是java代码和html组合成jsp文件。

servlet主要用于控制逻辑,而jsp侧重于表示。

 

5、如何在JSP中声明java变量或是定义方法

答案:<%! %>

示例:

<%! int count = 0;%>

<%!

   String[] color = {"red","green","blue"};

   String getColor(int i){

       return color[i];

   }

%>

 

6、如何在JSP中写java代码

答案:<% %>

示例:<%count++;%>

7、如何在JSP中写java表达式

答案:<%=  %>

示例:<%=count%>

 

8、jsp有哪些内置对象?作用分别是什么?

答案:

(1)out对象:是JspWriter类的实例,是向客户端输出内容常用的对象。

(2)request:客户端的请求信息被封装在request对象中,他是HttpServletRequest类的实例。

(3)response:包含了响应客户请求的有关信息,他是HttpServletResponse类的实例。

(4)session:他在第一个jsp页面被装载时自动创建,完成会话期管理,从客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,这样就需要session对象,他是HttpSession类的实例。

(5)application对象实现了用户间数据的共享,可存放全局变量。他是ServletContext类的实例。

(6)page对象就是值当前jsp页面本身,有点像类中的this指针,他是java,lang.Object类的实例。

(7)pageContext对象提供了对JSP页面内所有的对象及名称空间的访问,也就是说他可以访问到本页所在的session,也可以取本页所在的application的某一属性值等等,他相当于页面中所有功能的集大成者,他的本类名也叫pageContext。

(8)exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象,如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译,他实际上是java.lang.Throwable的对象。

(9)config 对象代表当前JSP 配置信息,但JSP 页面通常无须配置,因此也就不存在配置信息。该对象在JSP 页面中非常少用,但在Servlet 则用处相对较大。因为Servlet 需要配置在web.xml 文件中,可以指定配置参数。

 

9、动态include和静态include的区别

答案:

动态INCLUDE 用jsp:include动作实现 <jsp:include page="included.jsp" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。

静态INCLUDE 用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>

 

动态include在使用的时候,会先解析所要包含的页面,解析后再和主页面放到一起显示;

静态include在使用的时候,不会解析所要包含的页面,也就是说,不管你的included.htm中有什么,我的任务就是把你包含并显示,其他的一概不管。

 

jsp:include是先编译一下included.jsp文件,然后再包含——先编译,后包含

@ include是先把文件包含就来,然后统一编译——先包含,后编译

 

10、动态包含的优点和不足

答案:

优点:

1:引入和同步一个动态的页面,使jsp页面更具灵活性

2:能和不同页面之间进行信息的交互和快捷的实现方式。

3:改变了原始的所有页面编码都放在一个jsp上,使不同的功能分别写在不同页里,通过动态include方式引用到页面,更易于编码,更易于管理。

 

不足:

动态的引入时需要频繁的变化和页面信息的更新和交互,要占用大量的资源开销。降低页面的访问速度。如果在没必要动态引入的情况下,不要使用动态include

11、forward,与redirect 的区别?有哪些方式实现

答案:

forward把另一个页面加载到本页面,不改变浏览器的路径;

redirect是跳转到另一个页面,会改变浏览器的路径

重定向:response.sendRedirect("重定向的路径")

转发:request.getRequestDispatcher("转发路径").forward(request, response);

 

12、servlet的生命周期

答案:Servlet 加载--->实例化--->服务--->销毁

web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

 

13、编写servlet需要继承什么类?

答案:HttpServlet

14、简述一下如何配置servlet

答案:

Servlet的配置包括两部分:

1、<servlet>配置Servlet的名字和完整类路径:

servlet-name是自定义的,就是给Servlet取个名字。

servlet-class是Servlet完整的类,就是从一开始的包一直“.”到该Servlet。

2、<servlet-mapping>是用来截获请求的,包括servlet-name和url-pattern。

servlet-name跟<servlet>中的servlet-name是对应的,两个servlet-name一定要一致,否则会找不到对应的Servlet。

url-pattern是截获请求的规则,当表单提交的时候,会根据特定的规则调用相应的Servlet。

15、什么情况下调用 doGet() 和 doPost() ?

答案:Jsp 页面中的 form 标签里的 method 属性为 get 时调用 doGet() ,为 post 时调用 doPost() 。

16、Request 对象的主要方法

答案:

setAttribute(String name,Object) :设置名字为 name 的 request 的参数值
getAttribute(String name) :返回由 name 指定的属性值
getAttributeNames() :返回 request 对象所有属性的名字集合,结果是一个枚举的实例
getCookies() :返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组
getCharacterEncoding() :返回请求中的字符编码方式
getContentLength() :返回请求的 Body 的长度
getHeader(String name) :获得 HTTP 协议定义的文件头信息
getHeaders(String name) :返回指定名字的 request Header 的所有值,结果是一个枚举的实例
getHeaderNames() :返回所以 request Header 的名字,结果是一个枚举的实例
getInputStream() :返回请求的输入流,用于获得请求中的数据
getMethod() :获得客户端向服务器端传送数据的方法
getParameter(String name) :获得客户端传送给服务器端的有 name 指定的参数值
getParameterNames() :获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParameterValues(String name) :获得有 name 指定的参数的所有值
getProtocol() :获取客户端向服务器端传送数据所依据的协议名称
getQueryString() :获得查询字符串
getRequestURI() :获取发出请求字符串的客户端地址
getRemoteAddr() :获取客户端的 IP 地址
getRemoteHost() :获取客户端的名字
getSession([Boolean create]) :返回和请求相关 Session
getServerName() :获取服务器的名字
getServletPath() :获取客户端所请求的脚本文件的路径
getServerPort() :获取服务器的端口号
removeAttribute(String name) :删除请求中的一个属性

 

 

17、请描述Session与Cookie的异同之处

答案:

1.Cookie是把用户的数据写给用户的浏览器,保存在浏览器中。Session是把用户的数据写到用户独占的session中,保存在服务器端。

2.一个Cookie对象代表一个cookie,只能表示一个name和value,cookie中保存的是字符串。Session类似于一个服务器端的一个基于HashMap的缓存。可以放入多个具有key,value的键值对的属性。value可以是任意的对象。

3.同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。

4.session是以cookie为基础的, 服务器需要通过客户端传来的一个名为JSESSIONID的cookie 来找到它对应的session。

 

18、怎么样创建过滤器

答案:

1.生成一个普通的class类,实现Filter接口(javax.servlet.Filter;)。

2.重写接口里面的三个方法:init,doFilter,destroy。

3.然后在web.xml配置过滤器。

19、简述一下过滤器的作用

答案:

过滤器用来实现通用的功能,减少冗余代码,提高可维护性。

例如:

   任何系统或网站都要判断用户是否登录。

   统一解决编码问题。

20、Java的基本数据类型有哪些?对应的包装器类是什么?有什么区别?

答案:

byte、short、int、long、char、double、float、boolean

Byte、Short、Integer、Long、Character、Double、Float、Boolean

基本数据类型只包含了数据,包装器类包含了数据和操作,比如类型转换操作。

如果说最直观的使用上的区别:基本数据类型不能为null,而包装器类可以为null。

另外当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这时就需要这些基本类型的包装器类了。

21、&和&&的区别?

答案:

&表示位运算符。

java中的位运算符,是针对二进制的位进行运算的,其中有与(&)、非(~)、或(|)、异或(^)。与就是两个都是1结果就是1,非就是1变成0,0变成1;或就是两个只要有一个是1那就是1;异或就是相同为0不同为1。

&:与,对每一个都判断

&&:短路与,只要前面是false就输出false,而不继续判断后面了

22、面向对象的特征有哪些方面

答案:

- 封装:通常认为封装是把数据和操作数据的方法绑定起来。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。

- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。

- 多态性:(可以把子类看成是特殊的父类的对象)

只能对一个引用调用其引用类型中声明的方法

运行时,根据对象类型调用子类覆盖之后的方法

对象类型永远不变:一个对象可能放在不同类型的引用中,但是对象自身的类型从来也不会发生改变。

23、一个抽象类是否可以没有抽象方法

答案:可以。抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类。

24、接口和抽象类的区别是什么?

答案:

抽象类有构造方法,接口没有。

抽象类对属性没有要求,接口的属性都是public static final。

抽象类可以有0到多个抽象方法

接口中所有的方法都是public abstract。而抽象类则可以同时包含抽象和非抽象的方法。

25、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

答案:

方法的重载:体现在一个类中,方法名相同,参数不同(数量不同,类型不同,顺序不同),与返回值无关。

方法的重写:体现在子类继承父类,子类可以从父类中继承到父类的属性和方法,子类可以有自己的特殊实现,就可以通过方法的重写。同名、同参、同返回值。子类覆盖的方法的访问权限不能小于父类的访问权限。子类覆盖的方法不能抛出比父类更多的异常。

重载(Overloading)

(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。

(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。

(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

重写(Overriding)

(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

(3)子类函数的访问修饰权限不能少于父类的;

26、error和exception有什么区别?

答案:

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

27、TRY{}里有一个RETURN语句,那么紧跟在这个TRY后的FINALLY {}里的CODE会不会被执行,什么时候被执行,在RETURN前还是后?

答案:

会执行,在return前执行。

28、String是基本数据类型吗?

答案:不是

 

29、String 和StringBuffer的区别

答案:String是不可修改的,StringBuffer是可以修改的。

30、Collection和Collections的区别

答案:

Collection是集合类的上级接口,继承于他的接口主要有Set 和List。

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

说明:

31、List, Set, Map是否继承自Collection接口?

答案:List、Set是, Map不是 。

32、HashMap和Hashtable的区别

答案:

Hashtable继承自陈旧的Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现;

HashMap允许将null作为entry的key或者value,而Hashtable不允许;

HashMap是非线程安全,Hashtable是线程安全的。

33、List、Map、Set三个接口,存取元素时,各有什么特点?

答案:

List是有序的;

Set是无序的、不重复的;

Map是以键值对的形式存储元素的。

34、说出ArrayList,Vector, LinkedList的区别

答案:

ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

35、返回值为void的方法,可否有return?

答案:可以。但return后没有任何值。

示例:

public static void main(String[] args){

    testReturn();

    System.out.println("--------");

}

public static void testReturn(){

    System.out.println("void");

    return;

}

36、写出一种单例模式

答案:

懒汉式:

public class Singleton { 

    private static Singleton instance; 

    private Singleton (){} 

 

    public static Singleton getInstance() { 

    if (instance == null) { 

        instance = new Singleton(); 

    } 

    return instance; 

    } 

饿汉式:

public class Singleton { 

    private static Singleton instance = new Singleton(); 

    private Singleton (){} 

    public static Singleton getInstance() { 

        return instance; 

    } 

37、类有几种访问权限?变量和方法有几种访问权限?分别是什么?

答案:

类有两种访问权限:public,默认的default。

方法和变量的访问权限:public,protected,default,private。

38、由大到小说出访问权限修饰符

答案:

a)  public:公有的,任何类都可以访问。

b)  protected:受保护的,同一个包的类可以访问。不同包的子类可以访问。

c)  default:默认的,同一个包的类可以访问。

d)  private:私有的,在同一个类中才能访问。

39、final, finally, finalize的区别

答案:

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

40、启动一个线程是用run()还是start()?

答案:启动一个线程是调用start()方法。

41、sleep() 和 wait() 有什么区别?

答案:

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

42、描述一下类和对象的关系

答案:类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。 类和对象好比图纸和实物的关系,模具和铸件的关系。

43、super与this的区别

答案:this表示当前类的对象,super表示父类对象。

44、静态变量和实例变量的区别?

答案:

静态变量也称作类变量,由static修饰,如:static int s; s就是静态变量,它能通过类来访问。

实例变量没有static修饰符,它只能通过实例对象来访问。

同一类的不同的实例对象有自己的实例变量,但是它们共享同一个静态变量。当一个实例对象修改了它的实例变量时,不会影响其他的实例对象。如果一个实例对象修改了静态变量,则会影响其他的对象实例。

在java中类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。

而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。

 

45、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

答案:

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。

同步的实现方式有两种。synchronized和wait/notify

46、什么是死锁(deadlock)?

答案:两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。

47、集合框架中的泛型有什么优点?

答案:泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。

48、Tomcat的底层运行原理

答案:对于一个web容器而言,简而言之,它是系统的一个守护进程,守护着对这台服务器某个端口发起的请求,基于这一点,它就需要一个监听程序,这个监听程序来获取来自这个端口的特定请求的数据,直接点讲,我们这里使用Socket来获取某个端口,通常是80端口的http请求。

 

  1. TCP和UDP的区别

答案:TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。

UDP(User Data Protocol,用户数据报协议)是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

 

50、Tomcat的目录

答案:

tomcat
  |---bin:存放启动和关闭tomcat脚本

  |---conf:存放不同的配置文件(server.xml和web.xml);
  |---doc:存放Tomcat文档;
  |---lib/japser/common:存放Tomcat运行需要的库文件(JARS);
  |---logs:存放Tomcat执行时的LOG文件;
  |---src:存放Tomcat的源代码;
  |---webapps:Tomcat的主要Web发布目录(包括应用程序示例);
  |---work:存放jsp编译后产生的class文件;

 

51、什么是AJAX,为什么要使用Ajax

答案:Ajax,全称是asychronous javascript and xml,可以说是已有技术的组合,主要用来实现客户端与服务器端的异步通信效果,实现页面的局部刷新。

Ajax应用程序的优势在于:
1. 通过异步模式,提升了用户体验
2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

 

52、进程和线程的区别是什么?

答案:进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

53、概括的解释下线程的几种状态

答案:

线程在执行过程中,可以处于下面几种状态:

就绪(Runnable):线程准备运行,不一定立马就能开始执行。

运行中(Running):进程正在执行线程的代码。

等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

睡眠中(Sleeping):线程被强制睡眠。

I/O阻塞(Blocked on I/O):等待I/O操作完成。

同步阻塞(Blocked on Synchronization):等待获取锁。

死亡(Dead):线程完成了执行。

54、String类能被继承吗?为什么?

答案:不能被继承,因为String类被final修饰

55、说出数据连接池的工作机制是什么?

答案:建立数据库连接是相当耗时和耗费资源的,而且一个数据库服务器能够同时建立的连接数也是有限的,在大型的Web应用中,可能同时会有成百上千个访问数据库的请求,如果Web应用程序为每一个客户请求分配一个数据库连接,将导致性能的急剧下降。为了能够重复利用数据库连接,提高对请求的响应时间和服务器的性能,可以采用连接池技术。连接池技术预先建立多个数据库连接对象,然后将连接对象保存到连接池中,当客户请求到来时,从池中取出一个连接对象为客户服务,当请求完成后,客户程序调用close()方法,将连接对象放回池中。

这样的话就可以提高"效率"。

56、什么叫SQL注入,如何防止SQL注入?

答案:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

 

防护方法归纳一下,主要有以下几点:

 

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

57、在数据库中条件查询速度很慢的时候,如何优化?

答案:查询的时候不要用select * ,而是你用哪些字段就select哪些字段;

建立正确的索引 (效率最高);

减少表之间的关联;

where条件, 把能过滤掉最多数据的条件放在最前面。 

58、Struts2的工作流程

答案:

1:客户端在浏览器中输入一个url地址;

2:这个url请求通过http协议发送给tomcat;

3:tomcat根据url找到对应项目里面的web.xml文件;

4:在web.xml里面会发现有struts2的配置;

5:然后会找到struts2对应的struts.xml配置文件;

6:根据url解析struts.xml配置文件就会找到对应的class;

7:调用完class返回一个结果result,根据struts.xml返回到对应的jsp;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值