Filter三之dispatcher

不知道大家有没有发现这么一个现象?登录和没有登录的身份完全是两种状态。怎么说呢,就是一个这样的现象。举一个简单的例子来讲,如果你在

逛淘宝的时候没有登录,那么你是必须要登录才能加入购物车和收藏,但是登录之后就不用了,这是为什么呢,其实这是用到了我们的过滤器和监听器

的作用,对页面之间的跳转进行了拦截判断。今天主要是代码,所以等会将会有一大波代码来袭~~~~~

首先,我们来个“简单”思维导图:

代码实现部分:

1、首先jsp页面

登录页面

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

Insert title here

账号:


列表页面

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

Insert title here one.jsp two.jsp three.jsp
配置Web.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>WEB_JSP_17</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <--loginServlet的配置-->
  <servlet>
  	<servlet-name>loginServlet</servlet-name>
  	<servlet-class>com.student.Servlet.LoginServlet</servlet-class>
  </servlet>
<--loginServlet的映射-->
 <servlet-mapping>
  	<servlet-name>loginServlet</servlet-name>
  	
  	<url-pattern>/login.do</url-pattern>
  </servlet-mapping>
<--配置应用程序WEB的初始化参数:哪些jsp不需要经过登录判断-->
 <context-param>
  	<param-name>noCheckLogin</param-name>
  	<param-value>/three.jsp,/login.jsp,/list.jsp,/login.do</param-value>
  </context-param>
 <--配置过滤器-->
  <filter>
  	<filter-name>listFilter</filter-name>
  	<filter-class>com.student.Filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>listFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
然后就是java类的代码啦!

登录的Servlet

 

 

package com.student.Servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到账号的值
		String uname=req.getParameter("uname");
		//对账号进行判断
		if("admin".equals(uname)){
			//如果正确就跳到list.jsp页面并保存到session中
			//转型为session
			HttpSession session=req.getSession();
			session.setAttribute("uname", uname);
			req.getRequestDispatcher("list.jsp").forward(req, resp);
		}else{
			resp.sendRedirect("login.jsp");
		}
	}
}


登录的Filter
package com.student.Filter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;

public class LoginFilter extends HttpFilter {
	
	private List lt;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		//获取ServletContext(application)
		ServletContext sc=filterConfig.getServletContext();
		String noCheckLogin=sc.getInitParameter("noCheckLogin");
		//将noCheckLogin转化为集合
		String s[]=noCheckLogin.split(",");
		lt = Arrays.asList(s);
	}
	
	
	
	
	@Override
	protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//1、获取请求的路径
		String path=request.getServletPath();
		if(lt.contains(path)){
			chain.doFilter(request, response);
		}else{
			HttpSession session=request.getSession();
			Object o=session.getAttribute("uname");
			if(o!=null){
				chain.doFilter(request, response);
			}else{
				response.sendRedirect("login.jsp");
			}
		}
	}

}





 lt;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		//获取ServletContext(application)
		ServletContext sc=filterConfig.getServletContext();
		String noCheckLogin=sc.getInitParameter("noCheckLogin");
		//将noCheckLogin转化为集合
		String s[]=noCheckLogin.split(",");
		lt = Arrays.asList(s);
	}
	
	
	
	
	@Override
	protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//1、获取请求的路径
		String path=request.getServletPath();
		if(lt.contains(path)){
			chain.doFilter(request, response);
		}else{
			HttpSession session=request.getSession();
			Object o=session.getAttribute("uname");
			if(o!=null){
				chain.doFilter(request, response);
			}else{
				response.sendRedirect("login.jsp");
			}
		}
	}

}







然后再给大家分享一个对于Filter中比较实用的一段代码哈吐舌头

<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
<dispatcher>子元素可以设置的值及其意义
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。


那么今天就到此结束啦~~大家晚安啦~~大笑

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值