www.91084.com

GVKun编程网logo

详解JavaWeb中的过滤器Filter" + message + "(javaweb过滤器的作用)

17

本篇文章给大家谈谈详解JavaWeb中的过滤器Filter"+message+",以及javaweb过滤器的作用的知识点,同时本文还将给你拓展Angular.Js中过滤器filter与自定义过滤器fi

本篇文章给大家谈谈详解JavaWeb中的过滤器Filter" + message + ",以及javaweb过滤器的作用的知识点,同时本文还将给你拓展Angular.Js中过滤器filter与自定义过滤器filter实例详解、Filter---javaweb的过滤器、Filter过滤器-JavaWeb三大组件之一、java web 中用于检测用户是否登陆的过滤器 (Filter - 3)等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

详解JavaWeb中的过滤器Filter

详解JavaWeb中的过滤器Filter" + message + "(javaweb过滤器的作用)

今天给大家讲一下JavaWeb中的过滤器Filter,文中有非常详细的代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下

目录

一、什么是过滤器

1.1 使用步骤

二、初体验

2.1 mynav.html

2.2 FilterServlet程序

2.3 HelloServlet程序

2.4 web.xml

2.5 index.jsp

三、测试

四、Filter的生命周期

五、FilterConfig类

六、FilterChain过滤器链

七、Filter 的拦截路径

八、精确匹配

8.1 目录匹配

8.2 后缀名匹配

一、什么是过滤器

1.Filter过滤器的作用:拦截请求

2.拦截请求常见场景:

(1)权限检查

(2)日记操作

(3)事务管理

 

1.1 使用步骤

Filter 过滤器的使用步骤:

1、编写一个类去实现Filter 接口

2、实现过滤方法doFilter()

3、到web.xml 中去配置Filter 的拦截路径

二、初体验

web工程下新建一个admin目录,作为需要权限才能访问的目录,其中有两个文件

2.1 mynav.html

导航

百度

Google

必应

2.2 FilterServlet程序

package com.filter.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; /** * @author ningqian * @create -05-16 20:17 */ //注意导包是javax public class FilterServlet implements Filter { @Override public void init(FilterConfig filterConfig) throws servletexception { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, servletexception { System.out.println("来到Filter过滤器"); HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; HttpSession session = httpServletRequest.getSession(); //如果session的属性user为空,转发到首页 if(session.getAttribute("user")==null){ servletRequest.getRequestdispatcher("/index.jsp").forward(servletRequest,servletResponse); } else{//如果session的属性user不为空,则放行 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void destroy() { } }

2.3 HelloServlet程序

package com.filter.filter; import java.io.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { private String message; public void init() { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println(""); out.println("

" + message + "

"); out.println(""); HttpSession session = request.getSession(); session.setAttribute("user","ningqian"); } public void destroy() { } }

2.4 web.xml

FilterServletcom.filter.filter.FilterServletFilterServlet/admin/*HelloServletcom.filter.filter.HelloServletHelloServlet/hello

2.5 index.jsp

FilterServletcom.filter.filter.FilterServletFilterServlet/admin/*HelloServletcom.filter.filter.HelloServletHelloServlet/hello

三、测试

1.启动服务器

2.在浏览器地址栏输入:http:localhost:8080/filter/admin/1.jpg

表示直接访问admin目录下的图片

由于此目录下的文件在web.xml中配置为受限,所以此时请求被FilterServlet收到,使用doFilter方法进行请求过滤检查,发现会话session中没有user属性,所以将该请求转发到index.jsp

3.在浏览器地址栏输入:http:localhost:8080/filter/

首页不在受限的目录下,所以可以直接访问,点击页面上的链接Hello Servlet,此时,将请求发到服务器,HelloServlet程序接收,通过doGet()方法,给会话session的user赋值

4.再次在浏览器输入:http:localhost:8080/filter/admin/1.jpg,此时就可以正常访问。

四、Filter的生命周期

Filter 的生命周期包含几个方法

1、构造器方法

2、init 初始化方法

第1,2 步,在web 工程启动的时候执行(Filter 已经创建)

3、doFilter 过滤方法

第3 步,每次拦截到请求,就会执行

4、destroy 销毁

第4 步,停止web 工程的时候,就会执行(停止web 工程,也会销毁Filter 过滤器)

五、FilterConfig类

FilterConfig 类见名知义,它是Filter 过滤器的配置文件类。

Tomcat 每次创建Filter 的时候,也会同时创建一个FilterConfig 类,这里包含了Filter 配置文件的配置信息。

FilterConfig 类的作用是获取filter 过滤器的配置内容

1、获取Filter 的名称filter-name 的内容:filterConfig.getFilterName()

2、获取在Filter 中配置的init-param 初始化参数(在web.xml中配置):filterConfig.getinitParameter(“username”)

3、获取ServletContext 对象:filterConfig.getServletContext()

AdminFiltercom.atguigu.filter.AdminFilterusernamerooturljdbc:MysqL://localhost3306/test

六、FilterChain过滤器链

多个过滤器

七、Filter 的拦截路径

Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!

八、精确匹配

8.1 目录匹配

/admin/*

8.2 后缀名匹配

*.html

到此这篇关于详解JavaWeb中的过滤器Filter的文章就介绍到这了,更多相关JavaWeb Filter内容请搜索小编以前的文章或继续浏览下面的相关文章希望大家以后多多支持小编!

Angular.Js中过滤器filter与自定义过滤器filter实例详解

Angular.Js中过滤器filter与自定义过滤器filter实例详解

本文主要给大家介绍了Angular.Js过滤器filter与自定义过滤器filter的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:

一、AngularJS的filter过滤器:

  • uppercase|lowercase:大小写转换过滤
  • json:json格式过滤
  • date:日期格式过滤
  • number:数字格式过滤
  • currency:货币格式过滤
  • filter:查找
  • limitTo:字符串对象截取
  • orderBy:对象排序
rush:xhtml;"> <Meta charset="UTF-8"> Angular基础

将字符串转换为大小写:

姓名为 {{ person.lastName | uppercase }}

姓名为 {{ person.lastName | lowercase }}

货币过滤:

数量:总价 = {{ (quantity * price) | currency }}

{{250 |currency:"RMB ¥"}}

按国家的字母顺序排序对象:

循环对象:

{{jsonText | json}}
{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss'}}
{{1.2345678 |number:1}}
{{ "i love tank" | limitTo:6 }}
{{ "i love tank" | limitTo:-6 }}
{{ [{"age": 20,"id": 10,"name": "iphone"},{"age": 12,"id": 11,"name": "sunm xing"},{"age": 44,"id": 12,"name": "test abc"} ] | orderBy:'id':true }}
{{ [{"age": 20,"name": "test abc"} ] | orderBy:'id' }}

按输入的字母显示对象:

输入过滤:

name筛选:

{{ [{"age": 20,"name": "sunm"},"name": "test abc"}
] | filter:{'name':'sunm'} }}

二、AngularJs的控制器使用filter

rush:xhtml;"> <Meta charset="UTF-8"> Angular基础
irstCtrl"> {{uFirstName}}
{{cPrice}}

Filter---javaweb的过滤器

Filter---javaweb的过滤器

1.Filter是什么?

  • Filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊的功能。
  • 在Servlet API中定义了三个接口类来供开发人员编写Filter程序:Filter,FilterChain,FilterConfig。
  • Filter程序是一个实现了Filter接口的java类,与servlet程序相似,它由servlet容器进行调用和执行。
  • Filter要在web.xml文件中进行注册和设置它所能拦截的资源:Filter程序可以拦截Jsp,Servlet,静态图片文件和静态html文件。

2.如何创建一个Filter?

①创建一个Filter类:实现Filter接口(与开发Servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现Filter接口。)

②在web.xml文件中配置并映射该Filter,其中url-pattern指定该Filter可以拦截哪些资源,即可以通过哪些url访问到该Filter。

<!-- 注册Filter -->
  <filter>
    <filter-name>filterTest</filter-name>
    <filter-class>com.javaweb.Filter.filterTest</filter-class>
  </filter>
  <!-- 映射Filter -->
  <filter-mapping>
    <filter-name>filterTest</filter-name>
    <url-pattern>/jspTest/includeTest1.jsp</url-pattern>
  </filter-mapping>

3.Filter相关的API

①public void init(FilterConfig filterConfig):类似于Servlet的init方法,在创建Filter对象后,立即被调用,且只被调用一次,Filter对象在Servlet容器中加载当前web应用时即被创建,即Filter实例是单例的。

FilterConfig类似于ServletConfig;可以在web.xml文件中配置当前Filter的初始化参数,配置方式和servlet的配置方式类似。

<filter>
    <filter-name>filterTest</filter-name>
    <filter-class>com.javaweb.Filter.filterTest</filter-class>
    <init-param>
      <param-name>name</param-name>
      <param-value>root</param-value>
    </init-param>
  </filter>

②public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

真正Filter的逻辑代码需要编写在该方法中,每次拦截都会调用该方法。

FilterChain:Filter链,多个Filter可以构成一个Filter链。

doFilter(ServletRequest request, ServletResponse response):把请求传给Filter链的下一个Filter,若当前Filter是Filter链的最后一个Filter,将把请求给目标Servlet或jsp。

多个Filter拦截的顺序和<filter-mapping>配置的顺序有关,靠前的先被调用。

③public void destroy():释放当前Filter所占用的资源的方法。在Filter被销毁之前被调用,且只被调用一次。

4.示例代码

实现的功能:

①login.jsp请求提交到hello.jsp。该页面中有两个text,分别为username和password。

②userNameFilter,passWordFilter拦截login.jsp的请求页面,即hello.jsp。

③userNameFilter:若username不等于Tom,则将请求转发给login.jsp,并提示用户名不正确,若等于“Tom”,则把请求转发给下一个Filter(使用FilterChain实现)。

④passWordFilter:若password不等于1234,则将请求转发到login.jsp,并提示密码不正确,若等于1234,则把请求转发到目标页面。

登录页面:login.jsp

<body>
    <font color="red">${requestScope.message}</font>
    <br><br>
    <form action="http://localhost:8080/MyWebProject/jspTest/hello.jsp" method="post">
      username:<input type="text" name="username"/>
      password:<input type="password" name="password"/>
      <input type="submit" value="Submit" />
    </form>
  </body>

登录成功跳转的页面:hello.jsp

<body>
    hello,${param.username}
</body>

 用户名不正确拦截的Filter实现:userNameFilter.java

package com.javaweb.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;

public class userNameFilter implements Filter {
    @Override
    public void destroy() {
        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String initUser=filterconfig.getInitParameter("username");
        String username=request.getParameter("username");
        if(!initUser.equals(username)){
            request.setAttribute("message","用户名不正确");
            //request.getAttribute("message");
            request.getRequestDispatcher("/jspTest/login.jsp").forward(request,response);
            return;
        }
        chain.doFilter(request,response);

    }
    private FilterConfig filterconfig;
    @Override
    public void init(FilterConfig filterconfig) throws ServletException {
        this.filterconfig=filterconfig;

    }

}

密码不正确拦截的实现功能:passWordFilter.java

package com.javaweb.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;

public class passWordFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String initPassWord=filterconfig.getServletContext().getInitParameter("password");
        String password=request.getParameter("password");
        if(!initPassWord.equals(password)){
            request.setAttribute("message","密码不正确");
            //request.getAttribute("message");
            request.getRequestDispatcher("/jspTest/login.jsp").forward(request,response);
            return;
        }
        chain.doFilter(request,response);
    }
    private FilterConfig filterconfig;
    @Override
    public void init(FilterConfig filterconfig) throws ServletException {
        this.filterconfig=filterconfig;
    }
}

在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">
  <context-param>
    <param-name>password</param-name>
    <param-value>1234</param-value>
  </context-param>
    <filter>
    <filter-name>userNameFilter</filter-name>
    <filter-class>com.javaweb.Filter.userNameFilter</filter-class>
    <init-param>
      <param-name>username</param-name>
      <param-value>Tom</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>userNameFilter</filter-name>
    <url-pattern>/jspTest/hello.jsp</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>passWordFilter</filter-name>
    <filter-class>com.javaweb.Filter.passWordFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>passWordFilter</filter-name>
    <url-pattern>/jspTest/hello.jsp</url-pattern>
  </filter-mapping>
</web-app>

注意:EL表达式中,param和requestScope的区别。

在看param和requestScope之前,不妨先了解下request:

1. request对象通常用来接收客户端提交到服务端的数据,如:在servlet或者action中可以用request.getParameter()的方法获取获取参数内容;

2. requestScope通常是在servlet或者action的服务端中通过request.setAttribute()方法把数据放到request对象中供客户端获取,然后客户端获取的方法就是requestScope.getAttribute()。

1. getParameter:

可以获取URL中传递过来的String参数,如:http://www.baidu.com?username=abc 中的abc;

提示:对于POST/GET提交的表单,在服务器端我们都可以通过request.getParameter获取表单中的值。

当我们在进行一个请求重定向(redirect)的时候,我们可以通过request.setParameter传递参数,如果用request.setAttribute在重定向页面是取不到值的(重定向是两个request请求对象)。

2. getAttribute:                                                                                                                                                                                                 

获取的是一个对象(Object)。

当我们进行一个请求转发(forward)的时候,可以使用request.setAttribute传递参数。

3. requestScope:

是EL表达式中的一个隐含对象,类似request,如:${requestScope.username} 表示在request域中取得username属性所对应的值,相当于request.getAttribute(“username”)。

4. param:

${param.username} 可理解为:request.getParameter(“username”);

结论:

${param.name} 等价于 request.getParamter("name"),(返回字符串)这两种方法一般用于服务器从页面或者客户端获取的内容,这些内容都是String的。

${requestScope.name} 等价于 request.getAttribute("name"),(返回对象)一般是从服务器传递结果到页面,在页面中取出服务器端保存的值!

 

Filter过滤器-JavaWeb三大组件之一

Filter过滤器-JavaWeb三大组件之一

Servlet、Filter、Listener是JavaWeb的三大组件,给Web开发提供了很大的便利。

  • 什么是Filter?

Filter,过滤器。类似与生活中的净水器、空气净化器。

JavaWeb中Filter的作用:当浏览器请求访问服务器的资源时,过滤器可以将请求拦截下来,完成一下特殊的功能。例如:登录验证、统一编码处理、敏感字符过滤等。

 

  • Filter的基本使用

(1)定义一个类,实现接口Filter。

(2)实现Filter接口的方法

(3)配置拦截路径。可以用web.xml进行配置;Servlet 3.0以后还可以用注解进行配置。

示例1(注解配置):

@WebFilter("/index.jsp")
public class FilterDemo1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤请求req的代码");
        filterChain.doFilter(servletRequest,servletResponse);    // 放行请求
        System.out.println("增强响应resp的代码");
    }

    @Override
    public void destroy() {

    }
}

示例2(web.xml配置):

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <filter>
        <filter-name>filter1</filter-name>
        <filter-class>com.chichung.web.filter.FilterDemo1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter1</filter-name>
        <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>
</web-app>

上面两个示例的输出结果都是:

过滤请求req的代码
index...
增强响应resp的代码

说明,Filter的执行顺序是:

(1)执行过滤器放行代码上边的代码

(2)执行放行代码 filterChain.doFilter(servletRequest,servletResponse)

(3)执行放行后的资源 index.jsp

(4)回来执行过滤器放行代码下边的代码

所以Filter可以对请求对象进行过滤,还可以对响应对象进行功能上的增强,再返回给客户端。

 

  • 关于拦截的配置

上面讲了一下两种配置拦截的两种方式。

下面是拦截路径的几种方式:

(1)具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行

(2)拦截目录: /user/*    访问/user下的所有资源时,过滤器都会被执行

(3)后缀名拦截: *.jsp        访问所有后缀名为jsp资源时,过滤器都会被执行

(4)拦截所有资源:/*        访问所有资源时,过滤器都会被执行

还有就是拦截方式的配置。什么是拦截方式呢?我们有些请求是直接访问jsp文件,有些请求是先访问Servlet,然后Servlet通过请求转发到到jsp显示。直接访问jsp文件我们可以用上面的示例代码解决,但是请求转发或者其他方式呢?

* 注解配置:
                * 设置dispatcherTypes属性
                    1. REQUEST:默认值。浏览器直接请求资源
                    2. FORWARD:转发访问资源
                    3. INCLUDE:包含访问资源
                    4. ERROR:错误跳转资源
                    5. ASYNC:异步访问资源
* web.xml配置
                * 设置<dispatcher></dispatcher>标签即可

 

  • 过滤器的生命周期

Filter接口的三个方法:

1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源

2. doFilter:每一次请求被拦截资源时,会执行。执行多次

3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

 

  • 过滤器链(配置多个过滤器)

执行顺序:如果有两个过滤器:过滤器1和过滤器2
            1. 过滤器1
            2. 过滤器2
            3. 资源执行
            4. 过滤器2
            5. 过滤器1

过滤器先后顺序问题:

1. 注解配置:按照类名的字符串比较规则比较,值小的先执行。例如: AFilter 和 BFilter,AFilter就先执行了。

2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行。

 

java web 中用于检测用户是否登陆的过滤器 (Filter - 3)

java web 中用于检测用户是否登陆的过滤器 (Filter - 3)

package OSChina;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 用于检测用户是否登陆的过滤器,如果未登录,则重定向到指的登录页面
 * <p>
 * 配置参数
 * <p>
 * checkSessionKey 需检查的在 Session 中保存的关键字 <br/>
 * redirectURL 如果用户未登录,则重定向到指定的页面,URL 不包括 ContextPath<br/>
 * notCheckURLList 不做检查的 URL 列表,以分号分开,并且 URL 中不包括 ContextPath<br/>
 */
public class FilterDemoThree implements Filter {

 protected FilterConfig filterConfig = null;
 private String redirectURL = null;
 private List<String> notCheckURLList = new ArrayList<String>();
 private String sessionKey = null;

 public void destroy() {

  notCheckURLList.clear();
 }

 @Override
 public void doFilter(ServletRequest servletRequest,
   ServletResponse servletResponse, FilterChain filterChain)
   throws IOException, ServletException {

  HttpServletRequest request = (HttpServletRequest) servletRequest;
  HttpServletResponse response = (HttpServletResponse) servletResponse;

  HttpSession session = request.getSession();
  if (sessionKey == null) {
   filterChain.doFilter(request, response);
   return;
  }
  if ((!checkRequestURIIntNotFilterList(request))
    && session.getAttribute(sessionKey) == null) {
   response.sendRedirect(request.getContextPath() + redirectURL);
   return;
  }
  filterChain.doFilter(servletRequest, servletResponse);
 }

 public void init(FilterConfig filterconfig) throws ServletException {

  this.filterConfig = filterconfig;
  redirectURL = filterConfig.getInitParameter("redirectURL");
  sessionKey = filterConfig.getInitParameter("checkSessionKey");

  String notCheckURLListStr = filterConfig
    .getInitParameter("notCheckURLList");

  if (notCheckURLListStr != null) {
   StringTokenizer st = new StringTokenizer(notCheckURLListStr, ";");
   notCheckURLList.clear();
   while (st.hasMoreTokens()) {
    notCheckURLList.add(st.nextToken());
   }
  }
 }

 private boolean checkRequestURIIntNotFilterList(HttpServletRequest request) {
  String uri = request.getServletPath()
    + (request.getPathInfo() == null ? "" : request.getPathInfo());
  return notCheckURLList.contains(uri);
 }

}

今天关于详解JavaWeb中的过滤器Filter" + message + "javaweb过滤器的作用的讲解已经结束,谢谢您的阅读,如果想了解更多关于Angular.Js中过滤器filter与自定义过滤器filter实例详解、Filter---javaweb的过滤器、Filter过滤器-JavaWeb三大组件之一、java web 中用于检测用户是否登陆的过滤器 (Filter - 3)的相关知识,请在本站搜索。

本文标签:

上一篇javaweb实现文件上传与下载功能(javaweb文件的上传和下载)

下一篇java实现一个简单的Web服务器实例解析File Not FoundHello World!(java编写web服务器)