不知道大家有没有发现这么一个现象?登录和没有登录的身份完全是两种状态。怎么说呢,就是一个这样的现象。举一个简单的例子来讲,如果你在
逛淘宝的时候没有登录,那么你是必须要登录才能加入购物车和收藏,但是登录之后就不用了,这是为什么呢,其实这是用到了我们的过滤器和监听器
的作用,对页面之间的跳转进行了拦截判断。今天主要是代码,所以等会将会有一大波代码来袭~~~~~
首先,我们来个“简单”思维导图:
代码实现部分:
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:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
那么今天就到此结束啦~~大家晚安啦~~