java--过滤器

来源:互联网 发布:bugs软件 编辑:程序博客网 时间:2024/06/06 19:04

CharacterFilter

package cn.hncu.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;/* * 过滤器开发: * 1.写一个类实现Filter接口 * 2.配置web.xml (配置<filter>和<filter-mapping>两个元素) *  */public class CharacterFilter implements Filter{    private String charset;    //过滤器的init在服务器一启动时就会执行。    //servlet如果配置了load-on-startup选项则也会在服务器启动    //时就执行初始化,否则只有在第一次访问该servlet时才会执行。    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("CharacterFilter-init...");        this.charset=filterConfig.getInitParameter("charset");    }    @Override//该方法在拦截到相应请求或响应时才会执行    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        System.out.println("CharacterFilter-doFilter...拦截请求");//拦截请求        //request.setCharacterEncoding("utf-8");//编码写死了        request.setCharacterEncoding(charset);        //编码写活,让用户可配置(在web.xml中修改参数)        chain.doFilter(request, response);//放行        System.out.println("CharacterFilter-doFilter...拦截响应");//拦截响应        response.setContentType("text/html;charset="+charset);    }    @Override    public void destroy() {        System.out.println("CharacterFilter-destory...");    }}

LoginSecureFilter

package cn.hncu.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.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginSecureFilter implements Filter{    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("LoginSecureFilter-init...");    }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        System.out.println("LoginSecureFilter-doFilter...拦截请求");//拦截请求        HttpServletRequest req=(HttpServletRequest) request;        String name=(String) req.getSession().getAttribute("name");        if(name==null||name.trim().equals("")){            //踢到登录页面            //注意,重定向时路径中的第一个"/"是指Tomcat的根目录,因此这里必须加一个项目名。            ((HttpServletResponse)response).sendRedirect(req.getContextPath()+"/index.jsp");        }        chain.doFilter(request, response);//放行        System.out.println("LoginSecureFilter-doFilter...拦截响应");//拦截响应    }    @Override    public void destroy() {    }}

web.xml–配置Filter和Servlet

<?xml version="1.0" encoding="UTF-8"?>                          <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">  <display-name></display-name>  <!-- 过滤器链中,这一段的配置顺序决定init的执行顺序 -->  <filter>    <filter-name>login</filter-name>    <filter-class>cn.hncu.filter.LoginSecureFilter</filter-class>  </filter>  <filter>    <filter-name>three</filter-name>    <filter-class>cn.hncu.filter.CharacterFilter</filter-class>    <init-param>        <param-name>charset</param-name>        <param-value>UTF-8</param-value>    </init-param>  </filter>  <!-- 拦截路径设置说明:      1.  “/*” 表示拦截所有资源      2.  “*.jsp” 表示拦截所有jsp页面的请求与响应      3.  “/jsps/*.jsp”  ※不能这样写,格式错误※      4.  “/jsps/*” 表示拦截jsps目录下的所有资源       5.  “/LoginServlet” 表示只拦截映射路径为“/LoginServlet”的这一个servlet      6.  “login” 表示只拦截名“login”的servlet(可以把jsp页面配置成serlvet)   -->  <!-- 过滤器链中,这一段的配置顺序决定拦截顺序(过滤器的过滤顺序) -->  <filter-mapping>    <filter-name>three</filter-name>    <!-- 指定拦截访问后台的哪些资源(servlet,jsp,jpg文件等), '/*'代表所有资源 -->    <url-pattern>/*</url-pattern>  </filter-mapping>  <servlet>    <servlet-name>LoginServlet</servlet-name>    <servlet-class>cn.hncu.servlet.LoginServlet</servlet-class>  </servlet>  <servlet>    <servlet-name>BuyServlet1</servlet-name>    <servlet-class>cn.hncu.servlet.BuyServlet1</servlet-class>  </servlet>  <servlet>    <servlet-name>BuyServlet2</servlet-name>    <servlet-class>cn.hncu.servlet.BuyServlet2</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>LoginServlet</servlet-name>    <url-pattern>/login</url-pattern>  </servlet-mapping>  <servlet-mapping>    <servlet-name>BuyServlet1</servlet-name>    <url-pattern>/buy/buy1</url-pattern>  </servlet-mapping>  <servlet-mapping>    <servlet-name>BuyServlet2</servlet-name>    <url-pattern>/buy/buy2</url-pattern>  </servlet-mapping>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

初始化顺序
这里写图片描述

主页面index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>  </head>  <body>    <h2>这是主页...OKOK</h2>    <c:url value="/login"/>    <form action='<c:url value="/login"/>' method="post">        姓名:<input type="text" name="name"/><br/>        <input type="submit" value="提交">    </form>    <a href='<c:url value="/buy/buy1"/>'>商品1</a>    <a href='<c:url value="/buy/buy2"/>'>商品2</a>    <a href='<c:url value="/jsps/a.jsp"/>'>欢迎</a>  </body></html>

/jsps/wel.jsp–登录成功页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>  </head>  <body>  <h2>这是欢迎页面</h2>        欢迎你,${name}!  </body></html>

/jsps/a.jsp–欢迎页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>  </head>  <body>    <h2>很多贵宾才能看到的商品</h2>        欢迎你,${name}! <br/>        <img  src="<c:url value='/imgs/1.png'/>" />     </body></html>

LoginServlet–登录,未被LoginSecureFilter拦截

package cn.hncu.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String name=request.getParameter("name");        //....//省略若干行代码(调用service及dao层,到数据库中验证身份)        request.getSession().setAttribute("name", name);//这里假设验证成功        System.out.println(request.getContextPath()+"/jsps/wel.jsp");        response.sendRedirect(request.getContextPath()+"/jsps/wel.jsp");//      response.sendRedirect(request.getContextPath()+"/index.jsp");    }}

BuyServlet1–BuyServlet2同(映射路径为”/buy/buy1”和“/buy/buy2”)

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class BuyServlet1 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String name = request.getParameter("name");        PrintWriter p=response.getWriter();        p.print(name+"访问了buy1");        p.print("进行购物---调用service层的相应逻辑");//要求必须登录过后才能访问该模块    }}

第一次访问主页的filter拦截
这里写图片描述
未登录时访问超链接 欢迎
这里写图片描述
登陆
这里写图片描述

0 0
原创粉丝点击