Heim  >  Artikel  >  类库下载  >  So injizieren Sie einen Dienst in einen Java-Filter

So injizieren Sie einen Dienst in einen Java-Filter

巴扎黑
巴扎黑Original
2016-11-26 09:10:381817Durchsuche

Ich bin im Projekt auf ein Problem gestoßen. Das Einfügen eines Dienstes in den Filter ist fehlgeschlagen und der eingefügte Dienst war immer null. Wie unten gezeigt:

öffentliche Klasse WeiXinFilter implementiert Filter{
@Autowired
private UsersService usersService;

public void doFilter(ServletRequest request, ServletResponse Antwort, FilterChain-Kette) löst IOException, ServletException aus {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
Benutzer Benutzer = this.usersService.queryBy Openid(openid);
}

Der obige Benutzerdienst meldet eine Nullzeigerausnahme.

Lösung 1:

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);                                                                != null && cxt.getBean ("usersService") != null && UsersService == null)
UsersService = (UsersService) cxt.getBean("UsersService");

Users Users = this.usersService .queryByOpenid(openid);


Das ist es.

Methode 2:

öffentliche Klasse WeiXinFilter implementiert Filter{

private UsersService usersService;

public void init(FilterConfig fConfig) löst ServletException {
aus ServletContext sc = fConfig.getServletContext();
); Holen Sie sich ServletContext:

1) Holen Sie sich
ServletContext direkt in javax.servlet.Filter context = config.getServletContext();

2) Holen Sie sich
dies direkt in HttpServlet. getServletContext()

3) In anderen Methoden erhalten Sie über HttpServletRequest

request.getSession().getServletContext();

2. blessht.iteye.com/blog/2121845):

Der ContextLoaderListener von Spring ist ein Listener, der die ServletContextListener-Schnittstelle implementiert. Beim Starten des Projekts wird die contextInitialized-Methode ausgelöst (diese Methode schließt hauptsächlich die Erstellung des ApplicationContext-Objekts ab). . Die contextDestroyed-Methode wird ausgelöst, wenn das Projekt geschlossen wird (diese Methode führt den ApplicationContext-Bereinigungsvorgang aus).


Der Prozess des Ladens des Spring-Kontexts durch ConextLoaderListener

①Die contextInitialized-Methode wird beim Starten des Projekts ausgelöst. Diese Methode führt eine Aufgabe aus: Sie erstellt ein Spring-Kontextobjekt über die initWebApplicationContext-Methode der übergeordneten Klasse contextLoader .

②Die initWebApplicationContext-Methode führt drei Dinge aus: Sie erstellt einen WebApplicationContext, lädt die entsprechende Spring-Datei, um die Bean-Instanz zu erstellen, und fügt den WebApplicationContext in den ServletContext ein (die globale Variable von Java Web).

③createWebApplicationContext erstellt ein Kontextobjekt und unterstützt benutzerdefinierte Kontextobjekte, sie müssen jedoch von ConfigurableWebApplicationContext erben, und Spring MVC verwendet standardmäßig ConfigurableWebApplicationContext als Implementierung von ApplicationContext (es ist nur eine Schnittstelle).

④configureAndRefreshWebApplicationContext-Methode wird verwendet, um ApplicationContext-Daten zu kapseln und alle zugehörigen Bean-Objekte zu initialisieren. Es liest die Konfiguration mit dem Namen contextConfigLocation aus web.xml, der Spring-XML-Datenquelleneinstellung, und fügt sie dann in ApplicationContext ein und ruft schließlich die legendäre Aktualisierungsmethode auf, um die Erstellung aller Java-Objekte durchzuführen.

⑤Nach Abschluss der Erstellung des ApplicationContext fügen Sie ihn in den ServletContext ein und achten Sie auf die darin gespeicherte Schlüsselwertkonstante.

Methode 3:

Verwenden Sie HandlerInterceptor oder HandlerInterceptorAdapter direkt in Spring MVC, um Filter zu ersetzen:

öffentliche Klasse WeiXinInterceptor implementiert HandlerInterceptor {
   @Autowired    private UsersService usersService;  
   
   @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse Response, Object handler) throws Exception {        // TODO Automatisch generierter Methoden-Stub
       return false;
  }

   @Override public void postHandle(HttpServletRequest request, HttpServletResponse Response, Object handler, ModelAndView modelAndView)            wirft eine Ausnahme aus {        // TODO Automatisch generierter Methoden-Stub        
   }

   @Override    public void ion(HttpServletRequest-Anfrage, HttpServletResponse-Antwort, Object handler, Exception ex) throws Exception {        // TODO Automatisch generierter Methoden-Stub        
   ;mvc:interceptors>
       
           

           

           

   

 

Filter 中注入 Service 的示例:


öffentliche Klasse WeiXinFilter implementiert 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;
               }
           openid = null;            if(StringUtils.isNotBlank(openidDES)){                try {
                   openid = DesUtil.decrypt(openidDES, "rxxxxxxxxxde");    // 解密获得openid
               } Catch (Ausnahme e) {
                 e.printStackTrace();
               }    
          }
           // ... ...
           String[] pathArray = {"/weixin/enterAppFromWeiXin.json", "/weixin/getWeiXinUserInfo.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 ("wixin_gate.html")! }            ServletContext sc = req.getSession().getServletContext(); 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){ // Nicht angemeldet
                  String llFlag = (String ) req .GetSession (). GetAttribute ("llflag"); 🎜> }else{ // Bereits angemeldet                                                                                                                                zurück;
                                                                                   {

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn