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页面:

Filter的常见应用的更多相关文章

  1. Filter(过滤器)常见应用

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html F ...

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

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

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

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

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

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

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

    Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...

  6. Filter学习(三)Filter(过滤器)常见应用

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题: package com.web.filter; import java.io.IOE ...

  7. [ASP.NET MVC 小牛之路]11 - Filter

    Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外的逻辑,以非常简单优美的方式实现横切关注点(Cross-cutting Concerns).横切关 ...

  8. 【ASP.NET MVC 学习笔记】- 12 Filter

    本文参考:http://www.cnblogs.com/willick/p/3331520.html 1.Filter(过滤器)是基于AOP(Aspect-Oriented Programming 面 ...

  9. 关于filter web api mvc 权限验证 这里说的够详细了。。。

    参考:http://www.cnblogs.com/willick/p/3331520.html Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外 ...

随机推荐

  1. “全栈2019”Java第三十八章:类与方法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. Cache缓存设计

    缓存的适用场景: 缓存的目的是提高访问速度,减少不必要的开销,提高性能.那什么样的场景适用于缓存呢.试想一个多项式的计算是一个CPU bound的操作,如果频繁调用同一个多项式的结果.显然缓存结果是一 ...

  3. SpringBoot 启动的时候提示 Field *** in *** required a bean named 'entityManagerFactory' that could not be found.

    错误截图 后面发现原来和入口类代码有关. //@SpringBootApplication(scanBasePackages = {"org.jzc.odata.cboard",& ...

  4. iframe自适应高度,多层嵌套iframe自适应高度的解决方法

    在页面无刷新更新方面,虽然现在的ajax很强悍,但是处理代码相对多点.想比之下,iframe就简单多了!处理iframe的自适应宽.高,会经常用到,网上整理了一份,写在这里备用: 单个iframe 高 ...

  5. [HNOI2013]题解

    代码在最后 [HNOI2013]比赛 记忆化搜索 把每一位还需要多少分用\(27\)进制压进\(long\) \(long\),\(map\)记忆化一下即可 [HNOI2013]消毒 先考虑在二维平面 ...

  6. Windows下的ntfs流文件简介

    流文件,即NTFS交换数据流(alternate data streams,简称ADS),是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,就是说除了主文件流之外还可以 ...

  7. 关于 IsLocalUrl 方法的注意事项

    用于判断是否为本地url的方法 Url.IsLocalUrl() 的注意事项: 此方法是以判断传入的url字符串的开头是否为 "/" 为依据来判断是否为本地url,所以如果传入的u ...

  8. 最受欢迎的5款Node.js端到端测试框架

    测试,尤其是自动化测试在现代 WEB 工程中有着非常重要的角色,与交付过程集成良好的自动化测试流程可以在新版发布时帮你快速回归产品功能,也可以充当产品文档.测试因粒度不同又可以分为单元测试.接口测试. ...

  9. SpringBoot学习(一)

    一.Spring Boot Spring是JavaEE轻量级代替品.无需开发重量级的(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的POJO对 ...

  10. java的值传递

    java中都是值传递 如果参数是引用类型的,实际上是把引用地址复制了一份传递 例如 User user = new User(); user存放在栈中,里面存放着内存地址,new User()会在堆中 ...