2021最新面试题-web篇
1、http和https有什么区别?
答:http是超文本传输协议,默认端口是80。https是安全的默认端口是443;http是明文传输,存在安全隐患,Https在Http的基础上增加了SSL/TLS协议,需要依靠整数来验证服务器身份,并且对服务器与客户端之间的传输进行通信加密。https协议需要到ca申请证书,一般免费证书很少,需要交费。Http不需要
2、get和post有什么区别?
答:
一、功能不同
1、get是从服务器上获取数据。
2、post是向服务器传送数据。
二、安全性不同
1、get安全性非常低。
2、post安全性较高。
三、参数传递方式不同
1、get传递的参数在请求链接中
2、post可以将参数添加到请求正文中
四、传递信息大小不同
1、get传输信息不大于2k
2、post传输的信息一般不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
3、foward和redirect有什么区别?
foward是请求转发,服务端跳转,可以携带参数
redirect是重定向,客户端跳转,不可以携带参数
4、什么是servlet?
答:Servlet是用Java编写的服务器端程序, 其主要功能在于交互式地浏览和修改数据,生成动态Web内容.
5、描述一下servlet的生命周期
答:
init()初始化.
service() 处理客户端的请求, 具体业务逻辑. ServletRequest 对象用于获得客户端信息,ServletResponse 对象用于向客户端返回信息(客户端可以理解为浏览器)
destroy() 结束时调用. 这个方法只有在servlet的service方法内的所有线程都退出的时候,或在超时的时候才会被调用。
init() 和 destroy() 都只会在Servlet创建和销毁时调用一次, 而service() 则会在响应不同请求时多次调用.
6、Servlet是单例还是多例?支持异步处理吗?
答:servlet是单例的,严格地说在web.xml中配置的一个ServletMapping对应一个单例实例(如果一个Servlet被映射了两个URL地址,会生成两个实例)。例如同时并发2000次请求一个Servlet,如果不是单例的,内存瞬间要创建2000个对象,同时为了线程安全还得阻塞对方线程,其性能非常之差。为了保护Servlet的线程安全通常是使用同步块(或方法)来保护共享数据,其次可以volatile、Lock一些锁机制,还可以使用ThreadLocal来打通安全通道,另外还有原子操作也是用来保护数据安全,有非常多的选择。
Servlet 3.0 可以对异步处理支持,如下实例:
1 // asyncSupported 默认为false, 2 @WebServlet(value = "/demo",asyncSupported = true) 3 public class DemoServlet extends HttpServlet { 4 5 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 6 response.setContentType("text/html;charset=UTF-8"); 7 PrintWriter out = response.getWriter(); 8 out.println("进入Servlet的时间:" + new Date() + "<br>"); 9 10 //在子线程中执行业务调用,并由其负责输出响应,主线程退出 11 AsyncContext ctx = request.startAsync(); 12 new Thread(new DemoThread(ctx)).start(); 13 out.println("结束Servlet的时间:" + new Date() + "<br>"); 14 } 15 }
7、Servlet和JSP有什么区别和联系?
答:jsp 本质上就是一个 Servlet,它是 Servlet 的一种特殊形式,每个 jsp 页面都是一个 servlet实例。
Servlet 是由 Java 提供用于开发 web 服务器应用程序的一个组件,运行在服务端,由 servlet 容器管理,用来生成动态内容。一个 servlet 实例是实现了特殊接口 Servlet 的 Java 类,所有自定义的 servlet 均必须实现 Servlet 接口。
区别:
-
jsp 是 html 页面中内嵌的 Java 代码,侧重页面显示;
-
Servlet 是 html 代码和 Java 代码分离,侧重逻辑控制,mvc 设计思想中 jsp 位于视图层,servlet 位于控制层
8、JSP有哪些常用内置对象?
答:JSP中一共预先定义了9个这样的对象,分别为request、response、session、application、out、pageContext、config、page和exception。
9、 JSP有哪几种作用域?
答:一共4种,按照作用域从小到大顺序如下:pageContext----request----session----application。
(1)pageContext:页面域
页面作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。
(2)request:请求域
请求作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。
(3)session:会话域
会话作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。
(4)application: 应用域
应用作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。
10、Cookie和Session有什么区别?
答:
(1)、cookie数据存放在客户的浏览器上,session数据放在服务器上 ;
(2)、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session ;
(3)、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE ;
11、什么是跨域,有哪些解决方案?
答:跨域问题来源于浏览器的同源策略,浏览器为了提高网站的安全性,在发送ajax请求时,只有在当前页面地址与请求地址的协议+域名+端口号相同时才允许访问,否则会被拦截。也就是说协议、域名、端口其中任意一个不同都存在浏览器跨域问题。
解决方案
- CORS(跨域资源共享)cors的原理是在服务器端设置http响应头,允许浏览器进行跨域请求【后端跨域】
- jsonp,jsonp的原理是浏览器在引入javascript不受跨域限制,我们使用script标签来请求数据【前端跨域】
java的解决方案
方法一:注解
在Spring Boot 中给我们提供了一个注解 @CrossOrigin 来实现跨域
方法二:实现 WebMvcConfigurer
这里可以通过实现 WebMvcConfigurer 接口中的 addCorsMappings() 方法来实现跨域。
@Configuration public class WebConfig implements WebMvcConfigurer { / * 跨域支持 * @param registry */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "DELETE", "PUT") .allowedHeaders(*) .maxAge(3600 * 24); } }
api介绍:
addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:“http://www.baidu.com”,只有百度可以访问我们的跨域资源。
allowCredentials: 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以
allowedMethods:允许输入参数的请求方法访问该跨域资源服务器,如:POST、GET、PUT、OPTIONS、DELETE等。
allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:“X-YAUTH-TOKEN”
maxAge:配置客户端缓存预检请求的响应的时间(以秒为单位)。默认设置为1800秒(30分钟)。
方法三:Nginx 配置解决跨域问题
如果我们在项目中使用了Nginx,可以在Nginx中添加以下的配置来解决跨域
location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; if ($request_method = 'OPTIONS') { return 204; } }
方法四:通过fileter中写入ACCESS-Control-Allow的头信息,进行跨域访问
public class CrossDomainFilter implements Filter{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { //设置跨域请求 HttpServletResponse response = (HttpServletResponse) res; //此处ip地址为需要访问服务器的ip及端口号 response.setHeader("Access-Control-Allow-Origin", "http://192.168.1.1:8080"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH"); response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type,Token,Accept, Connection, User-Agent, Cookie"); response.setHeader("Access-Control-Max-Age", "3628800"); System.out.println("设置跨域请求"); chain.doFilter(req, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } }
其中
"Access-Control-Allow-Origin"表示的是访问服务端的ip地址及端口号,也可以设置为*表示所有域都可以通过;
"Access-Control-Allow-Credentials"表示的是跨域的ajax中可以携带cookie,此时第一项设置不能为*,需指定域名;
"Access-Control-Allow-Methods"表示的是允许跨域的请求方法;
"Access-Control-Allow-Headers"表示的是允许跨域请求包含content-type头;
"Access-Control-Allow-Max-Age"表示的是在3628800秒内,不需要再发送预检验请求,可以缓存该结果,一般默认。
写完filter别忘记配置web.xml,其代码如下:
<!-- 跨域设置 --> <filter> <filter-name>crossFilter</filter-name> <filter-class>com.chinamobile.bcop.console.security.filter.CrossDomainFilter</filter-class> </filter> <filter-mapping> <filter-name>crossFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>