首页 类库下载 java类库 如何在Java Filter 中注入 Service

如何在Java Filter 中注入 Service

Nov 26, 2016 am 09:10 AM
filter

在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null。如下所示:

public class WeiXinFilter implements Filter{    
   @Autowired
   private UsersService usersService;

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse)response;
     Users users = this.usersService.queryByOpenid(openid);
}

上面的 usersService 会报空指针异常。

解决方法一:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       HttpServletRequest req = (HttpServletRequest)request;
       HttpServletResponse resp = (HttpServletResponse)response;        ServletContext sc = req.getSession().getServletContext();
        XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
        
        if(cxt != null && cxt.getBean("usersService") != null && usersService == null)
            usersService = (UsersService) cxt.getBean("usersService");
        
        Users users = this.usersService.queryByOpenid(openid);

这样就行了。

方法二:

public class WeiXinFilter implements Filter{    
   private UsersService usersService;    
   public void init(FilterConfig fConfig) throws ServletException {
       ServletContext sc = fConfig.getServletContext();
       XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);        
       if(cxt != null && cxt.getBean("usersService") != null && usersService == null)
           usersService = (UsersService) cxt.getBean("usersService");        
   }

相关原理:

1. 如何获取 ServletContext:

1)在javax.servlet.Filter中直接获取 
ServletContext context = config.getServletContext(); 

2)在HttpServlet中直接获取 
this.getServletContext() 

3)在其他方法中,通过HttpServletRequest获得 
request.getSession().getServletContext();

2. WebApplicationContext 与 ServletContext (转自:http://blessht.iteye.com/blog/2121845):

Spring的 ContextLoaderListener是一个实现了ServletContextListener接口的监听器,在启动项目时会触发contextInitialized方法(该方法主要完成ApplicationContext对象的创建),在关闭项目时会触发contextDestroyed方法(该方法会执行ApplicationContext清理操作)。

ConextLoaderListener加载Spring上下文的过程

①启动项目时触发contextInitialized方法,该方法就做一件事:通过父类contextLoader的initWebApplicationContext方法创建Spring上下文对象。

②initWebApplicationContext方法做了三件事:创建 WebApplicationContext;加载对应的Spring文件创建里面的Bean实例;将WebApplicationContext放入 ServletContext(就是Java Web的全局变量)中。

③createWebApplicationContext创建上下文对象,支持用户自定义的上下文对象,但必须继承自ConfigurableWebApplicationContext,而Spring MVC默认使用ConfigurableWebApplicationContext作为ApplicationContext(它仅仅是一个接口)的实 现。

④configureAndRefreshWebApplicationContext方法用 于封装ApplicationContext数据并且初始化所有相关Bean对象。它会从web.xml中读取名为 contextConfigLocation的配置,这就是spring xml数据源设置,然后放到ApplicationContext中,最后调用传说中的refresh方法执行所有Java对象的创建。

⑤完成ApplicationContext创建之后就是将其放入ServletContext中,注意它存储的key值常量。

方法三:

直接使用spring mvc中的HandlerInterceptor或者HandlerInterceptorAdapter 来替换Filter:

public class WeiXinInterceptor implements HandlerInterceptor {
   @Autowired    private UsersService usersService;  
   
   @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        // TODO Auto-generated method stub
       return false;
   }

   @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)            throws Exception {        // TODO Auto-generated method stub        
   }

   @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        // TODO Auto-generated method stub        
   }
}

配置拦截路径:

   
       
           
           
       
   
   

 

Filter 中注入 Service 的示例:

public class WeiXinFilter implements Filter{    
   private UsersService usersService;    
   public void init(FilterConfig fConfig) throws ServletException {}    public WeiXinFilter() {}    public void destroy() {}    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       HttpServletRequest req = (HttpServletRequest)request;
       HttpServletResponse resp = (HttpServletResponse)response;
       
       String userAgent = req.getHeader("user-agent");        if(userAgent != null && userAgent.toLowerCase().indexOf("micromessenger") != -1){    // 微信浏览器
           String servletPath = req.getServletPath();
           String requestURL = req.getRequestURL().toString();
           String queryString = req.getQueryString();
           if(queryString != null){                if(requestURL.indexOf("mtzs.html") !=-1 && queryString.indexOf("LLFlag")!=-1){
                   req.getSession().setAttribute("LLFlag", "1");
                   chain.doFilter(request, response);                    return;
               }
           }
           
           String openidDES = CookieUtil.getValueByName("openid", req);
           String openid = null;            if(StringUtils.isNotBlank(openidDES)){                try {
                   openid = DesUtil.decrypt(openidDES, "rxxxxxxxxxde");    // 解密获得openid
               } catch (Exception e) {
                   e.printStackTrace();
               }    
           }
           // ... ...
           String[] pathArray = {"/weixin/enterAppFromWeiXin.json", "/weixin/getWeiXinUserInfo.json",                                    "/weixin/getAccessTokenAndOpenid.json", "/sendRegCode.json", "/register.json",
                                   "/login.json", "/logon.json", "/dump.json", "/queryInfo.json"};
           List pathList = Arrays.asList(pathArray);            
           String loginSuccessUrl = req.getParameter("path");
           String fullLoginSuccessUrl = "http://www.axxxxxxx.cn/pc/";            if(requestURL.indexOf("weixin_gate.html") != -1){
               req.getSession().setAttribute("loginSuccessUrl", loginSuccessUrl);
          // ... ...
           }
            ServletContext sc = req.getSession().getServletContext();
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
        
            if(cxt != null && cxt.getBean("usersService") != null && usersService == null)
               usersService = (UsersService) cxt.getBean("usersService");
        
            Users users = this.usersService.queryByOpenid(openid);
           // ... ...            if(pathList.contains(servletPath)){    // pathList 中的访问路径直接 pass
               chain.doFilter(request, response);                return;
           }else{                if(req.getSession().getAttribute(CommonConstants.SESSION_KEY_USER) == null){ // 未登录
                   String llFlag = (String) req.getSession().getAttribute("LLFlag");                    if(llFlag != null && llFlag.equals("1")){    // 处理游客浏览                        chain.doFilter(request, response);                        return;
                   }                  
                   // ... ...// 3. 从腾讯服务器去获得微信的 openid ,
                   req.getRequestDispatcher("/weixin_gate.html").forward(request, response);                    return;
               }else{    // 已经登录                    // 4. 已经登录时的处理                    
                   chain.doFilter(request, response);
                   return;
               }
           }            
       }else{    // 非微信浏览器            chain.doFilter(request, response);
       }
   }}


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

