精华内容
下载资源
问答
  • Servlet过滤器

    千次阅读 2019-03-11 10:48:46
    Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强。Servlet过滤器主要用于对客户端(浏览器)的请求进行过滤处理,先将过滤后的请求转交给下一资源,它在Java Web开发中具有十分重要的...

    Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强。Servlet过滤器主要用于对客户端(浏览器)的请求进行过滤处理,先将过滤后的请求转交给下一资源,它在Java Web开发中具有十分重要的作用。

    1、过滤器的介绍

    Servlet过滤器与Servlet十分相似,但它具有拦截客户端(浏览器)请求的功能,Servlet过滤器可以改变请求中的内容,来满足实际开发中的需要。对于程序开发人员而言,过滤器实质就是在Web应用服务器上的一个Web应用组件,用于拦截客户端(浏览器)与目标资源的请求,并对这些请求进行一定过滤处理再发送给目标资源,过滤器的处理方式如下图所示。

    在Web服务器中部署了过滤器以后,不仅客户端发送的请求会经过过滤器的处理,而且请求在发送到目标资源处理以后,请求的回应信息也同样要经历过滤器。如果一个Web应用中使用一个过滤器不能解决实际中的业务需要,那么可以部署多个过滤器对业务请求进行多次处理,这样做就组成了一个过滤器链。Web服务器在处理过滤器链时,将按过滤器的先后顺序对请求进行处理。

     

    2、过滤器核心对象

    过滤器对象放置在javax.servlet包中,其名称为Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象,这个两个对象也同样是接口对象,位于javax.servlet包中,分别为过滤器的配置对象与过滤器的传递工具。

    在实际开发中,定义过滤器对象只需要直接或间接地实现Filter接口即可。如上图所示中的MyFilter1过滤器与MyFilter2过滤器,而FilterConfig对象与FilterChain对象用于对过滤器的相关操作。

    2.1 Filter接口

    每一个过滤器对象都要直接或间接地实现Filter接口,在Filter接口中定义了3个方法,其方法声明及说明如下表:

    Filter接口的方法声明及说明:

    方法声明说明
    public default void init(FilterConfig filterConfig) throws ServletException过滤器初始化方法,该方法在过滤器初始化时调用。
    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException
    对请求进行过滤处理。
    public default void destroy()销毁方法,以便释放资源。

    2.2 FilterConfig接口

    FilterConfig接口由Servlet容器进行实现,主要用于获取过滤器中的配置信息,其方法声明及说明如下表:

    FilterConfig接口的方法声明及说明:

    方法声明说明
    public String getFilterName()用于获取过滤器的名字。
    public ServletContext getServletContext()获取Servlet上下文。
    public String getInitParameter(String name)获取过滤器的初始化参数值。
    public Enumeration<String> getInitParameterNames()获取过滤器的所有初始化参数。

    2.3 FilterChain对象

    FilterChain对象仍然有Servlet容器进行实现,在这个接口中只有一个方法,其方法声明如下:

    public void doFilter(ServletRequest request, ServletResponse response)
                throws IOException, ServletException;

    该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器链中的最后一个过滤器,那么,请求将传送给目标资源。

     

    3、过滤器创建与配置

    示例:创建一个过滤器,实现网站访问计数器的功能,并在 web.xml 配置中将网站访问量的初始值设置为5000。

    (1)创建名称为CountFilter的类,该类实现 javax.servlet.Filter 接口,同时实现Filter接口的三个方法,是一个过滤器对象,通过该过滤器实现统计网站访问人数功能。

    package com.pjb.filter;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * 计数器过滤器
     * 
     * @author pan_junbiao
     *
     */
    public class CountFilter implements Filter
    {
    	// 来访数量
    	private int count;
    
    	// 初始化方法
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException
    	{
    		String param = filterConfig.getInitParameter("count"); // 获取初始化参数
    		count = Integer.valueOf(param); // 将字符串转换为int类型
    	}
    
    	// 过滤处理方法
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException
    	{
    		count++;
    		// 将ServletResponse对象转换成HttpServletRequest
    		HttpServletRequest req = (HttpServletRequest) request;
    		// 获取ServletContext
    		ServletContext context = req.getServletContext();
    		// 将来访数量保存到ServletContext对象中
    		context.setAttribute("count", count);
    		// 向下传递过滤器
    		chain.doFilter(request, response);
    	}
    
    	// 销毁方法
    	@Override
    	public void destroy()
    	{
    		// 释放资源
    	}
    
    }
    

    (2)过滤器的配置主要分为两个步骤,分别为:声明过滤器对象、创建过滤器映射。

    配置已创建的CountFilter对象,此操作通过配置web.xml文件进行实现。

    <!-- 过滤器声明 -->
    <filter>
    	<!-- 过滤器的名称 -->
    	<filter-name>CountFilter</filter-name>
    	<!-- 过滤器的完整类名 -->
    	<filter-class>com.pjb.filter.CountFilter</filter-class>
    	<!-- 设置初始化参数 -->
    	<init-param>
    		<!-- 参数名 -->
    		<param-name>count</param-name>
    		<!-- 参数值 -->
    		<param-value>5000</param-value>
    	</init-param>
    </filter>
    
    <!-- 过滤器映射 -->
    <filter-mapping>
    	<!-- 过滤器名称 -->
    	<filter-name>CountFilter</filter-name>
    	<!-- 过滤器URL映射 -->
    	<url-pattern>/index.jsp</url-pattern>
    </filter-mapping>

    <filter>标签用于声明过滤器对象,在这个标签中必须配置两个子元素,分别为过滤器的名称与过滤器完整类名,其中:

    <filter-name>子标签:用于定义过滤器的名称。

    <filter-class>子标签:用于指定过滤器的完整类名。

    <init-param>子标签:用于指定过滤器的初始化参数,非必填项。

    <filter-mapping>标签用于创建过滤器的映射,它的主要作用就是指定Web应用中,哪些URL应用哪一个过滤器进行处理。在<filter-mapping>标签中需要指定过滤器的名称与过滤器的URL映射,其中:

    <filter-name>子标签:用于定义过滤器的名称,它需要与<filter>标签中的<filter-name>一一对应。

    <url-pattern>子标签:用于指定过滤器应用的URL。

    问题:如何匹配所有页面的请求?

    答:使用 “/*” 来匹配所有页面的请求。在 web.xml 文件中配置过滤器,其过滤器的URL映射可以使用正则表达进行配置。

    (3)创建程序中的首页 index.jsp ,在该页面中通过JSP内置对象 Application 获取计数器的值。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>人数统计</title>
    </head>
    <body>
    	<h2>欢迎访问 pan_junbiao的博客</h2>
    	您是本站的第【
    		<%= application.getAttribute("count") %>
    	】位访客!
    </body>
    </html>

    执行结果:

    由于在 web.xml 文件中将计数器的初始值设置为5000,所以实例运行后,计数器的数值变为大于5000的数,在多次刷新页面后,计数器的数值会跟着变大。

     

    4、Servlet3.0新特性

    4.1 @WebFilter注释

    在Servlet3.0中新增了@WebFilter注释,通过使用该注释就无需在web.xml文件中对过滤器进行配置。@WebFilter注释用于声明过滤器,该注释将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。

    @WebFilter注释主要属性列表:

    属性名类型描述
    filterNameString指定过滤器的name属性,等价于<filter-name>标签。
    valueString[]该属性等价于urlPatterns属性,但是两者不应该同时使用。
    urlPatternsString[]指定一组过滤器的URL匹配模式,等价于<url-pattern>标签。
    servletNamesString[]指定过滤器将应用于哪些Servlet,是@WebServlet中的name属性的取值,或者是web.xml文件中的<servlet-name>标签的取值。
    initParamsWebInitParam[]指定一组过滤器初始化参数,等价于<init-param>标签。
    asyncSupportedboolean声明过滤器是否支持异步操作模式,等价于<async-supported>标签。
    descriptionString该过滤器的描述信息,等价于<description>标签。
    displayNameString该过滤器的显示名,通常配合工具使用,等价于<display-name>标签。
    dispatcherTypesDispatcherType[]指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE 和 REQUEST。

    4.2 @WebInitParam注释

    @WebInitParam注释等价于web.xml文件中的<servlet>和<filter>的<init-param>子标签,该注释通常不单独使用,而是配合@WebServlet或者@WebFilter使用。

    @WebInitParam注释主要属性列表:

    属性名类型描述
    nameString指定参数的名字,等价于<param-name>标签,必填项。
    valueString指定参数的值,等价于<param-value>标签,必填项。
    descriptionString关于参数的描述,等价于<description>标签,非必填项。

    示例:创建过滤器,使用@WebFilter注释和@WebInitParam注释进行配置。

    /**
     * 计数器过滤器
     * 
     * @author pan_junbiao
     *
     */
    @WebFilter(filterName = "CountFilter", urlPatterns = "/index.jsp", 
    initParams = { @WebInitParam(name = "count", value = "5000") })
    public class CountFilter implements Filter
    {
    	// 省略了过滤器中间的代码
    }

    如此配置之后,就不需要在 web.xml 文件中配置相应的<filter>、<filter-mapping>和<init-param>元素了,容器会在部署时根据指定的属性将该类发布为过滤器。使用@WebFilter注释,等价于在 web.xml 文件中进行如下配置:

    <filter>
      <filter-name>CountFilter</filter-name>
      <filter-class>com.pjb.filter.CountFilter</filter-class>
      <init-param>
        <param-name>count</param-name>
        <param-value>5000</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>CountFilter</filter-name>
      <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>

     

    5、字符编码过滤器

    在Java Web程序开发中,由于Web容器内部所使用编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据,就会出现乱码现象。如下图:

    由于Web容器使用了ISO-8859-1的编码格式,所以在Web应用的业务处理中也会使用ISO-8859-1的编码格式。虽然浏览器提交的使用的是中文编码格式UTF-8,但经过业务处理中的ISO-8859-1编码,仍然会出现中文乱码现象。解决此问题的方法非常简单,在业务处理中重新指定中文字符集进行编码即可解决。在实际开发过程中,如果通过每一个业务处理指定中文字符集编码,则操作过于烦琐,而且容易遗漏某一个业务中的字符编码设置;如果通过过滤器来处理字符编码,就可以做到简单又万无一失。

    示例:实现图书信息的添加功能,并创建字符编码过滤器,避免中文乱码现象的产生。

    (1)创建字符编码过滤器对象,其名称为CharactorFilter类。该类实现了 javax.servlet.Filter 接口,并在doFilter()方法中对请求中的字符编码进行设置。

    package com.pjb.filter;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    
    /**
     * 字符编码过滤器
     * 
     * @author pan_junbiao
     */
    @WebFilter(filterName = "CharactorFilter", urlPatterns = "/*", 
    initParams = { @WebInitParam(name = "encoding", value = "UTF-8") })
    public class CharactorFilter implements Filter
    {
    	// 字符编码
    	String encoding = null;
    
    	// 初始化方法
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException
    	{
    		// 获取初始化参数
    		encoding = filterConfig.getInitParameter("encoding");
    	}
    
    	// 过滤处理方法
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException
    	{
    		// 判断字符编码是否为空
    		if (encoding != null)
    		{
    			// 设置request的编码格式
    			request.setCharacterEncoding(encoding);
    			// 设置response字符编码
    			response.setContentType("text/html; charset=" + encoding);
    		}
    		// 传递给下一过滤器
    		chain.doFilter(request, response);
    	}
    
    	// 销毁方法
    	@Override
    	public void destroy()
    	{
    		encoding = null;
    	}
    }
    

    (2)创建名称为AddServlet的类,该类继承 HttpServlet,是处理添加图书信息请求的Servlet对象。

    package com.pjb.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 添加图书信息请求的Servlet类
     * 
     * @author pan_junbiao
     *
     */
    @WebServlet(name = "AddServlet", urlPatterns = "/servlet/AddServlet")
    public class AddServlet extends HttpServlet
    {
    	private static final long serialVersionUID = 1L;
    
    	// 处理GET请求
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doPost(request, response);
    	}
    
    	// 处理POST请求
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		// 获取 PrintWriter
    		PrintWriter out = response.getWriter();
    		// 获取图书编号
    		String id = request.getParameter("id");
    		// 获取名称
    		String name = request.getParameter("name");
    		// 获取作者
    		String author = request.getParameter("author");
    		// 获取价格
    		String price = request.getParameter("price");
    		// 输出图书信息
    		out.print("<h2>图书信息添加成功</h2><hr>");
    		out.print("图书编号:" + id + "<br>");
    		out.print("图书名称:" + name + "<br>");
    		out.print("作者:" + author + "<br>");
    		out.print("价格:" + price + "<br>");
    		// 刷新流
    		out.flush();
    		// 关闭流
    		out.close();
    	}
    }
    

    (3)创建名称为AddBook.jsp的页面,该页面主要用于放置添加图书信息的表单。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>添加图书信息</title>
    </head>
    <body>
    	<form action="servlet/AddServlet" method="post">
    		<table align="center" border="1" width="350">
    			<tr>
    				<td class="2" align="center" colspan="2">
    					<h2>添加图书信息</h2>
    				</td>
    			</tr>
    			<tr>
    				<td align="right">图书编号:</td>
    				<td>
    					<input type="text" name="id">
    				</td>
    			</tr>
    			<tr>
    				<td align="right">图书名称:</td>
    				<td>
    					<input type="text" name="name">
    				</td>
    			</tr>
    			<tr>
    				<td align="right">作  者:</td>
    				<td>
    					<input type="text" name="author">
    				</td>
    			</tr>
    			<tr>
    				<td align="right">价  格:</td>
    				<td>
    					<input type="text" name="price">
    				</td>
    			</tr>
    			<tr>
    				<td class="2" align="center" colspan="2">
    					<input type="submit" value="添 加">
    				</td>
    			</tr>
    		</table>
    	</form>
    </body>
    </html>

    执行结果:

    (1)添加图书信息:

    (2)显示图示信息:

     

    展开全文
  • Filter 技术是servlet 2.3 新增加的功能.servlet2.3是sun公司与2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.由于众多的参与者的共同努力,servlet2.3比以往功能都...
  • servlet过滤器和监听器,servlet过滤器和监听器课件,servlet过滤器和监听器PPT
  • servlet过滤器实例经典过滤器

    热门讨论 2011-11-05 20:25:24
    servlet过滤器实例经典过滤器,手把手交你配置过滤器,五大常用过滤器源码,走过路过的同事们注意了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  • Servlet过滤器简介 Servlet过滤器实际上就是一个标准的java类,这个类通过实现Filter接口获得过滤器的功能。它在jsp容器启动的时候通过web.xml配置文件被系统加载。Servlet过滤器在接收到用户请求的时候被调用,当...
  • Step_1:Servlet过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的 3个方法。其中过滤器中的init()方法用于对过滤器的初始值进行处理,destory()方法是过滤器的销毁方法...

    Step_1:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的 3个方法。其中过滤器中的init()方法用于对过滤器的初始值进行处理,destory()方法是过滤器的销毁方法,主要用于释放资源,对于过滤处理的业务逻辑需要编写到doFilter()方法中,在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一个过滤器或者目标资源。

    (过滤器和Servlet十分相似哟,在创建之后同样需要对其进行配置,过滤器的配置主要分为两个步骤,分别位声明过滤器和创建过滤器映射)

    Step_2:过滤器的配置简单说下,分为两个步骤,一是声明过滤器对象,二是创建过滤器映射。

    <---------------------------------------------------------------------------------------------------------------------------------------------------------------------->

     <!-- 过滤器声明 -->
     
    <filter>
         <filter-name>
    CountFilter</filter-name><!-- 过滤器名称 -->
         <filter-class>
    com.filter.CountFilter</filter-class><!-- 过滤器的完整类名 -->
         <init-param>
            <param-name>
    count</param-name>
            <param-value>
    5000</param-value>
         </init-param>
      </filter>
      <!-- 过滤器的映射 -->
      <filter-mapping>
         <!-- 过滤器的名字 -->
         <filter-name>
    CountFilter</filter-name>
         <!-- 过滤器的URL映射 -->
         <url-pattern>
    /index.jsp</url-pattern>
      </filter-mapping>

    <---------------------------------------------------------------------------------------------------------------------------------------------------------------------->

    下面我们以项目为例,创建一个filter过滤器,对网页来访量进行统计。




    <---------------------------------------------------------------------------------------------------------------------------------------------------------------------->

    项目结构如下图所示:


    <---------------------------------------------------------------------------------------------------------------------------------------------------------------------->

    web.xml文件中filter过滤器的配置


    <---------------------------------------------------------------------------------------------------------------------------------------------------------------------->

    CountFilter类的逻辑处理



    <---------------------------------------------------------------------------------------------------------------------------------------------------------------------->

    前端页面index.jsp的编写


    <---------------------------------------------------------------------------------------------------------------------------------------------------------------------->

    运行结果如下:




    展开全文
  • 过滤器来验证用户是否登录
  • Servlet过滤器使用

    2013-11-02 17:25:01
    Servlet过滤器,主要配置了中文乱码及登陆验证过滤器。 代码简单明了,易学。 过滤器实现类 1、Filter接口:所有的Servlet过滤器类都必须实现javax.servlet.Filter接口 a、init(FilterConfig): 这是Servlet...
  • Servlet 过滤器

    2008-12-09 16:28:37
    Servlet 过滤器可以应用在客户机和 servlet 之间、servletservlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间
  • servlet过滤器

    2011-06-02 11:40:00
    Servlet过滤器基础 Servlet过滤器是Servlet的一种特殊用法,主要用来完成一些通用的操作。比如编码的过滤,判断用户的登陆状态等等。Servlet过滤器的适用场合: A.认证过滤 B.登录和审核过滤 C.图像转换...

    1. Servlet过滤器基础 Servlet过滤器是Servlet的一种特殊用法,主要用来完成一些通用的操作。比如编码的过滤,判断用户的登陆状态等等。Servlet过滤器的适用场合: A.认证过滤 B.登录和审核过滤 C.图像转换过滤 D.数据压缩过滤 E.加密过滤 F.令牌过滤 G.资源访问触发事件过滤 Servlet过滤器接口的构成: 所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法: 方法 说明 init(FilterConfig cfg) 这是Servlet过滤器的初始化方法,性质等同与servlet的init方法。 doFilter(ServletRequest,ServletResponse,FilterChain) 完成实际的过滤操作,当请求访问过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器 destroy() Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。,性质等同与servlet的destory()方法。 Servlet过滤器的创建步骤: A.实现javax.servlet.Filter接口的servlet类 B.实现init方法,读取过滤器的初始化函数 C.实现doFilter方法,完成对请求或过滤的响应 D.调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应 F.在web.xml中配置Filter 2.使用过滤器处理中文问题 当用用户登陆页面输入帐号时,如果输入是中文,后台servlet再次输出这个内容时,可能就会是乱码,这是因为serlvet中默认是以ISO- 8859-1格式编码的,如果后台有多个Servlet,多个参数,这样就不合适,这个问题,我们可以通过一个过滤器统一解决,使后台的输出输出都支持中文!将ISO-8859-1转码为GBK的那段代码! 3.使用过滤器认证用户: 每个过滤器也可以配置初始化参数,可以将不需要过滤的地址配置到这个Filter的配置参数中,过滤时,如果请求地址在配置参数中,则放行,这样就避免了在程序中硬编码。每个Filter中初始化时,都可以得到配置对象,在Filter中配置二个不需要过滤的地址,一个是登陆页面,一个是执行登陆认证的 servlet; 4.Servlet监听器 类似与Swing界面应用开发,Servlet也可以创建监听器,以对Servlet容器,或Servlet中以象的事件做出反应。Servlet监听器主要有以下几种: ServletRequestListener ,ServletRequestAttributeListener, HttpSessionActivationListener ,HttpSessionBindingListener , HttpSessionAttributeListener,HttpSessionListener, ServletContextListener等等。 这些监听器主要用来监听session,request,application这三个对象里存取数据的变化。

     

    转自:http://hi.baidu.com/haodj33311/blog/item/3fb8171f601e3c71f724e44d.html

    展开全文
  • Servlet过滤器大全

    2008-10-05 16:48:27
    Servlet过滤器大全,各种过滤器的写法
  • 其实就是使用过滤器,在逻辑层加上一个过滤器来实现登录状态的校验,然后再将信息跳转到指定的界面或者Servlet。 我们先来分析下具体的使用流程: 假如用户处于登录状态则用户可以访问指定的网页,没有登录的用户...
    使用过滤器来校验用户的登录状态,
    在有些情况下,网站的部分网页是需要登录的用户才能访问的,那么该如何实现呢?
    其实就是使用过滤器,在逻辑层加上一个过滤器来实现登录状态的校验,然后再将信息跳转到指定的界面或者Servlet。

    我们先来分析下具体的使用流程:
    假如用户处于登录状态则用户可以访问指定的网页,没有登录的用户相要访问这个网页则直接跳转到登录界面。
    流程图如下:

    我们先来编写hello.jsp文件,即用户想要访问的目标文件,
    只需让其显示简单的信息即可
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        out.println("Hello World");
    %>
    </body>
    </html>
    

    我们首先现将所有的界面程序编写完毕,
    下面我们来编写login.jsp文件
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登陆页面</title>
    </head>
    <style type="text/css">
        body{
            color: #000;
            font-size: 14px;
            margin: 20px auto;
        }
    </style>
    <script type="text/javascript">
        function check(form) {
            //验证用户名是否为空
            if (document.forms.loginform.uname.value==""){
                alert("请输入用户名");
                //将焦点置于用户名输入框
                document.forms.loginform.uname.focus();
                return false;
            }
            //验证密码是否为空
            if (document.forms.loginform.upwd.value==""){
                alert("请输入用户名");
                //将焦点置于用户名输入框
                document.forms.loginform.upwd.focus();
                return false;
            }
        }
    </script>
    <body>
        <form action="<%=request.getContextPath()%>/LoginServlet17" method="post" name="loginform">
            <%if (request.getAttribute("return_uri")!=null){%>
            <input type="hidden" name="return_uri" value="<%=request.getAttribute("return_uri")%>"/>
            <%}%>
            <table border="1" cellspacing="0" cellpadding="5" bordercolor="silver" align="center">
                <tr>
                    <td colspan="2" align="center" bgcolor="#E8E8E8">用户登录</td>
                </tr>
                <tr>
                    <td>用户名:</td>
                    <td><input type="text" name="uname"></td>
                </tr>
                <tr>
                    <td>密码:</td>
                    <td><input type="password" name="upwd"></td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" name="submit" οnclick="return check(this);">
                        <input type="reset" name="reset">
                    </td>
                </tr>
            </table>
        </form>
    </body>
    </html>
    

    我们得在文件目录下设置一个主文件,即index.jsp文件

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>首页</title>
    </head>
    <body>
    首页
    <br/>
    <br/>
    <a href="<%=request.getContextPath()%>/17/hello.jsp">hello.jsp</a>
    <br/>
    <%
        String flag="";
        Object object=session.getAttribute("flag");
        if (object!=null){
            flag=object.toString();
        }
        if (flag.equals("login_success")){
    %>
    <a href="<%=request.getContextPath()%>/LogoutServlet17">退出</a>
    <%}else{%>
    <a href="<%=request.getContextPath()%>/17/login.jsp">登录</a>
    <%}%>
    </body>
    </html>
    




    我们处理完了表现层的代码编写,那么我们就来编写下逻辑层的Servlet程序。

    首先我们需要一个来校验用户名和密码是否正确的登录逻辑处理功能,
    LoginServlet17

    public class LoginServlet17 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String uname=request.getParameter("uname");
            String upwd=request.getParameter("upwd");
            //用户访问登录页面之前所访问的页面,
            // 通过这个值可以在用户登录成功之后跳转到登录之前的界面
            String returnUri=request.getParameter("return_uri");
    
            System.out.println("用户名:==》"+uname);
            System.out.println("密  码:==》"+upwd);
            System.out.println("Return Uri:==》"+returnUri);
    
            //判断用户名和密码是否为空
            //用户名和密码都不为空则执行登录逻辑
            RequestDispatcher rd=null;
            if (uname==null||upwd==null){
                request.setAttribute("msg","用户名或密码为空!!!");
                rd=request.getRequestDispatcher("/17/login.jsp");
                rd.forward(request,response);
            }else{
                if (uname.equals("王鑫")&&upwd.equals("123456")){
                    //如果登录成功,则在用户的session对象中保存一个kvflag,值为login_success
                    request.getSession().setAttribute("flag","login_success");
                    //假如用户登录前界面不为空,则跳转到用户登录前界面
                    //若用户登录前界面为空,则跳转到首页
                    if (returnUri!=null){
                        rd=request.getRequestDispatcher(returnUri);
                        rd.forward(request,response);
                    }else{
                        rd=request.getRequestDispatcher("/17/index.jsp");
                        rd.forward(request,response);
                    }
                }else{
                    request.getSession().setAttribute("flag","login_error");
                    request.setAttribute("msg","用户名或密码输入错误!!!");
                    rd=request.getRequestDispatcher("/17/login.jsp");
                    rd.forward(request,response);
    
                }
    
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
        }
    }
    

    在这里我们获取了用户在登录界面之前所访问的界面,因为在登录成功之后是要将页面重新跳转到用户登录之前的界面的。这个值我们会在过滤器中设置。

    除了登录的处理之外,我们还需对登出进行处理,因为我们获取到了用户登录成功后的Session对象信息,所以我们得在登出程序中将Session对象的信息清除掉。并将界面跳转到首页中去。
    登出程序LogoutServlet
    public class LogoutServlet17 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //直接删除session对象
            request.getSession().invalidate();
            //重定向到首页
            response.sendRedirect(request.getContextPath()+"/17/index.jsp");
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
        }
    }
    




    接下来便是我们最重要的过滤器的设置

    首先我们得明确过滤器所需实现的功能:
    1.我们得明确用户想要访问的界面是什么?
    2.当确定用户所要访问的界面是需要登录权限的那个界面,则需要判断用户目前的登录状态。
    3.当用户未登录或者登录发生错误的话则需将界面跳转到登录界面。

    好了,在明确了过滤器所需完成的功能后便可以来实现了。
    public class PermissionFilter implements Filter {
        public void init(FilterConfig config) throws ServletException {
    
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            //首先将参数中的ServletRequest和ServletResponse强转为Http...
            HttpServletRequest hreq= (HttpServletRequest) req;
            HttpServletResponse hresp= (HttpServletResponse) resp;
    
            //获取请求中的Servletpath
            String servletpath=hreq.getServletPath();
            //获取session对象
            HttpSession hsess=hreq.getSession();
            //获取session对象中flag的值,强转为String类型
            String flag= (String) hsess.getAttribute("flag");
    
            //如果用户登录的是首页或者是login或者是执行登录操作的话
            // 将请求直接转发给下一个组件进行处理
            //对于其他请求则都进行权限校验
            if (servletpath!=null&&(servletpath.equals("/17/index.jsp"))||
                    (servletpath.equals("/17/login.jsp"))||
                    (servletpath.equals("/LoginServlet17"))){
    
                chain.doFilter(req, resp);
            }else{
                //用户处于登录状态则可以直接进行访问
                if (flag!=null&&flag.equals("login_success")){
                    chain.doFilter(req, resp);
                    //登录失败,则跳转到登录界面
                }else if (flag!=null&&flag.equals("login_error")){
                    hreq.setAttribute("msg","登录失败,请重新登录!!!<br/>");
                    hreq.setAttribute("return_uri",servletpath);
                    RequestDispatcher rd=hreq.getRequestDispatcher("/17/login.jsp");
                    rd.forward(hreq,hresp);
                    //没有登录则也跳转到login.jsp界面,并提示“您尚未登录!!!”
                }else {
                    hreq.setAttribute("msg","您尚未登录!!!");
                    hreq.setAttribute("return_uri",servletpath);
                    RequestDispatcher rd=hreq.getRequestDispatcher("/17/login.jsp");
                    rd.forward(hreq,hresp);
                }
            }
        }
    
        public void destroy() {
        }
    
    }
    



    在这里我们得明确servletrequest和httpservletrequest 区别?

    HttpServletRequest继承ServletRequest,Servlet里有doGet、doPost方法 ,没有doPut方法,是和form的get post对应的.
    servletRequest是接口,httpServletRequest是实现,但是有些方法是httpServletRequest独有的,比如getSession().。
    HttpServletRequest接口是继承自ServletRequest接口的。增加了和HTTP相关的一些方法。
    而所谓的request(在JSP中使用的)其实只是规范中的一个名称而已。它当然是一个对象,但并不是SUN提供的,这是由各个不同的Servlet提供商编写的,SUN只是规定这个类要实现HttpServletRequest接口,并且规定了各个方法的用途,但具体是什么类是由各个提供商自己决定的。


    web.xml中的配置信息如下:
    <servlet>
        <servlet-name>LoginServlet17</servlet-name>
        <servlet-class>com.icarus.servlet.LoginServlet17</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet17</servlet-name>
        <url-pattern>/LoginServlet17</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>LogoutServlet17</servlet-name>
        <servlet-class>com.icarus.servlet.LogoutServlet17</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet17</servlet-name>
        <url-pattern>/LogoutServlet17</url-pattern>
    </servlet-mapping>
    
    <filter>
        <filter-name>PermissionFilter</filter-name>
        <filter-class>com.icarus.filter.PermissionFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PermissionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <session-config>
    

    目前为止,Jsp和Servlet的学习就到此告一段落,接下来便是学习Spring等java框架了。
    加油!!!



    源码下载地址: https://github.com/icaruswang/StudyJsp

    展开全文
  • Servlet 编写过滤器

    2021-01-03 01:54:23
    Servlet 编写过滤器 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 ServletServlet 过滤器也可以附加到 Java...
  • servlet 过滤器例子 filterservlet 过滤器例子 filterservlet 过滤器例子 filter 如果是action 则需要改动url patten
  • servlet过滤器详解

    千次阅读 2014-02-01 22:51:50
    一、什么是Servlet过滤器 过滤器是在数据交互之间过滤数据的中间组件,独立于任何平台或者 Servlet 容器。 Servlet过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间,以及所包括的...
  • 初识Servlet过滤器

    千次阅读 2016-07-10 21:19:13
    Servlet过滤器主要用于过滤客户端的请求,可以改变请求中的内容来满足实际开发的需要,然后将过滤后的请求转交给下一资源。 在Web容器中部署了过滤器后,不仅客户端发送的请求会经过过滤器的处理,而且请求在发送到...
  • servlet过滤器和监听器

    千次阅读 2018-08-03 17:13:26
    顾名思义是起到过滤的作用,所有的请求在真正到达servlet之前都会首先经过过滤器过滤一遍。过滤器也是Servlet的一种,因此也有init和destroy方法,还有一个服务方法,只是这里提供的服务是过滤; 一个Servlet要想...
  • 主要为大家详细介绍了servlet+jsp实现过滤器,防止用户未登录访问,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • servlet过滤器Filter入门

    2009-11-25 18:37:00
    servlet过滤器Filter入门,Servle过滤器的使用是Servlet中的重要内容,此文档就是针对此内容编写的。
  • Servlet 过滤器和监听器

    千次阅读 2016-10-20 17:33:00
    过滤器的定义 过滤器的工作原理 过滤器两种配置方法 过滤器示例 FilterConfig 使用 示例 Servlet 监听器 Servlet 上下文监听 示例 综合实例-编写一个字符编码过滤器过滤器的定义过滤器是一个服务器端的组件,它主要...
  • jsp+servlet登录验证过滤器jsp+servlet登录验证过滤器jsp+servlet登录验证过滤器
  • JSP详细篇——Servlet过滤器和监听器

    千次阅读 2014-11-26 23:38:18
    Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强,监听器可以监听到Web应用程序启动和关闭。创建监听器需要实现响应的接口,并对其进行配置。 Servlet过滤器 1.什么是过滤器 ...
  • Servlet过滤器与SpringMVC拦截器

    千次阅读 2017-03-30 22:09:02
    Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。 通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,...Servlet过滤器和SpringM
  • 常用Servlet过滤器

    千次阅读 2017-03-12 11:04:05
    过滤器应用案例一:解决POST请求参数中文和输出中文的乱码过滤器过滤器代码package com.study.java.filter;import java.io.IOException;import javax.servlet.Filter; import javax.servlet.FilterChain; import ...
  • JSP页面实现servlet过滤器与servlet监听器(JSP中级技术) 一、servlet过滤器 我们将会探讨…. 1、什么是servlet过滤器 2、servlet过滤器的开发步骤 3、实例 1、什么是servlet过滤器 • servlet 过滤器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,843
精华内容 55,137
关键字:

servlet过滤器未登录