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

来源:互联网 发布:javascript classname 编辑:程序博客网 时间:2024/05/22 15:15

借鉴了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
原创粉丝点击