过虑器基础2(48)

过虑器链FilterChain

当一个web项目中有多个连接器,且这些过虑器对同个url进行过虑。这时就形成了过虑器链/。

在filter的配置当中,有两个配置:filter,filter-mapping.

Filter-mapping在前,则先执行,在后则后执行。

<filter>

<filter-name>first</filter-name>

<filter-class>cn.itcast.filter.FirstFilter</filter-class>

</filter>

<filter>

<filter-name>second</filter-name>

<filter-class>cn.itcast.filter.SecondFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>second</filter-name>

<url-pattern>/four</url-pattern>

</filter-mapping>

<filter-mapping>

<filter-name>first</filter-name>

<url-pattern>/four</url-pattern>

</filter-mapping>

过虑器应用之1-设置request编码


写一个过虑器,对所有url全部过虑,/*.在doFilter方法中,设置request的编码为utf-8。

一般情况下,这个过虑器永远是第一个要执行的过虑器。

最好是通过配置设置编码。<filter><init-param>…

第一步:实现Filter接口,在doFIlter中接收初始化参数,设置编码

package cn.hongxin.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 CharFilter implements Filter {

//声明编码的成员变量

private String encoding;

public void init(FilterConfig config) throws ServletException {

encoding = config.getInitParameter("bm");

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

request.setCharacterEncoding(encoding);

//放行,必须要放行。

chain.doFilter(request, response);

}

public void destroy() {

}

}

第二步:将上面的类配置到web.xml

<filter>

<filter-name>char</filter-name>

<filter-class>cn.itcast.filter.CharFilter</filter-class>

<init-param>

<!-- 为了便于配置,在配置文件中设置编码 -->

<param-name>bm</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>char</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


对get可以处理中文

在CharFilter中对reuqest进行包装。

目的:修改增强getParameter方法,如果是get转码。

第一步:声明包装类:

//声明包装类

class MyRequest extends HttpServletRequestWrapper{

public MyRequest(HttpServletRequest request) {

super(request);

}

//增强getParamter

@Override

public String getParameter(String name) {

String val = super.getParameter(name);

if(super.getMethod().equals("GET")){

try {

val = new String(val.getBytes("ISO-8859-1"),super.getCharacterEncoding());

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

return val;

}

}

第二步:在doFilter方法中,声明包装类的实例

package cn.hongxin.filter;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

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.HttpServletRequestWrapper;

public class CharFilter implements Filter {

// 声明编码的成员变量

private String encoding;

public void init(FilterConfig config) throws ServletException {

encoding = config.getInitParameter("bm");

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

request.setCharacterEncoding(encoding);

response.setContentType("text/html;charset=" + encoding);

// 判断是否需要包装

HttpServletRequest req = (HttpServletRequest) request;

if (req.getMethod().equals("GET")) {

request = new MyRequest(req);

}

// 声明包装类的实例

// 放行

chain.doFilter(request, response);

}

public void destroy() {

}

}

// 声明包装类

class MyRequest extends HttpServletRequestWrapper {

public MyRequest(HttpServletRequest request) {

super(request);

}

// 增强getParamter

@Override

public String getParameter(String name) {

String val = super.getParameter(name);

try {

val = new String(val.getBytes("ISO-8859-1"),

super.getCharacterEncoding());

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return val;

}

}


时间: 2024-10-06 21:19:25

过虑器基础2(48)的相关文章

过虑器基础3—页面缓存和生成验证码(48)

设置某些页面缓存或是不缓存 要想让所有浏览器不缓存页面: <% response.setHeader("expires","-1"); response.setHeader("pragma","no-cache"); response.setHeader("cache-control","no-cache"); %> 分析:通过一个过虑器,对所有*.jsp过虑,设置三个头,全

过虑器基础(47)

在web项目中就只有三大组件: Filter过虑器 监听器. Servlet 在web中过虑器就是一个类javax.servlet.Filter. 过虑器是用于在执行时,过虑用户的请求(request),或是过虑从请求的资源中返回的响应(response). 实现一个最基本的过虑器 1:过虑器只对url(路径)进行过虑. 2:过虑器开发人员来实现. 3:过虑器由于是web的核心组,所以这个filter的实现者也必须要配置到web.xml中. 4:三个生命周期方法:init,destory,doF

【struts2】拦截器基础

1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Struts2系统架构图中关于拦截器的部分,如下图所示: 这个图清晰的描述出了拦截器的运行地位,就是用来负责在Action执行之前和Result执行之后处理一些功能的类.也就是说,上图示意了有3个拦截器的类,分别是Interceptor1.Interceptor2和Interceptor3,它们分别执行不同的

【OPENGL】第三章 着色器基础(一)

在这一章,我们会学习什么是着色器(Shader),什么是着色器语言(OpenGL Shading Language-GLSL),以及着色器怎么和OpenGL程序交互. 首先我们先来看看什么叫着色器. Shader(着色器)是用来实现图像渲染的,用来替代固定渲染管线的可编程程序. 着色器替代了传统的固定渲染管线,可以实现3D图形学计算中的相关计算,由于其可编程性,可以实现各种各样的图像效果而不用受显卡的固定渲染管线限制.这极大的提高了图像的画质. 在上一篇文章( http://www.cnblog

自制MVC框架的插件与拦截器基础

上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以下抽象类来实现插件或者拦截器. 1. AspectInterceptor抽象类 处理动态织入的AOP拦截器,Stephen.View框架中的拦截器抽象类,所有需要动态拦截器必须实现该类,该拦截器原理是通过aspectsharp实现的.该拦截器适用于控制层的拦截,且要使控制器类支持动态拦截必须给控制器加上DynamicAttribut

Python开发基础-Day7-闭包函数和装饰器基础

补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其他局部作用域中使用全局变量,声明后可以在其他作用于中修改和使用 x=1 #全局赋值变量 def foo(): global x #函数内部全局声明变量x x=1111111 #函数内部修改全局变量x print(x) foo() print(x) global声明的变量在任何作用域都能够修改,所以一般非必要情

Python——装饰器基础

装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自己编写新的装饰器的更多高级语法. ================================================================================= 什么是装饰器 装饰是为函数和类指定管理代码的一种方式.Python装饰器以两种形式呈现: [1]函数装饰器在函数定义的时候进行名称重绑定,提供一个逻辑层来管理函数和方法或随后对它们的调

LVM逻辑卷管理器 基础

一.LVM简介 逻辑卷管理器LVM(Logcal Volume Manager),LVM可以弹性的调整文件系统的容量,不必要再去烦恼文件系统空间不够的问题.LVM的实现是将几个物理分区(或磁盘)通过软件组合成为一块看起来是独立的大磁盘(VG),然后将这块大磁盘再经过分成可使用分区(LV),最终就能够挂载使用. 以下是LVM一些名词的解释,解释来自百度LVM: PhysicalStorageMedia 物理存储设备 指系统的物理存储设备:磁盘,如:/dev/hda./dev/sda等,是存储系统最

python学习系列之python装饰器基础(2)---装饰含返回值的函数

在上篇基础(1)中,我写了一个装饰器及使用方法,但是如果遇到一个函数带返回值的话,就不好使了,因此重写一个装饰器如下: #basic2.py #coding:utf-8 def auth(func):     def inner(*arg, **kwargs):         print 'before'         temp = func(*arg,**kwargs) #这行是关键,func相当于fetch_server_list         print 'after'