jsp中用过滤器filter拦截指定页面,转到servlet处理后返回目标页面的一个小例子

来源:互联网 发布:超融合软件dell 编辑:程序博客网 时间:2024/05/21 04:17
DataServlet.javapackage servlet;import java.io.IOException;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 implementation class Datamanager */@WebServlet("/DataServlet")public class DataServlet extends HttpServlet {private static final long serialVersionUID = 1L;           /**     * @see HttpServlet#HttpServlet()     */    public DataServlet() {        super();        // TODO Auto-generated constructor stub    }/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub//response.getWriter().append("Served at: ").append(request.getContextPath());//进入serlvletSystem.out.println("-------------进入servlet----------");//首先接受filter传过来的目标页面url//通过参数接受目标urlString url=(String) request.getAttribute("url");System.out.println("已通过request参数接受到目标url:"+url);//自定义模拟数据库数据strSystem.out.println("进行数据处理");String str="模拟数据库数据";//将数据保存在参数data中System.out.println("已创建数据");request.setAttribute("data", str);System.out.println("已将数据放置在request的data参数中。等待跳转-----");//转向目标页面System.out.println("完成向目标页面的跳转,servlet处理完成。");System.out.println("----------以上是servlet内容------------------");request.getRequestDispatcher(url).forward(request, response);}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

FilterTest.javapackage 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.http.HttpServletRequest;/** * Servlet Filter implementation class FilterTest */@WebFilter("/FilterTest")public class FilterTest implements Filter { /** * Default constructor. */ public FilterTest() { // TODO Auto-generated constructor stub }/** * @see Filter#destroy() */public void destroy() {// TODO Auto-generated method stub}/** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stub//需要拦截的页面url:c.jspString str="c.jsp";//处理数据用的servletString servlet="data";//控制台输出提示System.out.println("------------以下是filter部分-------------------");System.out.println("我是filter,所有页面的访问必须先通过我!");System.out.println("已拦截页面访问请求:");//输出页面访问来源System.out.println("访问请求的来源是:"+((HttpServletRequest)request).getHeader("referer"));//获取目标URLString url=((HttpServletRequest)request).getRequestURI();//servletRequest转成HttpServletRequest.//判断目标URL是否需要拦截if(url!=null) {//如果访问请求目标页面不为空//控制台输出提示System.out.println("访问请求的目标页面是:"+url);int count=url.indexOf(str);//访问请求的URL是否包含要过滤的网页URL。count=-1时不包含。if(count!=-1) {//确定包含需过滤URLSystem.out.println("访问请求的页面需要servlet数据处理,将会被转给servlet处理。");//截取URL只保留xx.jsp部分。url=url.substring(count, url.length());//将url作为参数写入requestrequest.setAttribute("url", url);//转到servlet处理数据request.getRequestDispatcher(servlet).forward(request, response);}}//count=-1时,说明访问请求目标URL不包含需过滤url:c.jsp//控制台输出提示System.out.println("访问请求不需要servlet处理,放行。");System.out.println("------------以上是filter内容----------------------");// pass the request along the filter chain//将request和response传递给filter链,供下一个filter调用chain.doFilter(request, response);}/** * @see Filter#init(FilterConfig) */public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stub}}

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>TomcatTest</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> <filter> <filter-name>FilterTest</filter-name> <filter-class>filter.FilterTest</filter-class> </filter> <filter-mapping> <filter-name>FilterTest</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>DataServlet</servlet-name> <servlet-class>servlet.DataServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DataServlet</servlet-name> <url-pattern>/data</url-pattern> </servlet-mapping></web-app>

c.jsp<%@ page language="java" contentType="text/html; charset=utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><h1>这是c.jsp</h1><hr>接受servlet提供的数据:<font color="red"><%=request.getAttribute("data") %></font><br>说明:如果以上数据不为null,而是servlet设定的"模拟数据库数据",则表明该页面经过了filter过滤并交由servlet处理后传回本页面。<br><a href="a.jsp">跳转到a.jsp</a></body></html>

b.jsp<%@ page language="java" contentType="text/html; charset=utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><h1>这个是b.jsp。由a.jsp直接跳转过来。</h1><br><a href="a.jsp">返回a.jsp</a></body></html>

a.jsp<%@ page language="java" contentType="text/html; charset=utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><h1>这是a.jsp!</h1><br><a href="b.jsp">经过filter拦截,但不会转到servlet处理,直接跳转到b.jsp</a><br><a href="c.jsp">经过filter拦截并转到servlet处理后跳转至c.jsp</a></body></html>


学习JSP过滤器时的一个例子:

功能:对于需要进行数据库操作的页面,自动拦截到servlet处理,最后返回目标页面。

说明:filter拦截所有的页面,拦截时判断是否需要进行数据处理,如果需要就转向数据处理的servlet进行处理,处理完成后将数据传入request,并自动跳转到目标页面。

该例子一共有3个JSP页面:a.jsp,b.jsp,c.jsp.1个filter:FilterTest.java.1个servlet:DataServlet.java。

第一次弄这个,为啥代码只能放一大堆在顶部呢???

小例子,没啥技术含量。感兴趣的朋友可以看看。如果要拷贝代码测试,请留意控制台输出的提示。

 

 

阅读全文
0 0
原创粉丝点击