Filter的常见应用

1.字符编码过滤器

实现功能,在a.jsp中填写用户名提交到b.jsp,在b.jsp中读取参数名。

a.jsp

<body>
  <form action="encoding/b.jsp" method="post">
    name:<input type="text" name="username"/>
    <input type="submit" value="Submit"/>
  </form>
</body>

b.jsp

<body>
<% request.setCharacterEncoding("UTF-8");%>
  hello:${param.username}
</body>

若需要读取参数的页面太多,需要在每一个页面都添加<% request.setCharacterEncoding("UTF-8");%>,该方法行不通。字符编码过滤器通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题。

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

public abstract class HttpFilter implements Filter {
	@Override
	public void destroy() { }
    /*
     * 原生的doFilter方法,在方法内部把ServletRequest和ServletResponse转为了HttpServletRequest和HttpServletResponse,
     * 并调用了doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain filterchain)方法。
     * 若编写Filter的过滤方法不建议直接继承该方法,而建议继承doFilter(HttpServletRequest request,HttpServletResponse response,
     * FilterChain filterchain)方法。
     * */
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterchain)
			throws IOException, ServletException {
		HttpServletRequest request=(HttpServletRequest) req;
		HttpServletResponse response=(HttpServletResponse) resp;
	    doFilter(request,response,filterchain);
	}
	//抽象方法,为Http请求定制必须实现的方法。
	public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain filterchain) throws IOException, ServletException;
    private FilterConfig filterconfig;
    //不建议子类直接覆盖,若直接覆盖,将可能会导致filterConfig成员变量初始化失败。
	@Override
	public void init(FilterConfig filterconfig) throws ServletException {
		this.filterconfig =filterconfig;
		init();
	}
	//供子类继承的初始化方法,可以通过getFilterConfig()获取FilterConfig对象。
    public void init(){}
    //直接返回init(ServletConfig)的ServletConfig对象。
    public FilterConfig getFilterConfig(){
    	return filterconfig;
    }
}

encodingFilter.java

package com.javaweb.Filter;
import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.javaweb.Filter.HttpFilter;

public class encodingFilter extends HttpFilter {

	@Override
	public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterchain)
			throws IOException, ServletException {
		//2.指定请求的字符编码为1中读取的字符编码
        request.setCharacterEncoding(encoding);
        //3.调用chain.doFile()方法放行请求
        filterchain.doFilter(request,response);
	}
	private String encoding;
	public void init(){
		//1.读取配置文件web.xml中的字符编码方式
		encoding=getFilterConfig().getServletContext().getInitParameter("encoding");
	}
}

在web.xml中进行配置,首先指定当前页的字符编码:

<context-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
</context-param>

