借鉴了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博主的分享~