JAVA中的使用Filter过滤器设置字符集

Filter是什么?

        Filter不是一个Servlet,它可以叫做Servlet链,它可以用来改变一个request,修改一个response。它虽然不能产生一个response,但可以在一个request到大Servlet之前预处理request,也可以在response离开Servlet时处理response。

具体的调用关系如下图所示。


       也可以说,Filter是对Request和Response请求进行了拦截。



注意:

      只对post请求有效。


新建一个TestFilter类,继承Filter类后,我们可以看到主要的几个方法。

package com.bjpowermode.drp.util.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 TestFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}


1)init()

用来设置filter的配置对象,只调用一次。

2)doFilter()

是最重要最核心的方法,执行Filter的工作。每一个filter从doFilter()方法中得到当前的request及response

3)destory()

返回配置对象。

Filter的生命周期

      在应用启动的时候就进行装载Filter类。容器创建好Filter对象实例后,调用init()方法。接着保存进集合容器中去了等待着,用户访问资源。当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。

注意:init方法与destroy方法只会直接一次。


在实例中,我们用Filter主要是来设置字符集,防止jsp出现中文乱码现象。

如果不使用Filter,我们需要在每个jsp页面中添加如下语句:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>

那么,使用Filter之后呢?

package com.bjpowermode.drp.util.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;

/*
 * 
 * 采用Filter统一处理字符集
 */
public class CharSetEncodingFilter implements Filter {

	private String encoding;

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain chain) throws IOException, ServletException {
		
		//System.out.println("CharsetEncoding--->>>begin");
		//设置字符集
		arg0.setCharacterEncoding("GB18030");
		
		//继续执行
		//如果还有filter,继续调,如果没有,就调jsp
		chain.doFilter(arg0,arg1);
		//System.out.println("CharsetEncoding--->>>end");
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		
		//System.out.println("CharsetEncoding--->>>init");
		this.encoding=arg0.getInitParameter("encoding");
		//System.out.println("CharsetEncoding--->>>init"+encoding);
	}

}

在配置文件中进行配置。

注意:

CharSetEncodingFilter方法名和与配置文件中要一致,

类的路径com.bjpowermode.drp.util.filter.CharSetEncodingFilter。


 <filter>
  	<filter-name>CharSetEncodingFilter</filter-name>
  	<filter-class>com.bjpowermode.drp.util.filter.CharSetEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>GBK</param-value>
  	</init-param>
  </filter>
  <!--对什么模式起作用  -->
  <filter-mapping>
  	<filter-name>CharSetEncodingFilter</filter-name>
  	<!--可加目录  -->
  	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>

总结:

        Filter提高了代码的灵活性,将变动移到了配置文件中而不是在页面上。

        Filter除了可以设置字符集,解决乱码问题外,还可以用在验证用户权限,对网站进行压缩等方面。


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
### 回答1: 可以使用JavaFilter接口来实现过滤器,具体代码如下: 请求过滤器: ``` public class RequestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 请求处理 HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); System.out.println("Request URI: " + requestURI); // 继续执行过滤器链 chain.doFilter(request, response); } @Override public void destroy() { // 销毁操作 } } ``` 响应过滤器: ``` public class ResponseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 响应处理 HttpServletResponse resp = (HttpServletResponse) response; resp.setCharacterEncoding("UTF-8"); // 继续执行过滤器链 chain.doFilter(request, response); } @Override public void destroy() { // 销毁操作 } } ``` 在web.xml配置过滤器: ``` <filter> <filter-name>RequestFilter</filter-name> <filter-class>com.example.RequestFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>ResponseFilter</filter-name> <filter-class>com.example.ResponseFilter</filter-class> </filter> <filter-mapping> <filter-name>ResponseFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这样就可以实现请求和响应的字符串乱码处理了。 关于lua closure factory的完整代码,我不清楚你具体需要什么样的代码,可以提供更详细的信息吗? 文加密的问题,可以使用Java的加密算法来实现,比如MD5、SHA等。具体代码如下: ``` import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class EncryptUtil { public static String md5(String str) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes()); byte[] bytes = md.digest(); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } public static String sha1(String str) { try { MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(str.getBytes()); byte[] bytes = md.digest(); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } } ``` 这样就可以实现文加密了。 ### 回答2: 在Java使用过滤器可以实现请求和响应的处理。对于请求的处理,可以通过自定义过滤器实现编码的设置,防止乱码的出现。而对于响应的处理,可以通过过滤器修改响应的字符集,将乱码进行处理。 首先,要创建一个过滤器类来处理请求的编码设置。我们可以实现javax.servlet.Filter接口,并覆盖doFilter方法。在doFilter方法,我们可以通过调用HttpServletRequest的setCharacterEncoding方法设置请求的字符集编码。例如,我们可以将字符集设置为UTF-8编码: ```java public class RequestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } @Override public void destroy() { } } ``` 接下来,我们可以创建另一个过滤器来处理响应的字符集。同样地,我们实现javax.servlet.Filter接口,并在doFilter方法调用HttpServletResponse的setCharacterEncoding方法设置响应的字符集编码。以下是一个示例: ```java public class ResponseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } @Override public void destroy() { } } ``` 在Web应用程序的web.xml文件,我们需要配置这两个过滤器。例如: ```xml <filter> <filter-name>RequestFilter</filter-name> <filter-class>com.example.RequestFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>ResponseFilter</filter-name> <filter-class>com.example.ResponseFilter</filter-class> </filter> <filter-mapping> <filter-name>ResponseFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 通过上述配置,我们可以确保在请求和响应过程正确地处理字符集编码,防止乱码的出现。 ### 回答3: 在Java,可以使用过滤器来对请求和响应进行处理。要实现一个写请求的过滤器,我会创建一个新的Java类,并使其实现javax.servlet.Filter接口。在doFilter方法,我会通过获取HttpServletRequest对象,从读取请求的内容,并对其进行处理,例如检查参数是否合法或对特定内容进行修改。处理后的请求内容将会被传递给FilterChain对象的doFilter方法,继续处理。 以下是一个示例的写请求的过滤器的代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class RequestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 这里可以进行过滤器的初始化操作,如果有的话 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; // 对请求内容进行处理 // 继续处理 chain.doFilter(request, response); } @Override public void destroy() { // 可以进行一些资源清理的操作,如果有的话 } } ``` 接下来,我会创建一个写响应字符串乱码处理的过滤器。在doFilter方法,我会通过获取HttpServletResponse对象,设置响应的字符编码为UTF-8,以确保处理后的字符串不会出现乱码。 以下是一个示例的写响应字符串乱码处理的过滤器的代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ResponseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 这里可以进行过滤器的初始化操作,如果有的话 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; // 设置响应的字符编码为UTF-8 httpResponse.setCharacterEncoding("UTF-8"); // 继续处理 chain.doFilter(request, response); } @Override public void destroy() { // 可以进行一些资源清理的操作,如果有的话 } } ``` 以上是用Java过滤器实现写请求和写响应字符串乱码处理的简单示例。根据实际需求,你可以进一步修改和扩展这些过滤器的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值