nginx 反向代理服务器
作用:
常用命令:
./nginx
启动
./nginx -s stop
关闭
./nginx -s quit
关闭
重启:
先关闭后启动;刷新配置文件;
./nginx -s reload
刷新配置
配置虚拟主机配置文件:
usr/local/nginx/conf/nginx.conf
//一个server节点就是一个虚拟主机;
server{
listen 80;
server_name localhost;
location/{
//html是nginx安装目录下的html目录;
root html-80;
index index.html index.htm;
}
}
反向代理:
反向代理服务器决定哪台服务器提供服务,与正向一样也是请求转发;
正向
: 用户->局域网->代理服务器,请求转发->internet;
反向
: 用户->internet->nginx反向代理服务器,请求转发->哪台服务器提供服务;
配置反向代理配置文件:
//server_name 可使用域名tomcat2;
server{
listen 80;
server_name localhost;
location/{
proxy_pass http://tomcat2
index index.html index.htm;
}
}
负载均衡
一个服务由多个服务器提供,需要将负载分配到不同的服务器处理;
配置负载均衡配置文件:
//与server同级,名称为proxy_pass对应;
upstream tomcat2{
server 192.168.1.1:8080;
server 192.168.1.2:8080 weight=2;
}
域名,端口,ip间的关系
域名: 就是网站,与ip关系是ip:域名->一对多
dns服务器: 将域名解析成ip地址,保存的就是域名和ip的映射关系;
一,二,三级域名,按照.
分隔,例如Jd.com
是一级域名;以此类推,加前缀则级数变多;
redis no-sql缓存
常用命令:
String: key-value
get-set
,incr-decr
可用于生成订单号,
Hash: key-map
Hset-Hget
用于对key进行归类;
List:
lpush list1 a b c d
push一个列表;
lrange list1 0 -1
查看一个列表,start end(-1表示所有)
lpop list1
将list1列表的最后加入的元素弹出;
rpop list1
将列表第一个加入的元素弹出;
del list1
删除列表;
Set:
sadd set1 a b c d
添加一个set集合;
smembers set1
查看一个set集合
srem set1 a
删除一个元素;
zset: 有顺序,不能重复;
zadd zset1 2 a 3 b 1 c 4 d
添加一个zset集合,元素|排序输入方式;
zrange zset1 0 -1
查看一个zset集合;
zrange zset1 0 -1 withscores
显示排序序号;
zrem zset1 a
移除一个元素;
zrevrange zset1 0 -1
逆序查看
expire: 设置过期时间
expire key second
设置key的存储时间
ttl key
查看key的过期时间
persist key
清除key的过期时间,持久化
redis使用加前缀
的方法的key进行分类:
一般将一个二维表保存到redis中:
ITEM_INFO:123456:BASE
freemarker 网页静态化
常用步骤:
configuration
对象,直接new一个对象.utf-8
;Template
;Map
orpojo
;模板语法:
访问map中的key ${key}
访问pojo中的属性 ${pojoKey.propertyName}
访问集合中的数据
<#list studentList as stu>
${stu.id}/${stu.name}
<#list>
访问循环的下标
<#list studentList as stu>
${stu_index}
<#list>
控制流语句
<#list studentList as stu>
<#if stu_index % 2 ==0>
<@else>
<#if>
<#list>
日期类型格式化
当前日期${date?date}
,
当前时间${date?time}
,
当前日期和时间${date?datetime}
,
自定义日期格式${date?string("yyyyMM/dd HH:mm:ss")}
null值的处理
${myval!"myval为null"}
<#if myval?? >
Include
标签
<#include "模板名称.ftl">
sso 单点登录系统
登录流程:
跨域相关
问题: js不可以跨域请求数据;
跨域: 域名不同,域名相同端口不同;
解决跨域问题: jsonp
js特性绕过跨域请求,js可跨域加载js文件;
服务端调用处 @RequestMapping(value="",produces=MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8")
添加参数
@ResponseBodyString callback
,
返回String strResult = callback +"("+ JsonUtils.objectToJson(result) +")"
返回的类似mycall({id:1,name:a})
的字符串到调用的ajax处,由于js的特性,成为一个function语句,即success的回调;
解决跨域问题二: MappingJacksonValue spring4.1以上
spring 拦截器
可以为每个接口做验证功能,如单点登录,手机端token验证;
实现HandlerInterceptor
接口,
preHandler : 执行handler之前执行方法,可再次判断单点登录;
postHandler : 执行handler之后返回ModelAndView之前,渲染视图之前;
afterCompletion : 返回ModelAndView之后执行,渲染视图完毕,相当于finally,执行异常处理,性能监控等;
运行流程:
1、拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。
2、会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则按顺序加载完preHandle方法。
3、然后执行主方法(自己的controller接口),若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。
4、在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的postHandle方法和afterCompletion(postHandle都执行完才会执行这个,也就是页面渲染完数据后,执行after进行清理工作)方法。(postHandle和afterCompletion都是倒序执行)
前端知识 html关键
input
form属性
action提交路径
method提交方式
input
标签类型:
转义字符:
构成: &
#
;
emoji unicode码
> >
& &
前端知识 css关键
格式: 选择器[属性:值,属性:值]
html&css连接方式:
eg:
测试style
选择器:
#
引入指定元素设置样式, #id1{ ... }
.
引入一类元素设置样式,.class1{ ... }
元素名
引入一种元素设置样式,div{ ... }
div[name="name1"]{ ... }
div span{ ... }
a:link{未访问连接样式},a:visited{已访问连接样式},a:hover{鼠标悬浮},a:action{选定连接}
常用style:
float: left,right,both,clear(设置元素两边允许有其他浮动元素)
display: none,bolck(块级,换行),inline(内联,不换行)
前端知识 js关键
定义: 直译式脚本语言,弱语言类型,基于事件驱动;
一般用于修改html,修改css样式,表单验证;
组成:
html&js连接方式:
script标签
中,可放在任何地方,可放在head标签中,一般放在body的后面;src
导入,注意使用了src路径后,该标签体中的js代码不执行;js操作css: document.getElementById(“id”).style.属性 = “…”
原始类型:
Undefined,Null,Boolean,Number,String
typeof 关键字判断;
引用类型:
decodeURL
,parseInt
,eval(将普通字符串转换为js代码)
函数:
function 函数名(参数){
函数体;
}
var 函数名= function(参数){
函数体;
}
onload 函数,写在script中
onload = function(){
页面加载时运行的方法;
}
事件:
Dom event: onclick
,"return 函数名()"
事件绑定,派发事件:
标签绑定事件
元素派发匿名事件
document.getElementById().onclick = function(参数){
函数体;
}
元素派发事件,按照函数名(这种的无参数列表);
document.getElementById().onclick = 函数名
BOM
window 可获取其他的四个对象参数;
window.location
window常用方法:
alert,confirm,prompt
弹框
setInterval()周期执行某个方法,setTimeout()延迟执行一次,clearInterva(id),clearTimeout(id)
window.open(URL,name,features,replace) window.close
打开或关闭;
window.location.href = "url"
window.location.href.reload()
获取或设置当前页面url;
window.history.back()
window.history.forward()
window.history.go(int)
回退和前进;
DOM
过程: 当流览器接受到html代码时,浏览器会将所有的代码装载到内存中,生成document树;包含文档节点``元素节点``属性节点``文本节点
获取节点:
jQuery ☕☕☕
格式: ${"选择器"} jQuery{"选择器"}
与原生js的转换:
//dom -> jquery
var obj = document.getElementById(id);
var $obj = ${obj};
$obj.val();
//jquery -> dom
var $obj = ${"#id"};
var obj1 = $obj.get(0);
var obj2 = $obj[0];
事件派发:
//onload 事件,可多次使用
$(function(){ ... })
$(document).ready(function(){ ... })
//普通事件,去除原生的`on`
$("选择器").click(function(){ ... })
jQuery选择器:
:visiable属性
jQuery 属性操作符:
$("#id").attr( ... )
attr("attr name") 获取属性;
attr("attrname","value") 设置属性;
attr({attr1:value1,attr2:value2})
removeAttr("attrname")
//快捷添加样式;
addClass("classname")
removeClass("classname")
$("input[type='checkbox']").prop('checked')
removeProp("属性")
JQuery css 操作:
css("attrname")
: 获取或设置css的属性;
JQuery 数组遍历:
JQuery 文档操作:
内部插入:
外部插入:
empty 清空元素,remove 删除元素;
bootstrap
栅格布局媒体查询
屏幕分辨率 >1200px 使用col-lg-;每行显示6个,col-lg-2;
屏幕分辨率>992 && <1200 使用col-md-;每行显示4个,col-md-3
屏幕分辨率<992 >768 使用col-sm-;每行显示2个,col-sm-6
屏幕分辨率<768 使用col-xs-;每行显示一个,col-xs-12
〰〰〰〰〰〰〰〰〰〰〰〰〰〰我是分隔线 〰〰〰〰〰〰〰〰〰〰〰〰〰〰
---xml 可扩展标记语言;
格式:
CDATA: 输入原始文字
xml约束:
.xsd
<根标签 xmlns=" ... ">
引入命令空间,约束文件名称; xmlns:aaa =" ... "
声明当前的xml文件是一个xml实例文件;aaa:schemaLocation="约束的名称空间,约束文件的位置"
Http 超文本传输协议
请求:
请求转发: req.getRequestDispathcher("内部路径").forward(req,resp)
常用方法:
http://localhost:8080/项目名/path
/项目名/pathname
http/1.1
响应:
HTTP/1.1 200 OK
resp.setStatus(302)
和Location搭配)resp.sendRedirect("url")
resp.setHeader("content-type","text/html;charset=utf-8")
resp.setHeader("refresh","1000;url=xxx")
Content-Disposition: attachment;filename=aaa.zip
resp.setHeader("content-disposition","attachment;filename=URLEncoder.encode(filename,"utf-8")")
常用方法:
;Servlet 生命周期 (小服务程序,服务连接器)
三大组件(servlet,listener,filter)
servlet 是单实例多线程,默认第一次访问的时候,服务器创建servlet并调用init初始化,并调用一次service方法,每当请求来的时候,服务器创建一个线程,调用service方法执行自己的业务逻辑;当servlet被移除或服务器正常关闭时,服务器调用servlet的destroy方法执行自己的业务逻辑;
load-on-startup
修改servlet初始化时机,正整数,值越大,优先级越低;
load-on-startup
大于等于0时,在应用程序启动时加载servlet,这时init方法调用一次;如果为负数或没有设置时,容器会在servlet被请求时调用init;listener:
filter:
单实例多线程,服务器启动的时候,服务器创建filter,调用init方法,实现初始化操作;请求来的时候,创建一个线程,根据路径调用doFilter,执行业务逻辑;当filter被移除的时候或服务器正常关闭的时候,调用destory方法销毁;
常用方法:
域对象
ServletContext 全局管理器
当项目启动的时候,服务器为每一个web项目创建一个servletContext对象,当项目被移除的时候或服务器关闭的时候servletcontext销毁;
存放共享的数据
常用方法:
ServletContext getServletContext()
ServletContext getServletConfig().getServletContext()
setAttribute(String key,Object value); Object getAttribute(String key); removeAttribute(String key);//移除值
String getInitParameter();Enumeration getInitParameterNames()
getRealPath(String path);获取文件部署到tomcat上的真实路径(带tomcat路径);getRealPath("/"):获取项目发布到服务器的根目录D://XXXX/项目名
getResourceAsStream(String):以流的形式返回一个文件,获取tomcat上的文件,可用于下载
getMimeType(String 文件名称):获取文件的mime类型 大类型/小类型
Request HttpServletRequest
Session HttpSession
session.invalidate()
;请求转发和重定向的区别:
ReDirect&Forward
cookie&session 浏览器,服务器端的会话技术;
cookie: 由服务器生成,通过response写回浏览器(响应头header.set-cookie),保留在浏览器中,浏览器下一次访问根据一定的规则request携带不同的cookie(请求头header.cookie),服务端接受cookie; (注意跨域问题)
常用方法:
/项目名
开始 到最后一个/
结束;session:
服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。(不支持就使用URL地址重写
);
URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。
流程:
第一次访问服务器,服务器从cookie中获取jsessionId,
如果有jsessionid,用jsessionid在session池中查找有无session,有 存入已有数据;没有 创建session,保存已有数据,通过cookie写回jsessionid到浏览器
没有jsessionid,创建session,保存用户数据,将当前的jsessionid保存到cookie中写回到浏览器;
常用方法:
el 表达式 与 jstl表达式
获取域中数据
简单数据: ${域名.域中属性名} || ${键(域中属性名)}
r e q u e s t S c o p e . t a r g e t K e y < b r > 复 杂 数 据 : < b r > ‘ {requestScope.targetKey}<br> 复杂数据: <br>` requestScope.targetKey<br>复杂数据:<br>‘{域中名称key[index]} || 域 中 名 称 m a p . k e y ‘ ‘ 特 殊 符 号 情 况 下 : {域中名称map.key}` `特殊符号情况下: 域中名称map.key‘‘特殊符号情况下:{域[“域中属性名”]}
${域中名称key . bean属性名}`
javabean:
运算:
${empty list} 判断一个容器长度是否为0或判断一个对象是否为null;
el的内置对象: (共11个,10个是map,pageContext不是map)
pageContext.getAttribute("xxx")
request.getAttribute("xxx")
session.getAttribute("xxx")
application.getAttribute("xxx")
request.getParameter("xxx")
request.getParameterValues("xxx")
request.getHeader("xxx")
request.getHeaders("xxx")
Map
${cookie.JSESSIONID.value}
获取jsessionid的值;pageContext.request.contextPath
获取项目名称;jsp的九大内置对象(jsp页面可直接使用,详情以下)
jstl常用方法: (使用 thymeleaf 代替)
c:if if表达式
c:forEach for循环
${i} 取值
${vr.count} 记录次数;
${vr.current} 当前遍历内容;
//可以直接使用items
事务 一件完成的事情 提交or回滚
mysql事务: 默认自动提交, oracle 默认手动提交;
set autocommit = off
关闭自动事务后,每个操作都需要commit;
start transaction
手动开启一个事务, rollback; commit;
事务特性: ACID
隔离性读问题:
读问题解决方法: 设置数据库的隔离级别;
read uncommited 读未提交
read commited 读已提交 (oracle 默认)
repeatable read 可重复读 (mysql 默认)
serializable 串行化
效率对比: read uncommited > read commited > repeatable read > serializable;
令牌机制
使用请求转发时,防止表单重复提交,重定向
或者令牌机制
hidden
;ajax 快速动态网页技术,与后台少量数据交换,网页异步更新;
XMLHTTPRequest
常用属性:
xmlhttp.setRequestHeader("content-type","application/x-www-form-urlencoded")
意为form表单的enctype的属性;state ==400 && readyState ==4
jquery ajax:
load
通过ajax请求从服务器加载数据,将返回的数据放置在指定的元素中;
$.get
$.post
xml,html,script,json,text,defalut
$.ajax
json jsonp
类加载器
编写.java -> .class 运行时加载到内存中,需要类加载器加载;
层次结构:
rt.jar
Bootstrp loaderext/*.jar
ExtClassLoader全盘委托机制 ( 双亲委派机制 ):