javaweb与前端基础面试题
- javaweb
- 1.Servlet的生命周期
- 2.Cookie 和 Session 的区别
- 3.http 常见的状态码有哪些?
- 4.token是什么
- html
- css
- 1.HTML中嵌入CSS的三种方式?常用的CSS选择器有哪些?选择器优先级?
- javascript
- 1.HTML中嵌入javascript的三种方式
- 2.javascript中创建方法和定义类的方法有哪些?
- 3.javascript中的\==和\===有什么区别?null,undefined,NaN有什么区别?
- 4.跳转页面的多种方式
- 5.什么是跨域?跨域的流程是什么?如何解决跨域?
- 6.javascript中if(xx)的判断
- jquery
- 1.用jquery如何发送ajax请求
javaweb
1.Servlet的生命周期
第一次:
判断Servlet实例是否存在?
> 装载Servlet类并创建实例
> 调用init(ServletConfig)方法
> 调用service(ServletRequest,ServletResponse)方法
> 调用对应的doGet doPost方法
服务器关闭?
>调用destroy()方法。
第二次:
判断Servlet实例是否存在?
> 调用service(ServletRequest,ServletResponse)方法
2.Cookie 和 Session 的区别
cookie和session都是会话跟踪技术
cookie保存在客户端,session保存在服务端
cookie不是很安全,一般用户验证的场合都用session
session运行时要依赖session id, session id又存放在cookie中,所以浏览器禁用了cookie,session就失效了。但是可以通过在url中传递session_id
3.http 常见的状态码有哪些?
200 OK 请求成功
301 Moved Permanently永久重定向(搬到新房,老房卖了)
302 See Other临时重定向(暂时去亲戚家住两天)
400 Bad Request:请求中存在语法错误,或者请求参数有误
403 Forbidden 服务器拒绝该次访问
404 Not Found 无法找到请求的资源
405 Method Not Allowed 请求方法不支持
500 Inter Server Error: 表示服务器在执行请求时发生了错误
503 Server Unavailable 表示服务器处于超负载或者维护状态,无法处理请求
4.token是什么
Token是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位。
1.如果这个Token在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。
所以从安全角度来看我们需要给Token设置有效期。有效期设置要根据系统安全需要应尽可能的短,也不能短得离谱
2.新的问题产生,如果用户正常操作的过程中,Token过期失效了,要求用户重新登录。。用户体验就会很差。
为了解决在操作过程中不能让用户感到Token失效问题,有一种方式是把服务端保存Token状态,用户每次操作自动刷新Token的过期时间。Session 就是采用这种策略来保持用户登录状态的。然而仍然存在这样一个问题,在前后端分离、单页 App 这些情况下,每秒种可能发起很多次请求,每次都去刷新过期时间会产生非常大的代价。如果 Token 的过期时间被持久化到数据库或文件,代价就更大了。所以通常为了提升效率,减少消耗,会把 Token 的过期时间保存在缓存或者内存中。
html
css
1.HTML中嵌入CSS的三种方式?常用的CSS选择器有哪些?选择器优先级?
三种方式:
(1)内联定义方式:在标签内部使用style属性来设置元素CSS的样式
<标签 style="样式名:样式值;样式名:样式值;样式名:样式值;..."></标签>
(2)样式块:在head标签中使用style块,这种方式称为样式块方式
(3)链入外部样式表文件:将样式写到一个独立的XX.css文件中,在需要的网页中直接引入css文件即可
<head>
<link type="text/css" rel="stylesheet" href="css文件的路径" />
</head>
选择器:
标签选择器:
标签名 {
样式名 : 样式值;
样式名 : 样式值;
样式名 : 样式值;
....
}
类选择器:
.类名{
样式名 : 样式值;
样式名 : 样式值;
样式名 : 样式值;
....
}
id选择器:
#id{
样式名 : 样式值;
样式名 : 样式值;
样式名 : 样式值;
....
}
优先级:id选择器>类选择器>标签选择器
javascript
1.HTML中嵌入javascript的三种方式
(1)在句柄后插入javascript语句块
<input type="button" value="登陆" onclick="window.alert('hello')">
(2)页面script标签嵌入
<script type="text/javascript">
alert("hello world")
</script>
(3)外部导入js文件
<script type="text/javascript" src="js-dom/001.js"></script>
2.javascript中创建方法和定义类的方法有哪些?
在javascript中,创建方法和定义类的语法是一样的
第一种方式:
function 【方法名|类名】(形参){
}
第二种方式:
【方法名|类名】 = function(形参){
}
区别是一般定义类中要用this关键字添加属性和方法
而且把定义的变量是当方法使用还是当类看待取决于调用的方法
3.javascript中的==和===有什么区别?null,undefined,NaN有什么区别?
(1)==和===的区别
==是等同运算符,只判断值是否相等
===是全等运算符,既判断值是否相等,还要判断数据类型是否相等
(2)null,undefinded,NaN的区别
三者的数据类型不一致
undefinded属于Undefinded类型,
NaN属于Number类型,
null属于Null类型,
但是null的typeof运算符的执行结果是object,这点比较特殊
三者比较的话,因为NaN不属于空,只是不是一个数值,所以不等同于undefinded,null; 而undefinded和null是等同的
undefined==null //true
undefinded===null //false
4.跳转页面的多种方式
跳转页面可以通过多种方式:(这些都是发送请求!!!!)
- 第一种方式:直接在浏览器地址栏上写URL。(重点)
- 第二种方式:可以点击超链接(重点)
- 第三种方式:提交表单(重点)
- 第四种方式:window.open(url,target) (了解)
- 第五种方式:js代码(重点)
window.location.href
window.location
document.location.href
document.location
通过浏览器向服务器发送请求,通常是以上的五种方式。
5.什么是跨域?跨域的流程是什么?如何解决跨域?
跨域指的是当前网站不能执行其它网站的脚本,是浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
协议,域名和端口号有一个不同就会产生跨域。
过程:首先浏览器会向服务器发送一个预检请求,服务器响应允许跨域后,浏览器才会发送真实的请求给服务器,服务器再返回响应。
解决方案:
第一种是创建过滤器和拦截器拦截请求,给请求设置允许跨域的响应头,请求方法,域名,跨域请求是否允许携带cookie以及cookie的持久化等等。
如果是SpringBoot开发的话添加拦截器更方便一些。直接创建WebMvcConfigurer的实现类,重写addCorsMapping方法,设置允许跨域的信息。
如果只是方法级别细粒度的跨域控制,只需要给处理器方法上添加@CrossOrigin注解就行了。
第二种:跨域的根本原因是发送的网站跟目标网站不在同一个域造成的,所以我们可以使用nginx的反向代理让他们转化为同一个域即可。
具体步骤是:
(1)将前端项目部署到nginx中,这样访问前端项目就不要去访问前端项目地址了,直接去访问nginx的地址。
(2)只要是调用后台接口的请求,都加一个api后缀,代理给后台服务器
(3)这样访问前端和调用后端接口都是访问的nginx的地址,就不会产生跨域问题了。
跨域指的是当前网站不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
同源策略:是指协议,域名,端口都要相同,其他一个不同都会产生跨域;
js使用xmlHttpRequest对象发送ajax请求时,这个对象想要从本网站到其它网站发送请求默认是不允许的,是用同源策略来限制
跨域的流程:浏览器发送非简单请求时需要先发送预检请求,服务器要响应允许跨域后,再发送真实的请求获取数据。
简单请求不会触发CORS预检请求,当请求方式是GET,POST,HEAD之一,Content-Type的值仅限于下列三者之一:text/plain,multipart/form-data,application/x-www-form-urlencoded
解决方式三种:
1.给容器中注册网关的过滤器,将所有发送给网关的请求添加允许跨域的响应头。
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsWebFilter(){
CorsConfiguration cors = new CorsConfiguration();
cors.addAllowedHeader("*");
cors.addAllowedMethod("*");
cors.addAllowedOrigin("*");
cors.setAllowCredentials(true);
cors.setMaxAge(360000L);
UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**",cors);
return new CorsWebFilter(source);
}
}
2.这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
@Configuration
public class MyWebConfigurer implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("*") //支持所有请求方法跨域
.allowedHeaders("*") //支持所有请求头跨域
.allowCredentials(true) //跨域请求可以包含cookie
.allowedOriginPatterns("*")//允许任何域名使用,低版本Springboot用allowedOrigins()方法
.maxAge(3600 * 24);
}
}
3.跨域的根本原因是发送的网站跟目标网站不在同一个域。nginx的反向代理可以让他们转化为同一个域,从而解决跨域问题。
6.javascript中if(xx)的判断
(1)当if括号里的表达式为Boolean时,直接判断
(2)当if括号里的表达式为Number时,分两种情况0或NaN为false,其它为true
(3)当if括号里面的表达式为String时,空字符串为false,其他为true;
(4)当if括号里的表达式为undefined时,为false
(5)当if括号里的表达式为null时,为false
jquery
1.用jquery如何发送ajax请求
$.ajax()是jquery发送ajax请求的核心用法。参数有
url: 规定发送请求的URL
data:规定要发送到服务器的数据,可以是数组,字符串,多数是json
success(result,status,xhr): 请求成功时运行的函数,其中result,status,xhr是自定义的形参名
dataType: 期望从服务器响应的数据类型。JQuery从xml,json,text,html测试最可能的类型。一般都写json.如果服务端的response.setContentType=“application/json;charset=utf-8”
,这个地方是可以省略的。
type: 请求方式,默认是get
--------下面3个属性一般不用设置---------
contentType: 发送到服务器时参数的数据类型。默认是"application/x-www-form-urlencoded",这里容器出错,如果设置成application/json,服务端接收不到数据。所以就不要设置,用默认的就好。
async: 布尔值,表示请求是否异步处理。默认是true
error(xhr,status,error): 请求失败时运行的函数,其中xhr,status,error是自定义的形参名
额外发送ajax请求的方法
$.post(url,data,function(data,status,xhr),dataType)
$.get(url,data,function(data,status,xhr),dataType)
是用POST或者GET请求从服务器加载数据,内部还是使用了$.ajax()方法。这两个方法的参数顺序不能颠倒。