1.如何解决跨域问题
跨域问题其实是因为浏览器的安全策略同源策略的限制,当url的协议、域名或者端口号不一致时,就会出现跨域问题。之所以要使用同源策略,是为了防止其它ducument或者脚本对当前document的属性读取或进行修改。
可以通过下面方法解决跨域问题:
跨域资源共享:服务端设置 Access-Control-Allow-Origin(spring使用使用@CrossOrigin注解即可实现)
微服务中使用gateway网关进行配置解决跨域问题
使用nginx代理:如果使用nginx实现反向代理,只需要修改其配置文件,使其支持所有浏览器,支持session
2.Cookie和Session的区别
相同:二者都是用来跟踪浏览器用户身份的会话方式
不同:
(1),存储位置与工作原理不同
cookie存储在浏览器中,其工作原理是,浏览器第一次发送请求到服务端时,服务端会创建cookie,并将cookie返回给浏览器。当浏览器再次访问服务器时,会携带服务端创建的cookie,服务器根据浏览器传输的数据判断浏览器的数据区分不同的用户
Session存储在服务器中,session的工作原理:当浏览器第一次访问服务器时,服务器会创建一个session,并且创建一个特殊的cookie(name为”jsessionid”,value为session的ID),当之后浏览器再向服务器发送请求时,就会携带这个特殊的cookie,浏览器根据这个cookie里的sessionID查询到对应的session,从而区分不同的用户。如果不存在这个特殊cookie(说明浏览器被关闭或异常退出或者更换了浏览器),将会重新创建一个存储sessionID的特殊cookie返回给浏览器。如果sessionid对应的session对象无法被找到(说明session对象超过了存活时间(默认为30分钟)),也会重新创建特殊cookie。如果存在,就返回这个session对象。
(2),生命周期不同
session是一次会话,用来记录当前用户是否登陆或者具有某种特殊的权限,由于他存储在服务端,因此你无法伪造。
cookie是浏览器缓存的变量,只要不关闭浏览器,cookie一直有效,因此可以用cookie保证用户不掉线。如果在浏览器截取cookie包,就有可能骗过服务器。(当然你不能直接拷贝文件,服务器会记录文件的修改时间,所以你需要在时间上骗过服务器)
(3),应用场景不同
在使用时,我们可以将登陆信息等需要保证安全的信息存储在session里。然后其它信息存储在cookie里,保证安全同时尽量避免服务器冗余
3.Web容器的作用域
application:整个应用 对应servlet中ServletContext
整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”
session:会话 对应servlet中HttpSession
所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。
request:一次请求 对应servlet中的HttpServletRequest
page:当前页面
如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量
4.拦截器、过滤器、监听器
拦截器:
是面向切面编程(AOP,Aspect Oriented Program)的。就是在你的Service或者一个方法前调用一个方法,或者在方法后调用一个方法。比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
在springmvc中,定义一个拦截器可以通过两种方式:一种是通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类来定义;另一种是通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。如果是springboot直接使用注解就可以。
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
常见的拦截器的用途:
1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
过滤器:
对于web应用来说,过滤器是一个驻留在服务器端的Web组件。web容器接收到一个对资源的请求时,它将判断是否有过滤器与这个资源关联,如果有,那么容器将这个请求交给过滤器处理。
在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源
常见的过滤器用途有:对用户请求进行统一的认证、对用户的访问请求进行审核和记录、对用户发送的数据进行过滤或替换、转换图像格式、对响应内容进行压缩以减少传输量、对请求或响应进行加密处理、触发资源访问事件等
过滤器和拦截器的区别:
通俗理解:
(1)过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。(理解:就是一堆字母中取一个B)
(2)拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。(理解:就是一堆字母中,干预它,通过验证的少点,顺便干点别的东西)
具体区别有:
拦截器是基于java的反射机制的,而过滤器是依赖于servlet容器,基于函数的回调。
拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
监听器:
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
5.Post和Get的区别
重点:GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。
HTTP报文层面:GET将请求信息放在URL,POST放在报文体中。
数据库层面:GET符合幂等性和安全性,POST不符合。
其它层面:GET可以被缓存、被存储,POST不行
分别说明:
get用来获取数据,post用来提交数据
get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制,最长2048字节),而post无限制。
get请求的数据会附加在url之 ,以 " ? "分割url和传输数据,多个参数用 "&"连接,而post请求会把请求的数据放在http请求体中。
get是明文传输,post是放在请求体中,但是开发者可以通过抓包工具看到,也相当于是明文的。
get请求会保存在浏览器历史记录中,还可能保存在web服务器的日志中
幂等性
幂等通俗的来讲就是指同一个请求执行多次和仅执行一次的效果完全相等。这里来扯出幂等主要是为了处理同一个请求重复发送的情况,假如在请求响应之前失去连接,如果这个请求时幂等的,那么就可以放心的重发一次请求。所以可以得出get请求时幂等的,可以重复发送请求,post请求时不幂等的,重复请求可能会发生无法预知的后果。
5.转发forward和重定向redirect的区别
重点:转发是服务器行为,属于同一次请求,访问本站点的其它页面。重定向是客户端行为,至少两次请求,可以访问任意URL。
请求转发:
request.getRequestDispatcher(“/test.jsp”).forword(request,response);
重定向:response.sendRedirect(“/test.jsp”);
区别:
请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;
发生行为不同:重定向是客户端行为,转发是服务器端行为;
使用:
重定向的速度比转发慢,因为浏览器还得发出一个新的请求,所以如果在使用转发和重定向都无所谓的时候建议使用转发;
因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了。
6.谈谈你对于servlet的认识
可以从两个方面去看Servlet:
a、API:有一个接口servlet,它是servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口。
b、组件:服务器端用来处理客户端请求的组件,需要在web.xml文件中进行配置。
servlet的生命周期是:加载servlet的class—》实例化Servlet-----》初始化servlet(调用init方法)------》调用服务service方法(处理doget和dopost方法)-----》servlet容器关闭时调用销毁方法(destory方法)
7.mvc的理解
MVC 是 Model-View-Controller 的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB 组件实现), View 是应用的表示面(由 JSP 页面产生),Controller 是提供应用的处理过程控制(一般是一个 Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。