zoukankan      html  css  js  c++  java
  • 分享几个常用过滤器

    一、非常优秀的AJAX中文问题解决过滤器

    public class AjaxEncodeFilter extends HttpServlet implements Filter {

    /**
    * AJAX使用中的字符过滤器,解决中文问题
    */
    private static final long serialVersionUID = 1L;

    public void doFilter(ServletRequest servletRequest,
    ServletResponse servletResponse, FilterChain filterChain)
    throws IOException, ServletException {
    /* if (logger.isDebugEnabled()) {
    logger.debug("doFilter(ServletRequest, ServletResponse, FilterChain) - start"); //$NON-NLS-1$
    }
    */

    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    String requestedWith = request.getHeader("x-requested-with");
    String type = request.getContentType();
    if (requestedWith != null && "XMLHttpRequest".equals(requestedWith)
    && null != type
    && "application/x-www-form-urlencoded".equals(type)) {
    // logger.info("This's ajax post.set encode is UTF-8.");
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    request.getParameterMap();
    }

    filterChain.doFilter(request, response);

    /* if (logger.isDebugEnabled()) {
    logger.debug("doFilter(ServletRequest, ServletResponse, FilterChain) - end"); //$NON-NLS-1$
    }
    */
    }

    public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub

    }
    }

    二、普通字符编码过滤器

    package com.test.util;

    import javax.servlet.*;
    import java.io.IOException;

    /**
    * 用于设置 HTTP 请求字符编码的过滤器,通过过滤器参数encoding指明使用何种字符编码,用于处理Html Form请求参数的中文问题
    */
    public class CharacterEncodingFilter implements Filter {
    protected FilterConfig filterConfig = null;
    protected String encoding = "";

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
    {
    if(encoding != null)
    servletRequest.setCharacterEncoding(encoding);
    filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy()
    {
    filterConfig = null;
    encoding = null;
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    this.filterConfig = filterConfig;
    this.encoding = filterConfig.getInitParameter("encoding");

    }
    }

    三、检测是否登录过滤器

    package com.test.util;

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    import java.io.IOException;

    /**
    * 用于检测用户是否登陆的过滤器,如果未登录,则重定向到指的登录页面<p>
    * 配置参数<p>
    * checkSessionKey 需检查的在 Session 中保存的关键字<br/>
    * redirectURL 如果用户未登录,则重定向到指定的页面,URL不包括 ContextPath<br/>
    * notCheckURLList 不做检查的URL列表,以分号分开,并且 URL 中不包括 ContextPath<br/>
    */
    public class CheckLoginFilter implements Filter {
    protected FilterConfig filterConfig = null;
    private String redirectURL = null;
    private List notCheckURLList = new ArrayList();
    private String sessionKey = null;

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
    {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    HttpSession session = request.getSession();
    if(sessionKey == null)
    {
    filterChain.doFilter(request, response);
    return;
    }
    if((!checkRequestURIIntNotFilterList(request)) && session.getAttribute(sessionKey) == null)
    {
    response.sendRedirect(request.getContextPath() + redirectURL);
    return;
    }
    filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy()
    {
    notCheckURLList.clear();
    }

    private boolean checkRequestURIIntNotFilterList(HttpServletRequest request)
    {
    String uri = request.getServletPath() + (request.getPathInfo() == null ? "" : request.getPathInfo());
    return notCheckURLList.contains(uri);
    }

    public void init(FilterConfig filterConfig) throws ServletException
    {
    this.filterConfig = filterConfig;
    redirectURL = filterConfig.getInitParameter("redirectURL");
    sessionKey = filterConfig.getInitParameter("checkSessionKey");

    String notCheckURLListStr = filterConfig.getInitParameter("notCheckURLList");

    if(notCheckURLListStr != null)
    {
    StringTokenizer st = new StringTokenizer(notCheckURLListStr, ";");
    notCheckURLList.clear();
    while(st.hasMoreTokens())
    {
    notCheckURLList.add(st.nextToken());
    }
    }
    }
    }

    四、不缓存页面的过滤器

    package com.test.util;

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



    /**
    * 用于的使 Browser 不缓存页面的过滤器
    */
    public class MyFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
    {
    ((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
    ((HttpServletResponse) response).setHeader("Pragma","no-cache");
    ((HttpServletResponse) response).setDateHeader ("Expires", -1);
    filterChain.doFilter(request, response);
    }

    public void destroy() {}

    public void init(FilterConfig filterConfig) throws ServletException {}
    }

    过滤器的使用需要先了解过滤器的执行过程
    1、执行init()方法初始化过滤器一些参数,FilterConfig获取配置文件

    2、执行doFilter()方法,filterChain.doFilter()向下继续传递

    3、销毁destroy()

    必须配置在web.xml中:

      <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>GBK</param-value>
    </init-param>
    <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    init-param即过滤器初始化中FilterConfig读取的值,可以有多过

    filter-name 必须与 filter-mapping 的 filter-name保持一致,其它的不解释。



     

  • 相关阅读:
    Python RabbitMQ
    对于一些概念的澄清
    Python没有执行__init__
    python中的gil是什么?
    linux命令行快捷键
    关于异步:再次思考和澄清
    greenlet代码解读
    关于协程
    设计模式-重复重复的设计模式
    组合模式-虚有其表的模式
  • 原文地址:https://www.cnblogs.com/fangj/p/filter.html
Copyright © 2011-2022 走看看