配置encodingFilter,

  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.javaweb.Filter.encodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/encoding/*</url-pattern>
  </filter-mapping>

这样,不用在b.jsp页面指定<% request.setCharacterEncoding("UTF-8");%>也不会出现输入中文的乱码问题。

2.检测用户是否登录过的过滤器

系统中的某些页面只有在正常登录后才可以使用,用户请求这些页面时要检查session中有无该用户的信息,但在所有的页面加上session的判断相当麻烦。因此需要重新编写一个用于检测用户是否登录的过滤器,如果用户未登录,则重定向到指定的登录页面。

示例代码:

a.jsp

  <body>
    <h4>AAA page</h4>
    <a href="login/list.jsp">return list...</a>
  </body>

b.jsp

  <body>
    <h4>BBB page</h4>
    <a href="login/list.jsp">return list...</a>
  </body>

c.jsp

  <body>
    <h4>CCC page</h4>
    <a href="login/list.jsp">return list...</a>
  </body>

d.jsp

  <body>
    <h4>DDD page</h4>
    <a href="login/list.jsp">return list...</a>
  </body>

e.jsp

  <body>
    <h4>EEE page</h4>
    <a href="login/list.jsp">return list...</a>
  </body>

list.jsp

  <body>
    <a href="login/a.jsp">AAA</a>
    <br><br>
    <a href="login/b.jsp">BBB</a>
    <br><br>
    <a href="login/c.jsp">CCC</a>
    <br><br>
    <a href="login/d.jsp">DDD</a>
    <br><br>
    <a href="login/e.jsp">EEE</a>
    <br><br>
  </body>

login.jsp

  <body>
  <form action="login/doLogin.jsp" method="post">
    username:<input type="text" name="username"/>
    <input type="submit" value="Submit"/>
  </form>
  </body>

doLogin.jsp

  <body>
    <%
    String username=request.getParameter("username");
    if(username!=null){
        session.setAttribute(application.getInitParameter("sessionKey"),username);
        response.sendRedirect("list.jsp");
    }else{
        response.sendRedirect("login.jsp");
    }

     %>
  </body>

loginFilter.java

package com.javaweb.Filter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.javaweb.Filter.HttpFilter;

public class loginFilter extends HttpFilter {
    String sessionKey;
    String redirectUrl;
    String uncheckedUrls;
	@Override
	public void init() {
		ServletContext servletcontext=getFilterConfig().getServletContext();
		sessionKey=servletcontext.getInitParameter("sessionKey");
		redirectUrl=servletcontext.getInitParameter("redirectPage");
		uncheckedUrls=servletcontext.getInitParameter("uncheckedPage");

	}

	@Override
	public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterchain)
			throws IOException, ServletException {
		//b.jsp    c.jsp   d.jsp   ...
		String servletPath=request.getServletPath();
		//检查uncheckedUrls是否包含请求的URL,若包含,放行
		List<String> Urls=Arrays.asList(uncheckedUrls.split(","));
		if (Urls.contains(servletPath)){
			filterchain.doFilter(request, response);
			return;
		}
		//从sessionKey中检查是否包含sessionKey对应的值,若值不存在,则重定向到redirectUrl
		Object user=request.getSession().getAttribute(sessionKey);
		if (user==null){
			response.sendRedirect(request.getContextPath()+redirectUrl);
			return;
		}
		//若存在,则放行
		filterchain.doFilter(request, response);

	}

}

在web.xml中进行配置:

  <context-param>
    <param-name>redirectPage</param-name>
    <param-value>/login/login.jsp</param-value>
  </context-param>
  <context-param>
    <param-name>uncheckedPage</param-name>
    <param-value>/login/a.jsp,/login/doLogin.jsp,/login/list.jsp,/login/login.jsp</param-value>
  </context-param>
  <context-param>
    <param-name>sessionKey</param-name>
    <param-value>sessionValue</param-value>
  </context-param>    <filter>    <filter-name>loginFilter</filter-name>    <filter-class>com.javaweb.Filter.loginFilter</filter-class>  </filter>  <filter-mapping>    <filter-name>loginFilter</filter-name>    <url-pattern>/login/*</url-pattern>  </filter-mapping>

AAA页面不需要登录即可访问,

点击BBB(及之后的)超链接时,跳转到登录页面:

填写登录名之后再访问BBB,可以跳转到BBB页面:

原文地址:https://www.cnblogs.com/naihuangbao/p/9937478.html

时间: 2024-10-08 08:49:20

Filter的常见应用的相关文章

Filter(过滤器)常见应用

孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import

javaweb学习总结(四十六)——Filter(过滤器)常见应用

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.Serv

day56 Filter(过滤器)常见应用

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.Serv

javaWeb学习总结(10)- Filter(过滤器)常见应用(3)

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 package me.gacl.web.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException;

JavaWeb学习 (二十四)————Filter(过滤器)常见应用

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.Serv

XSS过滤JAVA过滤器filter 防止常见SQL注入

Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的. sql注入所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执

【JavaWeb学习】过滤器Filter

一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技

Asp.Net MVC -Filter

Filter(筛选器)是基于AOP(面向切面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外的逻辑,以非常简单优美的方式实现横切关注点(Cross-cutting Concerns).横切关注点是指横越应该程序的多个甚至所有模块的功能,经典的横切关注点有日志记录.缓存处理.异常处理和权限验证等.本文将分别介绍MVC框架所支持的不同种类的Filter的创建和使用,以及如何控制它们的执行. 四种基本 Filter 概述 MVC框架支持的Filter可以归为四类,每一类都可以对处理请求的不同

Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结

Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结 1. 本文范围 1 2. Angular的优点 1 2.1. 双向数据绑定 1 2.2. dsl化 2 2.3. 依赖注入 2 2.4. 指令 2 3. 手动绑定数据spa方式以及与ajax 与dwr的集成 2 4. 格式化数据 2 4.1. 多字段组合格式化 3 4.2. 输出html 4 5. 输出作为函数参数调用 4 6. 加载完成事件 5 7. 常见错误 5 7.1. Atitit.a