javaee论坛

普通会员

225648

帖子

355

回复

369

积分

楼主
发表于 2017-07-01 10:19:05 | 查看: 96 | 回复: 0

转载自:http://listenup.iteye.com/blog/1559553


1.Filter过滤器只过滤jsp文件不过滤action请求解决方案


解决办法:在web.xml中将filter的配置放在struts2配置的前面。



2.拦截器与Filter的区别 

Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:


使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。


规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。


使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。


深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。


实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。 

filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。  

JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序来执行的。 

所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。 

当Filter被调用,并且进入了Struts2的DispatcherFilter中后,Struts2会按照在Action中配置的Interceptor Stack中的Interceptor的顺序,来调用Interceptor。 

3.servlet、filter、interceptor的执行顺序

< code_snippet_id="1945494" snippet_file_name="blog_20161024_1_7145540" name="code" class="java">@Override public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws IOException, ServletException { System.out.println("in filter 1."); filterchain.doFilter(servletrequest, servletresponse); System.out.println("outing filter 1"); }

   interceptor代码:

< code_snippet_id="1945494" snippet_file_name="blog_20161024_2_3099359" name="code" class="java">public String intercept(ActionInvocation actioninvocation) throws Exception { System.out.println("in logininterceptor"); String result=actioninvocation.invoke(); System.out.println("outing logininterceptor"); return result; }

    action代码:

< code_snippet_id="1945494" snippet_file_name="blog_20161024_3_7625500" name="code" class="java"> @Override public String execute() throws Exception { System.out.println("in loginaciton"); ActionContext context=ActionContext.getContext(); Map<String, Object> session=context.getSession(); session.put("userName", userName); /* HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); session.putValue("userName", userName);*/ System.out.println("outing loginaciton"); return SUCCESS; }

   jsp代码:

< code_snippet_id="1945494" snippet_file_name="blog_20161024_4_5291186" name="code" class="html"><script type="text/javascript"> function submitForm(){ document.getElementById("form1").submit(); } </script> </head> <body> This is Login page. <br> <form action="<%=path %>/login2.action" method="post" id="form1" name="form1"> UserName:<input type="text" id="userName" name="userName"/><input type="button" value="submit" onclick="submitForm()" id="submit1" /> </form> </body>

   struts.xml

< code_snippet_id="1945494" snippet_file_name="blog_20161024_5_9609584" name="code" class="html"><struts> <package name="default" extends="struts-default" namespace="/"> <interceptors> <interceptor name="MyInterceptor" class="Login.LoginInterceptor"></interceptor> <interceptor-stack name="myInterceptorStack"> <interceptor-ref name="MyInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <action name="login2" class="Login.LoginAction"> <result name="success"> /Login/success.jsp </result> <interceptor-ref name="myInterceptorStack"></interceptor-ref> </action> </package> </struts>

console:

< code_snippet_id="1945494" snippet_file_name="blog_20161024_6_6087574" name="code" class="html">in filter 1.in logininterceptorin loginacitonouting loginacitonouting logininterceptorouting filter 1

3.servlet、filter的执行顺序

servlet代码:

< code_snippet_id="1945494" snippet_file_name="blog_20161024_7_8213362" name="code" class="java">public void init() throws ServletException { System.out.println("servlet初始化"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("in servlet"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println("<br>"); String x = request.getParameter("x"); String y = request.getParameter("y"); out.println("x="+x); out.println("<br>"); out.println("y="+y); out.println("<br>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); System.out.println("outing servlet"); } public void destroy(){ System.out.println("servlet销毁"); super.destroy(); }

 console:

< code_snippet_id="1945494" snippet_file_name="blog_20161024_8_1103301" name="code" class="html">servlet初始化in filter 1.in servletbefore HttpServletRequestafter HttpServletRequestouting servletouting filter 1当tomcat容器停止的时候,输出:servlet销毁


您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017