MVC设计结构
mvc是一种架构模型,本身并没有新功能,只是对项目的一种规范,方便后期进行维护;mvc架构将模型(M),视图(V)和控制(C)割离开
MVC架构
- M:model模型,负责数据的处理
- V:View视图,负责数据的展示,用户的交互
- C:Controller:控制器,负责接收视图传递过来的据,以及模型处理完的结果返回的视图
MVC架构的作用
使得界面代码和逻辑代码彻底分离
M:service+entity+dao
V:Jsp
C:Servlet
MVC的优缺点
-
优点:
- 耦合性低,方便维护,利于分工协作
- 重用性高
-
缺点:
- 使得项目架构变得复杂,对开发人员要求变高
会话
什么是会话
狭义上讲,从打开浏览器与服务器交互,到浏览器关闭的这个过程就可以称为会话。
为什么需要会话
如果没有会话,就没有办法识别谁是谁,如我在账号a上收藏了10件商品,退出后登录账号b要么账号b能看到账号a收藏的东西,要么账号a再次登录也看不到10件商品
会话跟踪技术
即每个有关联得页面之间共用一个会话
例如在一个会话中的请求如下:
- 请求银行主页。
- 请求登录(请求参数是用户名和密码)
- 请求转账(请求参数与转账相关的数据)
- 请求信誉卡还款(请求参数与还款相关的数据)
后三个页面都要是同一个账号,这种情况就是会话跟踪
常用的会话跟踪技术有隐藏表单域、URL重写、session和cookie
Session
session表示会话,每一个请求到达服务器后,服务器都会分配一个session对象,session对象包含有session空间和sessionid,默认当30分钟不对此session进行操作时则自动删除
- session对象的获取
req.getSession();
- 获取sessionid
session.getId();
- 让会话失效
session.invalidate();
cookie
cookie是服务器向客户端发送数据的一种手段,适合携带少量数据。默认当浏览器关闭时删除
-
获取cookie归属哪个域名
cookie.getDomain();
-
获取cookie最大的存活时间
cookie.getMaxAge();
-
设置cookie最大存活时间
cookie.setMaxAge(n);
- n:正数,表示存活多少秒
- n:0,表示立即删除该cookie
- n:负数,表示浏览器关闭时过期
-
设置cookie归属哪个域名
cookie.setDomain();
查询字符串
在链接后面添加?key=value&key=value…
示例:localhost:8080/login.jsp?id=1&name=123
表单隐藏域
将部分数据隐藏并传出
当循环输出时不需要输出ID时就可以使用
示例:<input type="hidden">123</input>
URL重写
当cookie被禁用时可以通过此方法来完成会话
案例:resp.encodeRedirectURL("index.jsp")
原理是在地址栏后面加上;jsessionid=FBE6F779651AF09FFDC286B642D5D3CA,来保诚禁用cookie时仍然能使用cookie
如何实现7天免登录
//on为复选框是否勾选
HttpSession session = req.getSession();
if ("on".equals(check)) {
//设置session最大生命周期
session.setMaxInactiveInterval(60*60*24*7);
//新建cookie
Cookie cookie = new Cookie("JSESSIONID", session.getId());
//设置cookie时长
cookie.setMaxAge(60*60*24*7);
//使这个cookie在访问网站时都被携带
cookie.setPath("/");
//向页面中添加这个cookie
resp.addCookie(cookie);
}else{
//取消七天免登录
session.setMaxInactiveInterval(60*30);
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(-1);
cookie.setPath("/");
resp.addCookie(cookie);
}
会议T出
会议T出即是你不能在两个地方同时登录一个账号,如QQ不能在两台手机同时登录
if(map.containsKey(name)){
//使之前的会话失效
map.get(name).invalidate();
map.remove(name);
}
//将当前的session加进去
map.put(name,session);