使用范例一:对请求内容进行编码转换
public class CodeFilter implements Filter{
public void destroy(){}
public void init(FilterConfig arg0) throws ServletException{}
public void doFilter(ServletRequest reuqest,ServletResponse response,FilterChain chain) throws IOException,ServletException{
HttpServletResponse req = (HttpServletRequest)request;
req.setCharacterEncoding("UTF-8");
chain.doFilter(request,response);
}
}
配置:

使用范例二:权限管理
public class CodeFilter implements Filter{
public void destroy(){}
public void init(FilterConfig arg0) throws ServletException{}
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{
HttpSession session = ((HttpServletRequest)request).getSession();
TOperator operator = (TOperator)session.getAttribute("operator");
if(operator == null){
request.getRequestDispatcher("index.jsp").forward(request,response);
}
else{
chain.doFilter(request,response);
}
}
}

使用范例三:实现日志功能
private PrintWriter logger;
private String prefix;
@override
public void init(FilterConfig filterConfig) throws ServletException{
prefix = filterConfig.getInitParameter("prefix");
String logFileName = filterConfig.getInitParameter("logFileName");
String appPath = filterConfig.getServletContext().getRealPath("/");
System.out.println("logFileName:" + logFileName);
try{
logger = new PrintWriter(new File(appPath,logFileName));
}catch(FileNotFoundException e){
e.printStackTrace();
throw new ServletException(e.getMessage());
}
}

使用范例四:利用请求封装器实现字符的重新编码
@WebFilter (
urlPatterns = { "/*" },
设置过滤器初始参数
initParams = {
@WebInitParam (name = "ENCODING", value = "UTF-8")
})
public class EncodingFilter implements Filter {
private String ENCODING;
public void init (FilterConfig config) throws ServletException {
ENCODING = config.getInitParameter ("ENCODING");//读取初始参数
}
public void doFilter (ServletRequest request,ServletResponse response, FilterChain chain)throws I0Exception, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
if ("GET". equals (req. getMethod())) {
req = new EncodingWrapper (req, ENCODING); //GET 请求时创建封装器!!!这是最关键的地方
else {
req. setCharacterEncoding (ENCODING) ;
chain. doFilter (req, response); //调用FiterChain的doFilter()
}
public void destroy() {}
}
包装类HttpServletRequestWrapper,继承这个类之后就能实现绝大部分的东西
public class EncodingWrapper extends HttpServletRequestWrapper{
private String ENCODING;
public EncodingWrapper (HttpServletRequest request, String ENCODING) {
super (request);+-❷ 必须调用父类构造器,传入HttpServletRequest实例
this . ENCODING = ENCODING;
}
@Override
public String getParameter (String name) {//重新定义getParameter ()方法
String value = getRequest().getParameter(name) ;
if(value != nu1l) {
try {
byte[] b = value. getBytes ("IS0-8859-1");//将取得的请求参数
value = new String (b, ENCODING);
值进行编码转换
} catch (UnsupportedEncodingException e) {
throw new RuntimeException (e) ;
}
return value;
}
}
}

本文介绍了Java Web中过滤器的四个典型应用场景:请求内容编码转换、权限管理、日志功能实现及通过请求封装器重新编码字符。这些例子有助于开发者更好地理解和使用过滤器。

625

被折叠的 条评论
为什么被折叠?



