1.过滤器的介绍
根据视频中的讲解,完成以下内容
(1)视频中的引入过滤器提到的项目中存在的问题是什么问题?
在session失效的情况下,所有依赖于session的操作都无法执行
(2)根据视频讲解说说你对过滤器的理解,以及你觉得过滤器的作用是什么?
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应 。
2.过滤器的创建和配置
(1)视频中在代码注释中描述的问题是什么?。
目前我们访问Servlet,是可以直接进行访问的,没有进行任何防护。可能会造成服务器资源的浪费,以及安全性不高。我们希望真的在请求被Servlet处理之前,进行一次请求的校验,符合要求再调用对应的Servlet进行请求处理
(2)创建过滤器要实现的接口是?。
Filter
(3)创建的过滤器类中需要实现的三个方法是?。
public class MyFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("我是MyFilter拦截器");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
(4)在web.xml中配置过滤器的代码是?
<filter>
<filter-name>myFilter</filter-name>
<filter-class>an.sz.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.过滤器之doFilter和init和destory方法
(1)doFilter方法的作用是?参数是及作用是?。
服务器在接收到浏览器发过来的请求后,先解析请求信息,创建对象request和response然后根据请求URL地址判断如果符合过滤器的过滤范围,则会调用过滤器中的doFilter来进行请求拦截,并将request和response对象作为实参传递给doFilter方法。我们可以在doFilter方法中声明过滤器拦截代码
ServletRequest:接收此次拦截的请求的request实参
ServletResponse:接收此次拦截的请求的response实参
FilterChain:可以进行请求放行
chain.doFilter(request, response);
(2)init方法的执行时机是?
服务器启动时
(3)destory方法的执行时机是?
服务器关闭时
4.过滤器之拦截范围的配置
(1)过滤器的拦截范围的配置是?及拦截的范围是什么?
拦截所有:/*
拦截部分Servlet的请求:*.do
拦截指定Servlet的请求:和要拦截的指定的Servlet的url-pattern配置完全一致即可,例如:/my
5.过滤器案例之统一请求编码格式
(1)根据视频讲解使用过滤器完成编码格式的统一设置。
MyFilter:
public class MyFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest sreq, ServletResponse sresp,
FilterChain chain) throws IOException, ServletException {
//设置请求编码格式
sreq.setCharacterEncoding("utf-8");
//设置响应编码格式
sresp.setContentType("text/html;charset=utf-8");
chain.doFilter(sreq, sresp);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
Web.xml配置:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>an.sz.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6.过滤器之session管理放行登录页面和登录请求
(1)视频中的session管理的基本思路是什么?
在过滤器中获取session对象,然后查看session中的数据是否还在如果数据没了,则因为session失效则重定向到登录页面。如果数据还在session没有失效,则放行
(2)视频中在过滤器中实现的session管理存在的问题是?。
问题1:在过滤器中使用session校验后发现登录页面的访问成了死循环,因为登录页面的请求也就是login.jsp的请求也会被过滤器拦截,而此时session中没有相关数据的造成又重定向到登录页面…
解决1:对login.jsp和登录请求进行放行
7.过滤器之session管理静态资源放行和登录页面跳转
(1)视频中session管理的代码仍然存在的问题是?
问题2:过滤器会拦截所有的请求,包括静态资源(css文件\js文件\image图片)请求也会拦截。造成页面中的样式和动态效果等出不来
解决2:对静态资源放行
8.过滤器之session管理ajax请求优化
(1)根据视频讲解在session管理代码中完成ajax请求的优化处理。
function del(uid){
if(confirm("您确定要删除吗?")){
$.get("data",{method:"deleteInfo",uid:uid},function(data){
if("true"==data){
if(eval(data)){
alert("用户删除成功");
window.location.href = "data?method=selAllUser";
}
}else{
window.location.href=location.href;
}
});
}
}
9.过滤器之权限管理功能需求分析和数据库设计
(1)权限管理的需求是什么?。
不同的用户在对同一功能使用时,有的用户可以直接使用,有的用户会被提示权限不足。
(2)视频中讲解的思路是什么?
1、在数据库中创建一个URL权限表,该表存储了该系统需要被管理的URL。
2、在数据库中创建用户权限中间表,用来进行权限分配
3、在数据库中将权限给用户分配好
4、在用户登录成功后查询该用户具备的URL权限,存储到该用户的session中
5、在过滤器中对当前发起请求的用户的请求地址进行校验,校验该用户是否具备该请求地址的权限,如果具备则放行执行,如果不具备则提示权限不足。
10.过滤器之权限管理功能数据实现和登录查询权限实现
(1)根据视频,完成视频中的功能。
if("/project2/login.jsp".equals(uri) || ("/project2/data".equals(uri)&& "userLogin".equals(method)) || uri.startsWith("/project2/css/") || uri.startsWith("/project2/js/")|| uri.startsWith("/project2/images/")){
//放行
chain.doFilter(request, response);
}else{
//session管理(session统一校验)
//获取Session对象
HttpSession session = req.getSession();
Object obj=session.getAttribute("user");
//判断
if(obj!=null){
//获取权限信息
List<Url> lu=(List<Url>) session.getAttribute("lu");
//权限校验
for(Url url:lu){
if(url.getLocation().equals(method) || url.getLocation().equals(uri)){
//放行
chain.doFilter(request, response);
return;
}
}
//响应
resp.getWriter().write("power");
return;
}else{
//重定向到登录页面
resp.sendRedirect("/project2/login.jsp");
}
}
11.过滤器之权限管理大结局
(1)根据视频完整实现权限管理功能
代码见上
12.监听器的引入和介绍
(1)视频中统计当前在线人数的思路是什么
统计当前系统的session的个数,一个session意味一个在线的用户。
在session被创建的时候使用计数器+1,session被销毁的时候计数器-1,
将计数器存储在ServletContext对象。
(2)视频中的监听器的作用是什么?
监听request、session、application三个域对象的创建,销毁和数据的变更
(3)完成删除功能的Servlet的实现
13.监听器的使用之监听request对象
(1)监听request对象的两个接口什么?
监听request的创建和销毁:ServletRequestListener
监听request作用域数据的变更:ServletRequestAttributeListener
(2)监听request对象的两个接口的方法是?作用分别是?
requestInitialized(ServletRequestEvent sre)监听request对象的初始化
requestDestroyed(ServletRequestEvent sre)监听request对象的销毁
attributeAdded(ServletRequestAttributeEvent srae)监听request对象添加数据
attributeRemoved(ServletRequestAttributeEvent srae)监听request对象删除数据
attributeReplaced(ServletRequestAttributeEvent srae)监听request对象修改数据
(3)在web.xml配置监听器的标签是?给出一个配置示例
标签:<listener></listener>
示例:<listener>
<listener-class>an.sz.listener.MyListener</listener-class>
</listener>
14.监听器之监听session和application对象
(1)监听session对象的接口是?
HttpSessionListener、HttpSessionAttributeListener
(2)监听session对象的接口的方法分别是?作用是?
//session的创建和销毁
@Override
public void sessionCreated(HttpSessionEvent arg0) {
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
}
//session内容添加、删除和修改
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
}
(3)监听application对象的接口是?
ServletContextListener、ServletContextAttributeListener
(4)监听application对象的接口的方法分别是?作用是?
//ServletContext对象的创建和销毁
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
}
//ServletContext内容的添加、删除和修改
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
}
15.监听器案例之当前在线人数统计
(1)根据视频,完成统计当前在线人数功能。
Mian.jsp:
<div style="position: relative;left: 300px;"class="head-l">
<span style="color: white;font-size: 15px">当前用户在线人数为:${applicationScope.count}</span>
</div>
MyListener:
public class MyListener implements HttpSessionListener,ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
//获取ServletContext对象
ServletContext sc = sce.getServletContext();
//创建计数器
int count = 0;
//将计数器存储进sc对象中
sc.setAttribute("count", count);
System.out.println(count);
}
@Override
public void sessionCreated(HttpSessionEvent hse) {
//获取ServletContext对象
ServletContext sc = hse.getSession().getServletContext();
//获取计数器
int count = (int)sc.getAttribute("count");
System.out.println("aioefiadjkcsvkdhi"+count);
//每创建一次session用户在线数加1
++count;
//将结果再存储进sc对象中
sc.setAttribute("count",count );
//System.out.println(count);
}
@Override
public void sessionDestroyed(HttpSessionEvent hse) {
//获取ServletContext对象
ServletContext sc = hse.getSession().getServletContext();
//获取计数器
int count = (int)sc.getAttribute("count");
//每创建一次session用户在线数减1
--count;
//将结果再存储进sc对象中
sc.setAttribute("count",count );
}
}
Web.xml:
<listener>
<listener-class>an.sz.listener.MyListener</listener-class>
</listener>