servlet07
1.session验证
可以防止非登录的用户,通过在地址栏中输入地址,访问受保护的页面
step1.在用户登录成功之后,将用户的信息保存到session中
step2.在访问受保护的页面时,校验session中是否包含用户的信息
2.session删除
session.invalidate();
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//获取请求资源路径
String uri=request.getRequestURI();
//截取 /list
String action=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
AdminDAO dao=(AdminDAO)DAOFactory.getInstance("AdminDAO");
if("/list".equals(action)){
//session校验
HttpSession session=request.getSession();
Object obj=session.getAttribute("admin");
if(obj==null){
//登录失败
response.sendRedirect("login.jsp");
return;
}
//获取集合数据
try {
// 人为制造异常
// String str=null;
// str.length();
List<Admin> list=dao.finAll();
//将数据转交给jsp展示
//转发
request.setAttribute("list", list);
request.getRequestDispatcher("list.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
//将异常信息记录到日志里面
//将异常往外抛
throw new ServletException(e);
}
}else if("/add".equals(action)){
String username=request.getParameter("username");
String password=request.getParameter("password");
String realname=request.getParameter("realname");
Admin admin=new Admin(username,password,realname);
try {
dao.add(admin);
response.sendRedirect("list.do");
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}else if("/del".equals(action)){
int id=Integer.parseInt(request.getParameter("id"));
try {
dao.del(id);
response.sendRedirect("list.do");
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}else if("/load".equals(action)){
int id=Integer.parseInt(request.getParameter("id"));
try {
Admin admin=dao.findById(id);
//转发
request.setAttribute("admin", admin);
request.getRequestDispatcher("update.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}else if("/update".equals(action)){
int id=Integer.parseInt(request.getParameter("id"));
String username=request.getParameter("username");
String password=request.getParameter("password");
String realname=request.getParameter("realname");
Admin admin=new Admin(id,username,password,realname);
try {
dao.update(admin);
response.sendRedirect("list.do");
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}else if("/login".equals(action)){
//获取用户验证码
String userCode=request.getParameter("userCode");
//获取账号及密码
//获取session
HttpSession session=request.getSession();
String username=request.getParameter("username");
String password=request.getParameter("password");
//校验
//验证正确的验证码
String rightCode=(String)session.getAttribute("rightCode");
if(!rightCode.equalsIgnoreCase(userCode)){
//验证失败
request.setAttribute("code_msg", "验证码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
try {
Admin admin=dao.findByUserName(username);
if(admin!=null&&admin.getPassword().equals(password)){
//登录成功
//将用户的信息保存到session上
session.setAttribute("admin", admin);
response.sendRedirect("list.do");
}else{
//登录失败
request.setAttribute("login_msg", "账号或密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}else if("/logout".equals(action)){
//session删除
//重定向到登录页面
HttpSession session=request.getSession();
session.invalidate();
response.sendRedirect("login.do");
}
out.close();
}
3.URL重写
为什么需要URL重写?
因为sessionId是依赖于cookie的机制保存在浏览器内存中,那么当用户禁止cookie之后,如何继续使用cookie?
解决方案:URL重写
如何重写?
链接,表单:
response.encodeURL("count");
<form action="<%=response.encodeURL(count)%>">
</form>
重定向:
response.encodeRedirectURL("地址");
转发:不需要(一次交互)
4.cookie与session区别:
cookie:将数据保存在客户端
session:将数据保存在服务器
session优势:
a.session保存的数据类型更宽泛
b.session保存的数据量更大
c.session更安全
session缺点
a.sessionId是保存在浏览器内存中,浏览器一旦关闭,内存空间被释放,sessionId消失。
b.服务器会为每一个用户分配一个session对象,而session是保存在服务器端,当用户较大时,对服务器的压力响应增加,而cookie是保存在浏览器端,理论上对服务器没有压力。
应用场景:
session:登录拦截(session验证)、验证码校验
cookie:自动登录
5.过滤器
过滤器是servlet规范当中的一个特殊的类,可以用来对servlet请求进行拦截并处理。
如何定义一个过滤器
step1.定义一个Java类,实现一个Filter接口
step2.重写接口中的方法
step3.在web.xml文件中配置过滤器
练习:写一个过滤器ProcessFilter2,判断评论的长度是否超过指定的范围(比如:长度限制不能超过20)
分析:当有多个过滤器符合过滤条件时,它们的执行顺序与什么有关?
与web.xml文件中<filte-mapping>的配置有关。
优势:
a.当多个web组件有相同的功能需要实现时,可将这部分逻辑封装到过滤器中,方便后期维护
b.可"插拔性"比较好,当增加或者减少一个功能时,不会影响已经存在的功能。
应用场景:登录拦截、IP过滤
servlet07的更多相关文章
- javaweb 02: servlet
Servlet对象的生命周期 什么是Servlet对象生命周期? Servlet对象什么时候被创建. Servlet对象什么时候被销毁. Servlet对象创建了几个? Servlet对象的生命周期表 ...
随机推荐
- android 线程间的通信
(转自:http://www.cnblogs.com/allin/archive/2010/05/19/1738800.html) andriod提供了 Handler 和 Looper 来满足线程间 ...
- java (10) 集合类
1.集合概述 集合按照存储结构可以分为两类,即单列集合 Collection 和双列集合 Map. * Collection 用于存储一系列符合某种规则的元素,它有两个重要的自接口,分别是List和S ...
- C# 输出带颜色文字,用于实时日志输出
private void button1_Click(object sender, EventArgs e) { LogMessage("绿色"); 4 LogError(&quo ...
- remote: fatal: could not read Username for 'http://spapa.wicp.net:3000': No such device ors
解决办法: git remote add origin https://{username}:{password}@github.com/{username}/project.git in my ca ...
- cheerio ==> node中的jquery
三.cheerio ==> node中的jquery https://www.npmjs.com/package/cheerio $ npm install cheerio -- save 1 ...
- html如何让label在div中的垂直方向居中显示?
设置label的行高 line-height 和div的高度一致即可.
- Twig---和vue或angular前端框架并存
<h1> {% verbatim %} {{message}} {% endverbatim %} </h1> 上面这种方式虽然能够解决,前台渲染的问题,但是还是会报错: 第二 ...
- python类中的self参数和cls参数
1. self表示一个类的实例对象本身.如果用了staticmethod就无视这个self了,就将这个方法当成一个普通的函数使用了. 2. cls表是这个类本身. # 代码为证 class A(obj ...
- 访问php文件显示源码
前天新装了个LAMP的环境,兴冲冲的clone下来代码,结果一访问乐子就大了,直接显现源码 面对这个问题,冥思苦想,四处找资料啊 让我改这改那的,最后终于找到症结 Ubuntu 16.04 系统 LA ...
- 2018-2019-2 20165330《网络对抗技术》Exp4 恶意代码分析
目录 基础问题 相关知识 实验目的 实验内容 实验步骤 实验过程中遇到的问题 实验总结与体会 实验目的 监控你自己系统的运行状态,看有没有可疑的程序在运行 分析一个恶意软件,就分析Exp2或Exp3中 ...