struts2和servlet共存之自定义Filter过滤

借鉴了http://blog.csdn.net/huilangeliuxin/article/details/10495403这篇文章

上面3中不做介绍了,主要讲一下自定义Filter实现过滤的这个办法,经过了自己的调整做了下整理:

项目工程如图:

1.首先建一个类做过滤器

package filters;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/**
 * 这是一个过滤servlet的filter;就是拦截servlet的处理请求,自行转向处理,而不是由struts处理。
 * 此方法需要在web.xml中配置:
    <filter>
        <filter-name>redisp</filter-name>
        <filter-class>filters.FilterServlet</filter-class>
        <init-param>
            <param-name>includeServlets</param-name>
            <param-value>myservlet1,myservlet2</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>redisp</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    并且此过滤器必须在struts2的过滤器上面。
 * @author Administrator
 *
 */
public class FilterServlet implements Filter {

	public void destroy() {
    }
    
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;        
        String target = request.getRequestURI();
        
        //因为<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">target </span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">实际上访问地址是带工程名的,如:/web1/login.action,所以要取出后面的</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">内容l</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">ogin.action</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">进行判断</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
</span>        String[] mytarget = target.split("/");
        target = mytarget[mytarget.length-1];
<span style="white-space:pre">	</span>//判断取出的url是否在<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">includes过滤list中</span>
        if (this.includes.contains(target)) {
            // target取出的值则直接是verifyLogin,在web.xml中filter中的<param-value>配置即可。
            // if判断请求uri最后的那部分是否包含在配置文件中,如果包含,则处理
            RequestDispatcher rdsp = request.getRequestDispatcher(target);
            rdsp.forward(req, resp);
        } else {
            chain.doFilter(req, resp);
        }
    }

    private ArrayList<String> includes = new ArrayList<String>();

    public void init(FilterConfig config) throws ServletException {
<span style="white-space:pre">	</span>//这里在初始函数中获取到了web.xml中name为includeServlets的param-value值,多个的话用","逗号分割
<span style="white-space:pre">	</span>//然后存入<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">ArrayList<String> </span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">includes 中</span>
        this.includes.addAll(Arrays.asList(config.getInitParameter("includeServlets").split(",")));
        System.out.println("生成servlet过滤器完毕!");
    }
}
2.在web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<display-name></display-name>   
   	
   <filter>
        <filter-name>redisp</filter-name>
        <filter-class>filters.FilterServlet</filter-class>
        <init-param>
            <param-name>includeServlets</param-name>
<span style="white-space:pre">	</span><!--<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">这里是servlet的servlet-name多个的话用 逗号 分隔</span>-->
            <param-value>myservlet1,myservlet2</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>redisp</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

<span style="white-space:pre">	</span><servlet>
<span style="white-space:pre">		</span><servlet-name><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">myservlet1</span></servlet-name>
<span style="white-space:pre">		</span><servlet-class>SSO.VerifyLogin</servlet-class>
<span style="white-space:pre">	</span></servlet>
<span style="white-space:pre">	</span><servlet-mapping>
<span style="white-space:pre">		</span><servlet-name>myservlet1</servlet-name>
<span style="white-space:pre">		</span><url-pattern>/verifyLogin</url-pattern>
<span style="white-space:pre">	</span></servlet-mapping>
  
  <span style="white-space:pre">	</span><servlet>
<span style="white-space:pre">		</span><servlet-name>myservlet2</servlet-name>
<span style="white-space:pre">		</span><servlet-class>SSO.ExitForLogin</servlet-class>
<span style="white-space:pre">	</span></servlet>
<span style="white-space:pre">	</span><servlet-mapping>
<span style="white-space:pre">		</span><servlet-name>myservlet2</servlet-name>
<span style="white-space:pre">		</span><url-pattern>/exitforlogin</url-pattern>
<span style="white-space:pre">	</span></servlet-mapping>
    
    
    <filter>
    	<filter-name>struts2</filter-name>
    	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  	</filter>
  	<filter-mapping>
    	<filter-name>struts2</filter-name>
    	<url-pattern>*</url-pattern>
  	</filter-mapping>
    
</web-app>
注意1:redisp这个filter必须放在struts2的上面,因为web按顺序执行的过滤器嘛~

注意2:在配置servlet的的访问路径也就是url-pattern的时候,就不要带/了,如:servlet/myservlet1,因为会被拦截器我的方法分割开了只取出最后一个。

不过非要带也不是不可以,你取出url的后俩位然后拼在一起也可以。。。

注意3:jsp页面的访问方法如:<a href="myservlet1">退出LogOut</a>就可以了,因为通过拦截器辨别出了servlet和struts2的链接。

好了,就到这里了哈~再次感谢http://blog.csdn.net/huilangeliuxin/article/details/10495403博主的分享~




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值