spring过滤器总结

来源:互联网 发布:库卡krc 5.6编程软件 编辑:程序博客网 时间:2024/06/05 05:03

1:OpenSessionInViewFilter(org.springframework.orm.hibernate4.support.OpenSessionInViewFilter)

    此过滤器使用在hibernate与spring结合的框架中,如果设置了lazy=true,那么在读取数据的时候,当读取了父数据后,hibernate会自动关闭session,这样,当要使用子数据的时候,系统会抛出lazyinit的错误,这时就需要使用spring提供的openSessionInViewFilter。

OpenSessionInViewFilter主要是保持Session状态知道request将全部页面发送到客户端,这样就可以解决延迟加载带来的问题

另外在struts的结构中,OpenSessionInViewFilter要在struts2的filter前面,否则会出错。

对于OpenSessionInView的配置中,singleSession应该设置为true,其表示一个request只能打开一个session,如果设置为false,session可以被打开多个,这时在update、delete的时候会出现打开多个session的异常。

用了OpenSessionInView的缺点:

但是当设置为true的时候,系统的性能会因为用户的网络状况受到影响,当request在生成页面完成后,session才会被释放,所以如果用户的网络状况比较差,那么连接池中的链接会迟迟不被回收,造成内存增加,系统性能受损。但是如果不用这种方法的话,lazy模式有体现不出它的优点,用?不用?两难啊

它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。

    OpenSessionInView在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。

2:CharacterEncodingFilter(org.springframework.web.filter.CharacterEncodingFilter)

其为了是网页编码乱码问题,其使用方式如下

<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.
filter.CharacterEncodingFilter

 </filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</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>

3.DelegatingFilterProxy(org.springframework.web.filter.DelegatingFilterProxy)

    在SpringSecurity,过滤器类也是定义在xml中的spring bean, 因此可以获得Spring的依赖注入机制和生命周期接口。spring的DelegatingFilterProxy提供了在 web.xml和applicationcontext之间的联系。 
    当使用DelegatingFilterProxy,你会看到像web.xml文件中的这样内容:

<filter><filter-name>myFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>myFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

其使用的例子如下

web应用中,我们经常使用filter机制来确定外部请求的用户是否登录,角色是否合法等。Spring提供了

一个DelegatingFilterProxy机制来完成filter的部分功能。通过例子做一个简单对比。   二者看起来

没有什么太大的区别,在spring中,filter被纳入了bean 管理机制。

1.servlet filter

* LoginFilter .java

package servlet.filter;

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

public class LoginFilter implements Filter {

 protected FilterConfig filterConfig;

 public void init(FilterConfig filterConfig) throws ServletException {
  this.filterConfig = filterConfig;
 }

 public void destroy() {
  this.filterConfig = null;
 }

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws java.io.IOException, ServletException {

  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse res = (HttpServletResponse) response;

  String username = req.getParameter("j_username");
  System.out.println("this is in servlet filter");
 
  chain.doFilter(request, response);
 }

}

*web.xml

<filter>
  <filter-name>simplelogin</filter-name>
  <filter-class>servlet.filter.LoginFilter</filter-class>
  <init-param>
   <param-name>hello</param-name>
   <param-value>hello filter</param-value>
  </init-param>
 </filter>
 <filter-mapping>
          <filter-name>simplelogin</filter-name>
           <url-pattern>/*</url-pattern>
    </filter-mapping>

2. Spring filter

*LoginFilter.java

package filter;

import java.io.IOException;
import java.security.Principal;

import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.logging.*;
public class LoginFilter implements Filter {
 private FilterConfig filterConfig = null;
 Log log = LogFactory.getLog(LoginFilter.class);

 public void doFilter(ServletRequest req, ServletResponse res,
   FilterChain chain) throws IOException, ServletException {
  HttpServletRequest request = (HttpServletRequest) req;
  Principal principal=request.getUserPrincipal();
  HttpServletResponse response=(HttpServletResponse)res;
 
  log.info("filter user name:"+request.getParameter("j_username")+":"+principal.toString

());
  log.info("filter password :"+request.getParameter("j_password"));
  chain.doFilter(req,res);
 }

 public void init(FilterConfig config) throws ServletException {
  this.filterConfig = config;

 }

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

    *
      web.xml

<filter>
  <description>LoginFilter</description>
  <display-name> LoginFilter</display-name>
  <filter-name>LoginFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  <init-param>
   <description>
   </description>
   <param-name>targetBeanName</param-name>
   <param-value>loginFilter</param-value>
  </init-param>
 </filter>

<filter-mapping>
  <filter-name>LoginFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>


*spring context config

<bean id="loginFilter" class="filter.LoginFilter" />


0 0
原创粉丝点击