解决'[Vue warn]: Failed to resolve filter”错误的方法 解决'[Vue warn]: Failed to resolve filter”错误的方法 Aug 19, 2023 pm 03:33 PM

解决“[Vuewarn]:Failedtoresolvefilter”错误的方法在使用Vue进行开发的过程中,我们有时候会遇到一个错误提示:“[Vuewarn]:Failedtoresolvefilter”。这个错误提示通常出现在我们在模板中使用了一个未定义的过滤器的情况下。本文将介绍如何解决这个错误并给出相应的代码示例。当我们在Vue的

怎么在SpringBoot2中整合Filter 怎么在SpringBoot2中整合Filter May 16, 2023 pm 02:46 PM

首先定义一个统一访问URL拦截的Filter。代码如下:publicclassUrlFilterimplementsFilter{privateLoggerlog=LoggerFactory.getLogger(UrlFilter.class);@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{H

Springboot中filter的原理与注册方法是什么 Springboot中filter的原理与注册方法是什么 May 11, 2023 pm 08:28 PM

1、filter先看下web服务器的filter所处的位置。filter是一个前后连接的链,前面处理完成之后传递给下一个filter处理。1.1filter的接口定义publicinterfaceFilter{//初始化方法,整个生命周期中只执行一次。//在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。//参数FilterConfig用于获取初始化参数publicvoidinit(FilterConfigfilterConfig)throwsServletException;//

CSS 模糊属性详解:filter 和 backdrop-filter CSS 模糊属性详解:filter 和 backdrop-filter Oct 20, 2023 pm 04:48 PM

CSS模糊属性详解:filter和backdrop-filter导语:在设计网页时,我们常常需要一些特效来增加页面的视觉吸引力。而模糊效果是其中一种常见的特效之一。CSS提供了两种模糊属性:filter和backdrop-filter,它们分别用于对元素内容以及背景内容进行模糊处理。本文将详细介绍这两个属性,并提供一些具体的代码示例。一、filt

Filter在java中如何过滤 Filter在java中如何过滤 Apr 18, 2023 pm 11:04 PM

说明1、如果Lambda参数生成true值,则filter(能够生成boolean结果的Lambda)将生成元素;2、生成false时,就不再使用此元素。实例创建一个List集合:ListstringCollection=newArrayList();stringCollection.add("ddd2");stringCollection.add("aaa2");stringCollection.add("bbb1");stringC

CSS 视觉属性解析:box-shadow,text-shadow 和 filter CSS 视觉属性解析:box-shadow,text-shadow 和 filter Oct 20, 2023 pm 12:51 PM

CSS视觉属性解析:box-shadow,text-shadow和filter引言:在网页设计和开发中,使用CSS可以为元素添加各种视觉效果。本文将重点介绍CSS中的box-shadow,text-shadow和filter这三个重要属性,包括其使用方法和效果展示。下面我们分别详细解析这三个属性。一、box-shadow(盒子阴影)box-shado

Java 8中的Optional类:如何使用filter()方法过滤可能为空的值 Java 8中的Optional类:如何使用filter()方法过滤可能为空的值 Aug 01, 2023 pm 05:27 PM

Java8中的Optional类:如何使用filter()方法过滤可能为空的值在Java8中,Optional类是一个非常有用的工具,它允许我们更好地处理可能为空的值,避免了NullPointerException的发生。Optional类提供了许多方法来操作潜在的空值,其中一个重要的方法是filter()。filter()方法的作用是,如果Option

Vue中如何利用filter对数据进行格式化和处理 Vue中如何利用filter对数据进行格式化和处理 Oct 15, 2023 pm 03:50 PM

Vue中利用filter对数据进行格式化和处理在Vue中,我们可以通过使用filter来对数据进行格式化和处理。Filter是一种可以在模板中直接调用的函数,它可以对要显示的数据进行处理并返回处理后的结果。在本文中,我们将介绍如何使用filter来格式化和处理数据,并提供具体的代码示例。注册filter在Vue实例中,我们需要先注册一个filter,以便在模

See all articles