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的更多相关文章

  1. javaweb 02: servlet

    Servlet对象的生命周期 什么是Servlet对象生命周期? Servlet对象什么时候被创建. Servlet对象什么时候被销毁. Servlet对象创建了几个? Servlet对象的生命周期表 ...

随机推荐

  1. Python pyQt4/PyQt5 学习笔记3(绝对对位,盒布局,网格布局)

    本节研究布局管理的内容. (一)绝对对位  import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__( ...

  2. Python3.6的组件numpy的安装

    安装numpy,scipy,scikit-learn,matplotlib 下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 我的版本是win10+py ...

  3. Python 2.7.6 安装lxml模块[ubuntu14.04 LTS]

    lxml --->首字母是字母l,不是数字1 lxml 2.x : https://pypi.python.org/pypi/lxml/2.3 1xml官网:http://lxml.de/ 一 ...

  4. ORA-00600: internal error code, arguments: [kgl-no-mutex-held]

    一.环境 windows oracle 11.2.0.4 RAC 二.问题现象 1.连接数据库后,无法查询 2.报错信息:ORA-00600: internal error code, argumen ...

  5. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十六:IIC储存模块

    IIC储存器是笔者用来练习精密控时的经典例子.<整合篇>之际,IIC储存器的解释,笔者也自认变态.如今笔者回头望去,笔者也不知道自己当初到底发什么神经,既然将IIC的时序都解释一番.由于开 ...

  6. csdn博客刷点击率(java代码)

    此文为转载,亲测有效. import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; impo ...

  7. IIS7配置伪静态把后缀名映射为html方案

    1.在IIS新建站点.[创建的时候不用去选择版本和模式,默认即可] 2.选中站点,切换到功能试图,找到“处理程序映射",双击之后,在打开窗口右侧的操作栏目下做如下设置: 1)右边" ...

  8. python---使用md5加密

    python中使用md5进行加密字符串: __author__ = 'Administrator' #-*- coding: utf-8 -*- import hashlib aa = ' #需要加密 ...

  9. Python:正则表达式概念

    #正则表达式内容非常多,网上的学习资源也是目不暇接,我从中筛选学习并且整理出以下 的学习笔记 一.正则表达式匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一 ...

  10. Visual Studio 2017 调试 windows server 2016 Docker Container

    网上很多文章都是在win10下,用Docker for windows工具进行Docker的安装部署的.用知道windows server 2016已经原生支持Docker了,其windows Con ...