1、jsp 9大内置对象
request
:封装客户端的请求,其中包含来自GET或POST请求的参数;
response
:封装服务器对客户端的响应;
pageContext
:通过该对象可以获取其他对象;
session
:封装用户会话的对象;
application
:封装服务器运行环境的对象;
out
:输出服务器响应的输出流对象;
config
:Web应用的配置对象;
page
:JSP页面本身(相当于Java程序中的this);
exception
:封装页面抛出异常的对象。
2、jsp的4种作用域
page
代表与一个页面相关的对象和属性。
request
代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
session
代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
application
代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
3、forward 和 redirect 的区别?
Redirect
:重定向,服务器告诉浏览器请求的URI,由浏览器再次向新的地址发起请求
Forward
:转发,由服务器内部执行跳转,共享request数据,并将执行结果告诉浏览器,浏览器并没有感知到地址发生变化。
4、SimpleDataFormat是线程安全的吗?如何更好的使用而避免风险?
simpleDateFormat不是线程安全的。参考下面线程安全的方法:
// 1. 在方法内部使用,没有线程安全问题
private static final String FORMAT = "yyyy-MM-dd HH:mm:ss";
public String getFormat(Date date){
SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT);
return dateFormat.format(date);
}
// 2. 每次使用的时候加锁
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void getFormat(){
synchronized (SIMPLE_DATE_FORMAT){
SIMPLE_DATE_FORMAT.format(new Date());
….;
}
// 3. 使用ThreadLocal,每个线程都有自己的SimpleDateFormat对象,互不干扰
private static final ThreadLocal<DateFormat> DATE_FORMATTER = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
// 4. 使用DateTimeFormatter(This class is immutable and thread-safe.)
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(timeFormatter.format(LocalDateTime.now()));
5、有哪些设计模式?
工厂模式:Spring通过工厂模式创建bean
代理模式:Spring AOP通过动态代理增强原对象的功能
责任链模式:SpringMVC的过滤器
单例模式:spring构建的对象默认是单例
6、写个单例模式的代码?
public class SingletonClass {
private static final SingletonClass instance = new SingletonClass();
public static SingletonClass getInstance() {
return instance;
}
private SingletonClass() {
}
}
7、多线程如何避免死锁?
-
加锁顺序(线程按照一定的顺序加锁)
-
加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
-
死锁检测(jstack -l jvm_pid)
8、什么是XSS攻击,具体如何实现?
-
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
-
对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。
-
对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
-
将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。
-
不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。
-
后端接口也应该要做到关键字符过滤的问题。
9、集群环境中,session如何实现共享?
-
持久化session到数据库,即使用数据库来储存session。
-
使用redis共享session。
-
使用memcache同步session。
-
通过脚本或守护进程在多台服务器之间同步session。
-
使用NFS共享session。
-
nginx负载均衡策略。
-
Tomcat集群+redis实现session同步共享。
10、Java对象的生命周期
-
创建阶段(Created)
-
应用阶段(In Use)
-
不可见阶段(Invisible)
-
不可达阶段(Unreachable)
-
收集阶段(Collected)
-
终结阶段(Finalized)
-
对象空间重分配阶段(De-allocated)
11、如何调优JVM
-client -server模式
-Xmn、-Xms、-Xmx
监控:jps、jstat、jinfo、jmap、jhat、jstack…